vue 组件中的路由

学习目标

  • 路由
  • vue-router 的基本使用
  • 嵌套路由
  • 动态路由
  • 路由守卫

vue路由

1、什么是路由?
hash地址和页面组件之间的对应关系;

2、前端路由的工作方式

  • 用户点击了路由链接
  • 会导致URL地址中hash地址的变化
  • 前端路由会监控到hash地址的变化
  • 然后前端路由会把与hash地址对应的前端组件渲染到浏览器中

vue-router 的基本使用

官网地址:https://v3.router.vuejs.org/

1、 安装
npm install vue-router@3.5.2 -S
2、创建路由模块src/router/index.js
//1、引入两个包,vue,和vue-router
import Vue from 'vue';
import VueRouter from 'vue-router';

//2、使用vue.use()函数把vueRouter安装成vue的插件;
Vue.use(VueRouter);

//3、创建路由实例对象
const router = new vueRouter();

//4、把实例对象导出去
export default router

3、配置前端路由

main.js
把路由实例对象和项目联系起来,使整个项目都可以使用路由对象;

import router from '../src/router/index.js';
new Vue({
 render: h => h(App),
 router
}).$mount('#app')
4、在路由模块中创建路由和组件的对应关系
router/index.js配置
// 导入组件
import Home from "@/components/tabs/Home";
import Movie from "@/components/tabs/Movie";
import About from "@/components/tabs/About";

//配置路由规则,也就是hash地址和组件之间的对应关系
const router = new VueRouter({
    routes:[
        {
            path:'/',
            name:'home',
            component: Home
        },
        {
            path:'/movie',
            name:'movie',
            component:Movie
        },
        {
            path:'/about',
            name:'about',
            component:About
        },
    ]
    }
);

使用
<div id="app">
    <router-link to="/">首页</router-link>
    <router-link to="/movie">电影</router-link>
    <router-link to="/about">关于</router-link>
    <hr>
    <router-view/>
  </div>
  • router-link是vue-router提供的,相当与a链接,to属性相当于 href 属性;
  • router-view 是vue-router提供的组件,是占位符,组件页面展示的位置;
路由的重定向redirect

根据redirect属性可以重新配置组件的路由规则;
当用户访问/路径时,通过redirect属性重定向到/home的路由规则;

//配置路由规则,也就是hash地址和组件之间的对应关系
const router = new VueRouter({
    routes:[
        {
            path:'/',
          redirect:'/home'
        },
           {
            path:'/home',
            name:'home',
            component: Home
        }
    ]
    }
);

嵌套路由

什么是嵌套路由?
通过路由实现组件的嵌套展示,叫做嵌套路由;

  • 点击父级路由,展示模版内容;
  • 模版内容里面又有子级路由链接;
  • 点击子级路由链接,会显示子级路由的模版内容;

例如:
父组件about.vue

<div class="about">
  <h3>关于页面</h3>
  <router-link to="/about/tab1">tab1</router-link>
  <router-link to="/about/tab2">tab2</router-link>
  <router-view/>
</div>

配置子路由规则

 {
          {
            path:'/about',
            name:'about',
            component:About,
            redirect:'/about/tab1',
            children:[
                { path:'tab1', name:'tab1', component: () => import( '../components/tab/Tab1') },
                { path:'tab2', name:'tab2', component: () => import( '../components/tab/Tab2') },
            ]
        },

【注意】

  • 子路由的path属性不加 /
  • redirect 重定向,点击about默认跳转tab1页面;
  • 或者 不用重定向,想要默认展示的页面path为空也可以实现;
  • 缺点:路由如果为空,再次点击子路由会不显示内容;

动态路由

什么是动态路由?
路由规则中,path属性不是固定的;
使用英文的冒号 :id,来加参数;

{
path:'/movie/:id',
compoent:Movie
}
//带查询参数
{
path:'/movie/:id?name="zhangsan"&age="25"',
compoent:Movie
}

在页面中如何获取动态路由的参数?
有两种方式:

  • $route.params.id
  • props
$route.params.id

$route 是参数对象

  • 如果路由规则中只有路径,就使用 $route.params.id 来获取参数
  • 如果路由规则中有查询参数,就使用 $route.query 来获取参数
props 来获取参数

1、在路由规则中开启props

{
path:'/movie/:id',
compoent:Movie,
props:true
}

2、在组件中进行接收

props:['id']

声明式导航

什么是声明式导航?
指的是通过点击标签进行跳转的导航,比如说a链接,router-link

编程式导航

什么是编程式导航?
通过代码编写的方式来进行跳转页面,在JS中是通过location.href来进行跳转的;

路由的编程式导航是通过路由的API来进行跳转的;
有三种路由的API:

  • 1、$router.push(‘地址’)
    • 跳转页面,并且会增加一条历史记录
  • 2、$router.replace(‘地址’)
    • 跳转页面,并且会替换一条历史记录
  • 3、$router.go(n)
    -前进或后退一条历史记录
    vue 路由还提供了更为简单的前进和后退API
  • $router.back() 后退
  • $router.forward() 前进

导航守卫

1、什么是导航守卫?

导航守卫可以控制路由的访问权限;

2、什么时候会触发导航守卫?

每次发生路由的导航跳转时,都会触发全局导航守卫

语法:

router.beforeEach(function(to,from,nest){
next()
})

beforEach 方法的function函数有三个参数:

  • to指的是将要跳转的页面
    - to.path 可以得到将要跳转的页面的地址
  • form指的是将要离开的页面
  • next()指的是允许跳转

next()方法有三种跳转方式:

  • 1、next() 没有限制,直接跳转
  • 2、next(‘/login’),不允许访问某页面,强制跳转登录页
  • 3、next(false),不允许访问某页面,留在本页面

使用示例:

router.beforeEach(function(to,from,next){
if(to.path === '/main'){
const token = locationStorge.getItem(token);
if(token){
next()
}else{
next('/login')
}
}else{
next()
}
})

【分析】
1、如果将要访问的是main主页,需要判断是否有token;
1-1、如果有token,则允许跳转,
1-2、如果没有token,则需要强制跳转到登录页;

2、如果将要访问的不是main主页,直接放行;

router.beforeEach(function(to,from,next){
  //如果有多个页面都有登录权限的要求,可以使用数组
    const pathArr=['/home','/home/user','/home/goods'];
     if(pathArr.indexOf(to.path) !== -1){
         const token = localStorage.getItem('token')
         if(token){
             next()
         }else{
             next('/login')
         }
     }else{
         next()
     }
})
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值