入门
基础
- 动态路由匹配 Dynamic Route Matching
- 路由的匹配语法 Routes' Matching Syntax
- 嵌套路由 Nested Routes
- 编程式导航 Programmatic Navigation
- 命名路由 Named Routes
- 命名视图 Named Views
- 重定向和别名 Redirect and Alias
- 路由组件传参 Passing Props to Route Components
- 不同的历史记录模式 Different History modes
进阶
- 导航守卫 Navigation guards
- 导航故障 Navigation Failures
- 路由元信息 Route Meta Fields
- 数据获取 Data Fetching
- 组合式 API Composition API
- 过渡动效 Transitions
- 滚动行为 Scroll Behavior
- 路由懒加载 Lazy Loading Routes
- 类型化路由 Typed Routes
- 扩展路由链接 Extending RouterLink
- 动态路由 Dynamic Routing
迁移
API 手册
接口
- 历史记录状态 HistoryState
- 导航故障 NavigationFailure
- 导航卫士 NavigationGuard
- 导航卫士下一页 NavigationGuardNext
- 导航卫士用这个 NavigationGuardWithThis
- 导航后 NavigationHookAfter
- 路由位置 RouteLocation
- 路由位置匹配 RouteLocationMatched
- 路由位置规范化 RouteLocationNormalized
- 路线位置规范加载 RouteLocationNormalizedLoaded
- 路由位置选项 RouteLocationOptions
- 路线梅塔 RouteMeta
- 路由记录规范化 RouteRecordNormalized
- 路由器 Router
- 路由器历史 RouterHistory
- 路由器链接配置文件 RouterLinkProps
- 路由器选项 RouterOptions
- 路由器滚动行为 RouterScrollBehavior
- 路由器视图Props RouterViewProps
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
数据获取 Data Fetching
Vue-Router 数据获取使用方法
有时候,进入某个路由后,需要从服务器获取数据。例如,在渲染用户信息时,你需要从服务器获取用户的数据。我们可以通过两种方式来实现:
- 导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。
- 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。
从技术角度讲,两种方式都不错 —— 就看你想要的用户体验是哪种。
导航完成后获取数据
当你使用这种方式时,我们会马上导航和渲染组件,然后在组件的 created 钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。
假设我们有一个 Post
组件,需要基于 $route.params.id
获取文章数据:
<template>
<div class="post">
<div v-if="loading" class="loading">Loading...</div>
<div v-if="error" class="error">{{ error }}</div>
<div v-if="post" class="content">
<h2>{{ post.title }}</h2>
<p>{{ post.body }}</p>
</div>
</div>
</template>
jsexport default {
data() {
return {
loading: false,
post: null,
error: null,
}
},
created() {
// watch 路由的参数,以便再次获取数据
this.$watch(
() => this.$route.params,
() => {
this.fetchData()
},
// 组件创建完后获取数据,
// 此时 data 已经被 observed 了
{ immediate: true }
)
},
methods: {
fetchData() {
this.error = this.post = null
this.loading = true
// replace `getPost` with your data fetching util / API wrapper
getPost(this.$route.params.id, (err, post) => {
this.loading = false
if (err) {
this.error = err.toString()
} else {
this.post = post
}
})
},
},
}
在导航完成前获取数据
通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的 beforeRouteEnter
守卫中获取数据,当数据获取成功后只调用 next
方法:
export default {
data() {
return {
post: null,
error: null,
}
},
beforeRouteEnter(to, from, next) {
getPost(to.params.id, (err, post) => {
next(vm => vm.setData(err, post))
})
},
// 路由改变前,组件就已经渲染完了
// 逻辑稍稍不同
async beforeRouteUpdate(to, from) {
this.post = null
try {
this.post = await getPost(to.params.id)
} catch (error) {
this.error = error.toString()
}
},
}
在为后面的视图获取数据时,用户会停留在当前的界面,因此建议在数据获取期间,显示一些进度条或者别的指示。如果数据获取失败,同样有必要展示一些全局的错误提醒。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论