Vue Router
参考来自Vue Router 官网
起步
<router-link to="/foo">Go to Foo</router-link>
this.$router.push("/");
动态路由匹配
const router = new VueRouter({
routes: [
{ path: "/user/:id", component: User },
],
});
$route.params.id;
嵌套路由
const router = new VueRouter({
routes: [
{
path: "/user/:id",
component: User,
children: [
{
path: "profile",
component: UserProfile,
},
{
path: "posts",
component: UserPosts,
},
],
},
],
});
编程式的导航
声明式 | 编程式 |
---|
<router-link :to="..."> | router.push(...) |
router.push("home");
router.push({ path: "home" });
router.push({ name: "user", params: { userId: "123" } });
router.push({ path: "register", query: { plan: "private" } });
const userId = "123";
router.push({ name: "user", params: { userId } });
router.push({ path: `/user/${userId}` });
router.push({ path: "/user", params: { userId } });
router.go(1);
router.go(-1);
router.go(3);
router.go(-100);
router.go(100);
命名路由
const router = new VueRouter({
routes: [
{
path: "/user/:userId",
name: "user",
component: User,
},
],
});
router.push({ name: "user", params: { userId: 123 } });
命名视图
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
const router = new VueRouter({
routes: [
{
path: "/",
components: {
default: Foo,
a: Bar,
b: Baz,
},
},
],
});
重定向和别名
const router = new VueRouter({
routes: [{ path: "/a", redirect: "/b" }],
});
const router = new VueRouter({
routes: [{ path: "/a", redirect: { name: "foo" } }],
});
const router = new VueRouter({
routes: [
{
path: "/a",
redirect: (to) => {
},
},
],
});
const router = new VueRouter({
routes: [{ path: "/a", component: A, alias: "/b" }],
});
路由组件传参
const User = {
props: ["id"],
template: "<div>User {{ id }}</div>",
};
const router = new VueRouter({
routes: [
{ path: "/user/:id", component: User, props: true },
{
path: "/user/:id",
components: { default: User, sidebar: Sidebar },
props: { default: true, sidebar: false },
},
],
});
HTML5 History 模式
const router = new VueRouter({
mode: 'history',
routes: [...]
})
进阶
导航守卫
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
})
router.afterEach((to, from) => {
})
const Foo = {
template: `...`,
beforeRouteEnter(to, from, next) {
},
beforeRouteUpdate(to, from, next) {
},
beforeRouteLeave(to, from, next) {
}
}
完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用 beforeRouteLeave 守卫。
- 调用全局的 beforeEach 守卫。
- 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
- 在路由配置里调用 beforeEnter。
- 解析异步路由组件。
- 在被激活的组件里调用 beforeRouteEnter。
- 调用全局的 beforeResolve 守卫 (2.5+)。
- 导航被确认。
- 调用全局的 afterEach 钩子。
- 触发 DOM 更新。
- 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调-函数的参数传入。
路由元信息
const router = new VueRouter({
routes: [
{
path: "/foo",
component: Foo,
children: [
{
path: "bar",
component: Bar,
meta: { requiresAuth: true },
},
],
},
],
});
数据获取
export default {
data() {
return {
loading: false,
post: null,
error: null,
};
},
created() {
this.fetchData();
},
watch: {
$route: "fetchData",
},
methods: {
fetchData() {
this.error = this.post = null;
this.loading = true;
getPost(this.$route.params.id, (err, post) => {
this.loading = false;
if (err) {
this.error = err.toString();
} else {
this.post = post;
}
});
},
},
};
export default {
data () {
return {
post: null,
error: null
}
},
beforeRouteEnter (to, from, next) {
getPost(to.params.id, (err, post) => {
next(vm => vm.setData(err, post))
})
},
beforeRouteUpdate (to, from, next) {
this.post = null
getPost(to.params.id, (err, post) => {
this.setData(err, post)
next()
})
},
methods: {
setData (err, post) {
if (err) {
this.error = err.toString()
} else {
this.post = post
}
}
}
}
|