vue-router(路由)的使用
- 属性1 path表示监听哪个路由链接地址
- 属性2 component,表示如果路由是前面匹配到的path,则展示component属性对应的组件,component属性值必须是一个组件模板对象,不能是组件的引用名称
- 属性3 name,路由名称
一、vue-router
用于渲染匹配到的组件
<router-view></router-view>
还可以配合<keep-alive>
使用,keep-alive可以缓存数据,这样不至于重新渲染路由组件的时候,之前那个路由组件的数据被清除了。比如对当前的路由组件a进行了一些DOM操作之后,点击进入另一个路由组件b,再回到路由组件a的时候之前的DOM操作还保存在,如果不加keep-alive再回到路由组件a时,之前的DOM操作就没有了,得重新进行。如果你的应用里有一个购物车组件,就需要用到keep-alive。
<keep-alive> <router-view></router-view> </keep-alive>
传参:
常见的路由参数传递有两种:1、params 动态路由参数。2、query 查询参数。
在router路由配置文件里设置:
{path:'/login/:id',component:login}
{path:'/params/:newsId/:userName,component:login}//多个参数
在组件中设置:
<p>用户名:{{ $route.params.userName}}</p>
<h2>登录----{{$route.query.id}}
</h2>
冒号 :后面是路径参数,当匹配到一个路由时,参数值会被设置到this.$route.params,可以在每个组件内使用。你可以在一个路由中设置多段『路径参数』,对应的值都会设置到 $route.params 中。
二、router-link
它默认会被渲染成一个带有链接的a标签,通过to属性指定链接地址。被选中的router-link将自动添加一个class属性值.router-link-active。
<router-link to="/">[text]</router-link>
- to:导航路径, to="/" 导航到默认首页
- [text] :就是我们要显示给用户的导航名称
传参:
<router-link :to = "{name:'login',params:{'id':1}}">登录params</router-link> <router-link :to = "{path:'register',query:{'userId':2}}">注册query</router-link>
<router-link to="/login?id=10">登录</router-link>
组件中获取参数:
<template>
<div>
用户: {{ $route.params.id }}
</div>
</template>
params传参和query传参有什么区别?
刚query要用path来引入,params要用name来引入,接收参数都是类似的,分别是this.route.query.name和this.route.params.name。
query在浏览器地址栏中显示参数,params则不显示。
三、路由redirect重定向,设置默认组件
{path:'/',redirect:'login'},
四、复用组件时,监听路由参数的变化
当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用
watch: {
'$route' (to, from) {
// 对路由变化作出响应...
}
}
(2).beforeRouteUpdate 导航守卫
如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1
-> /users/2
),你需要使用 beforeRouteUpdate
来响应这个变化 (比如抓取用户信息)。
五、多视图(命名视图)
https://router.vuejs.org/zh/guide/essentials/named-views.html
sidebar
(侧导航) 和 main
(主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view
没有设置名字,那么默认为 default
。app.vue
<template>
<div id="app">
<router-view class="top" name="top"/>
<router-view class="left" name="left"/>
<router-view class="main"/>
</div>
</template>
路由 index.js Vue.use(Router) // 导出一个默认的组件 export default new Router({ routes: [ { path: '/', components: { default: Main, top: Top, left: Left } }] })
然后分别创建3个组件: main.vue(内容视图
)、top.vue(顶部导航视图
)、left.vue(菜单视图
)
this.$router.push()跳转到不同的url,这个方法会向history栈添加一个记录,点击后退会返回到上一个页面。
this.$router.replace()跳转到指定url路径,但是history栈不会有记录,点击返回会跳转到上上个页面
六、router的beforeEach与afterEach钩子函数
在路由跳转的时候,我们需要一些权限判断或者其他操作。这个时候就需要使用路由的钩子函数。
1、
/*在跳转之前执行*/ Vue.beforeEach(function(to,form,next){})
2、
/*在跳转之后判断*/ Vue.afterEach(function(to,form))
3、
全局钩子函数
router.beforeEach((to, from, next) => { let token = router.app.$storage.fetch("token"); let needAuth = to.matched.some(item => item.meta.login); if(!token && needAuth) return next({path: "/login"}); next(); });
七、router-view组件间传值
1、router-view 子组件传父组件
父组件: <template> <div id="app"> <router-view @getUser="getUserInfo"/> </div> </template> <script> export default { methods:{ getUserInfo(val){ console.log(val+"-->父组件");// 输出:我是home组-->父组件
} } } </script>
子组件: <template> <div class="home"> <input type="button" @click="test" value="登录"> </div> </template> <script> export default { name: "home", components: { }, methods: { test() { this.$emit("getUser", "我是home组件"); } } }; </script>
2、router-view 父组件传子组件
父组件: <template> <div id="app"> <router-view :userSubValue="userData" /> </div> </template> <script> export default { data(){ return { userData:" 父组件数据"} } }; </script>
子组件: <template> <div class="home">{{user}}</div> </template> <script> export default { name: "home", data() { return { user: "" }; }, props: ["userSubValue"], created() { this.getUserValue(); }, methods: { getUserValue() { this.user=this.userSubValue; } } }; </script>