App.vue下的
在按钮的方法里激活,跳转到router.js里面所写的组件。(path、name、component)
this.$router.push("/foo")
关于弹出消息:
this.$message.success()
关于:
可以使组件实例在它们第一次被创建的时候就缓存下来。之后再跳转页面不会再进行生命周期。
<div>
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
在index.js里const routes 和const router。
动态路由匹配
对地址栏做出改变,界面做出同步改变
“动态” 就是用冒号:
进行绑定。
{
path: '/foo/:name',
component: test,
}
上面的:name
并不代表可以随意取,需要在一些组件里指明内容。比如下面的内容:
<template>
<Tabs v-model="name" @on-click='li(name)'>
<!--v-model绑定了value,这里的值决定了下面哪个标签会被激活-->
<TabPane label="1" name="name1">
<contentBar1></contentBar1>
</TabPane>
<TabPane label="2" name="name2">
<contentBar1></contentBar1>
</TabPane>
<TabPane label="3" name="name3">
<contentBar1></contentBar1>
</TabPane>
</Tabs>
</template>
编程式导航
对界面进行点击,传递到地址栏里去
点击产生事件,事件发生了去跳转。
在 Vue 实例内部可以通过 $router
访问路由实例。因此我们可以调用 this.$router.push
。
- 声明式:
<router-link :to="..."
- 编程式:
router.push(...)
methods: {
l1(name)
{
this.$router.push("/foo"+name)
}
}
如果提供了push
,那么params
将会被忽略:
const userId = '123'
router.push('home') // → /home 字符串
router.push({ name: 'user', params: { userId }}) // 对象 → /user/123
router.push({ path: `/user/${userId}` }) // → /user/123
router.push({ path: '/user', params: { userId }}) // → /user params不生效
// 若带查询参数query,则变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
注意,如果目的地和当前路由相同,只有参数发生了改变 (比如从 /users/1
-> /users/2
),则需要使用 beforeRouteUpdate
来响应这个变化 (比如抓取用户信息)。
组件复用
每次使用组件时不要再去生命周期里跑一趟了,对组件进行监听。
watch: {
$route(to, from) {
// 对路由变化进行响应
this.name = this.$route.params.name;
}
}
使用生命周期的话,就会重新刷新一遍页面了。
嵌套路由
下面多了一个children
属性。children
是一个对象数组(中括号里带大括号)。
路由重定向
加入了redirect,输入空的时候自动定向到所需要的网站
{
path: '*',
name: 'any',
redirect: '/login'
}
路由参数传递
:id
是一种传递方式。另一种是props
给出对象,里面放函数等等。(父传子)
全局路由守卫
不能不登录就进入主页面。【全局前置守卫】
const router = new Router({
router.beforeEach((to, from, next) => {
if (to.path == '/index'){
if (auth.islogin()){
next()
} else {
next('/login')
}
} else{
next()
}
})
})
局部路由守卫
组件内的局部守卫放在某个组件里面。
beforeRouteEnter (to, from, next){
// 不能获取组件实例`this`,因为守卫执行前组件实例还没被创建
if (true){
next()
};
},
mounted(){
// 在mounted()里写表示组件创建完毕后
}
数据获取
- 导航完成之后获取,即先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。
- 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。
导航完成后获取
马上导航和渲染组件,然后在组件的 created()
钩子中获取数据。在数据获取期间展示一个 loading 状态。
而一旦路由发生变化,则在watch
中再一次执行方法。
<template>
<div class="post">
<div v-if="loading" class="loading">
Loading...
</div>
<div v-if="post" class="content">
<h2>{{ post.title }}</h2>
<p>{{ post.body }}</p>
<p>已加载数据</p>
</div>
</div>
</template>
<script>
export default {
data () {
return {
loading: false,
post: null,
}
},
created () {
// 组件创建完后获取数据,
// 此时 data 已经被 observed 了
this.fetchData()
},
watch: {
// 如果路由有变化,会再次执行该方法
'$route': 'fetchData'
},
methods: {
fetchData () {
setTimeout(() => {
this.loading = false;
this.post = true;
}, 2000);
}
}
}
</script>