Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。
Vue.js 路由使用前需要载入vue-router库
1、 直接下载 / CDN
https://unpkg.com/vue-router/dist/vue-router.js
2、 NPM
cnpm install vue-router
表示目标路由的链接。 当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。
- <router-link to="home">Homerouter-link>
- <a href="home">Homea>
-
- <router-link v-bind:to="'home'">Homerouter-link>
-
- <router-link :to="'home'">Homerouter-link>
-
- <router-link :to="{ path: 'home' }">Homerouter-link>
-
- <router-link :to="{ name: 'user', params: { userId: 123 }}">Userrouter-link>
-
- <router-link :to="{ path: 'register', query: { plan: 'private' }}">Registerrouter-link>
设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录。
<router-link :to="{ path: '/abc'}" replace>router-link>
设置 append 属性后,则在当前 (相对) 路径前添加其路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b
<router-link :to="{ path: 'relative/path'}" append>router-link>
有时候想要
渲染成某种标签,例如
。 于是我们使用
tag
prop 类指定何种标签,同样它还是会监听点击,触发导航。
- <router-link to="/foo" tag="li">foorouter-link>
- <li>fooli>
设置 链接激活时使用的 CSS 类名。可以通过以下代码来替代。
- <style>
- ._active{
- background-color : red;
- }
- style>
- <p>
- <router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1router-link>
- <router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2router-link>
- p>
注意这里 class 使用 active-class="_active"。
- {
- path: '/user', //配置的路径
- name: 'user', //名称
- component: () => import('xxx)
- }
- <router-link to='.product/abc'>
- 在页面中获取
- $route.params.id
- <template>
- <div>
- <h1>404h1>
- <p>您的页面被外星人绑架了!p>
- <router-link to="/">回首页router-link>
- div>
- template>
- // 404的path为* 配置在最后面
- {
- path: "*",
- name: "nomatch",
- component: () => import('../views/NoMatch.vue')
- }
- $router.forward()
- $router.go(1)
- $router.go(-1)
- $router.back()
$router.push('/about')
$router.replace('/about')
- <div>
- <button @click="$router.back()">返回button>
- <button @click="$router.go(-1)">返回1button>
- <button @click="$router.forward()">前进button>
- <button @click="$router.go(1)">前进1button>
-
- <button @click="$router.push('/about')">关于button>
-
- <button @click="$router.replace('/about')">关于-替换(不留历史记录)button>
-
- div>
-
- <template>
- <div>
- <h1>产品页面{{$route.params.id}}h1>
- <p>查询参数:{{$route.query}}p>
- <p>哈希值:{{$route.hash}}p>
- <p>全地址:{{$route.fullPath}}p>
- <p>地址:{{$route.path}}p>
- <p>名称:{{$route.name}}p>
- <button @click='$router.back()'>返回button>
- div>
- template>
作用:在进入离开页面前做拦截,处理事情(跳转提示,权限检查)
- 进入前 beforeRouterEnter(to,from,next)
- 离开前 beforeRouterLeave
- 更新前 beforeRouterUpdate
- to要进入的路由
- from从哪个页面进入
- next下一步
- next()进入to页面
- next(true)进入to页面
- next(false)不跳转
- next("/login")跳转到登录
- beforeRouteLeave(to,from,next){
- // to 要去的页面
- // from 从哪个页面离开
- // next下一步(必须要执行)
- var flag = window.confirm("亲,商品价格是本年度最低价格,确定也放弃优惠吗?");
- if(flag){
- next();//进入下一页面
- }else{
- next(false);//不离开
- }
- }
- //写在路由配置中
-
- //希望好几个页面都需要验证是否登录
- router.beforeEach((to, from, next) => {
- if (to.meta.requireAuth) {
- //如果需要全限,判断
- if (localStorage.getItem("token")) {
- //如果没有token放行
- next(true);
- } else {
- //跳转到登录页面添加redirect
- next('/login?redirect' + to.path)
- }
- } else {
- //直接放行
- next(true);
- }
- })
- router.afterEach((to, from) => {
- console.log(from, '离开前')
- })
- {path:path,name,component,
- meta:{noFooter:true}
- }
-
- $route.meta.noFooter范围
next("/login?redirect=/cart")
var redirect=this.$route.query.redirect||'/use