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/123router.push({ path: `/user/${userId}` }) // → /user/123router.push({ path: '/user', params: { userId }}) // → /user params不生效// 若带查询参数query,则变成 /register?plan=privaterouter.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>
