• Vue Router(二)


    目录

    一、嵌套路由

    1、路由定义

    2、代码例子

    3、重定向

    二、懒加载

    1、缘由

    2、代码例子

    三、导航守卫

    1、全局前置守卫

    2、全局后置守卫

    3、meta元信息

    四、生命周期

    1、解释

    2、执行顺序

    3、例子

    五、keep-alive组件缓存(保活)

    1、介绍

    2、属性

    3、代码例子


    一、嵌套路由

    1、路由定义

    (1)通过路由配置,定义好组件在路由层面映射的嵌套层级,使用children定义子路由

    (2)注意:子路由中的path不以/开头,若写了/则会提升为一级路由

    2、代码例子

    (1)App.vue文件

    1. <h1>
    2. <router-link to="/home">主页router-link> |
    3. <router-link to="/news">新闻router-link>
    4. h1>
    5. <router-view />

    (2)router文件夹下index.js文件

    1. import Vue from "vue";
    2. import VueRouter from "vue-router";
    3. import HomeView from "../views/HomeView.vue";
    4. import Hot from "../views/news/hotPage.vue"
    5. import Tnews from "../views/news/TnewsPage.vue"
    6. import News from "../views/news/NewsPage.vue"
    7. Vue.use(VueRouter);
    8. const routes = [
    9. {
    10. path: "/",
    11. name: "home",
    12. component: HomeView,
    13. },
    14. {
    15. path: "/news",
    16. name: "news",
    17. component: News,
    18. children: [
    19. {
    20. path: "hot", //注意路径没有/
    21. component: Hot,
    22. },
    23. {
    24. path: "tnews", //注意路径没有/
    25. component: Tnews,
    26. },
    27. ],
    28. },
    29. ];
    30. const router = new VueRouter({
    31. mode: "history",
    32. base: process.env.BASE_URL,
    33. routes,
    34. });
    35. export default router;

    NewsPage.vue文件

    1. <router-link to="/news/hot">热点新闻router-link> |
    2. <router-link to="/news/tnews">国际新闻router-link>
    3. <router-view />

    3、重定向

    routes的每一层都可以重定向

    1. const routes = [
    2. {
    3. path: "/",
    4. redirect:"Home",//对应component,注意Home要引号引起来
    5. },
    6. {
    7. path: "/news",
    8. name: "news",
    9. component: News,
    10. children:[
    11. {
    12. path:'',
    13. redirect:"Hot",
    14. },
    15. {
    16. path:'hot',
    17. component:Hot,
    18. },
    19. {
    20. path:'tnews',
    21. component:Tnews,
    22. },
    23. ],
    24. },
    25. ];

    二、懒加载

    1、缘由

    ①问题:当每个组件都在定义路由前import ,打包构建项目时,js包会变得非常大,影响页面加载
    ②解决:把不同路由对应的组件分割成不同的代码块,当路由被访问时才加载对应组件,会更高效
    ③格式:()=>import("vue文件路径")

    2、代码例子

    1. const routes = [
    2. {
    3. path: "/",
    4. redirect: { name: "Home" }, //重定向也要改格式
    5. },
    6. {
    7. path: "/home",
    8. name: "Home",
    9. component: () => import("@/views/HomePage.vue"),
    10. },
    11. ];

    三、导航守卫


    作用:通过跳转或取消的方式守卫导航,有些页面需要权限校验才能进入
    多种方式:全局,单个路由独享,组件级


    1、全局前置守卫

    (1)场景:路由开始跳转前(未进行跳转时),需要在回到函数中手动调用next(),放行路由

    (2)格式

    1. router.beforeEach((to,from,next)=>{
    2. })

    ①to:即将要进入的目标路由对象
    ②from:当前导航要离开的路由
    ③next('/'):一定要调用该方法resolve这个钩子,执行效果依赖next方法的调用参数

    • next():放行路由跳转,会跳转到原定目标页面
    • next(false):中断当前的导航,如果浏览器的URL改变了,那么URL会重置到from路由对应的地址
    • next('/')、next({ path: '/' }):路由重定向,可以向next传递任意用在的【to属性值】或router.push的选项

    (3)注意

    必须确保next函数在任何给定的导航守卫中都被严格调用一次

    ①代码例一

    1. router.beforEach((to,form,next)=>{
    2. //如果未登录且目标不是登录页,则重定向到登录页,且return掉函数
    3. if(to.name !== 'Login' && !isAuthenticated) return next({name:'Login'})
    4. //放行路由
    5. next()
    6. })

    ②代码例二

    1. router.beforeEach((to,from,next)=>{
    2. console.log("to",to);
    3. console.log(from);
    4. next()
    5. })

    2、全局后置守卫

    (1)场景:进入页面后的守卫,与前置守卫不同的是,没有next函数,因此不会改变导航

    (2)格式

    1. router.afterEach((to, from) => {
    2. // ...
    3. })

    ①to:当前导航进入的目标路由对象
    ②from:当前导航正要离开的路由

    3、meta元信息

    说明:浏览器每个页面的标题

    1. {
    2. path:'/home',
    3. name:"Home",
    4. meta:{//元信息
    5. title:'主页'
    6. },
    7. component:()=>import("@/views/HomePage.vue"),
    8. },

    四、生命周期


    图解生命周期


    1、解释

    (1)beforeCreate()
    周期节点:组件实例被创建之初,组件的属性生效之前
    注意:此时无实例,无dom渲染
    创建实例之前执行的钩子事件

    (2)created()
    周期节点:组件实例已经完全创建,属性也绑定,但真实dom还没有生成
    注意:此时仅能访问到实例数据,如:dada、method等

    (3)beforeMount()
    周期节点:DOM刚要渲染
    注意:此时仅能访问到实例数据,如:data、method等

    (4)mounted()
    周期节点:DOM渲染结束
    注意:此时能访问到实例数据和页面上的DOM

    (5)beforeUpdate()
    周期节点:组件数据更新之前,DOM未重新渲染

    (6)update()
    周期节点:组件数据更新之前,DOM已重新渲染

    (7)activated()
    【keep-alive专属】,缓存的组件被激活时,钩子函数

    (8)deactivated()
    【keep-alive专属】,缓存的组件未激活时,钩子函数

    (9)beforeDestroy()
    周期节点:组件实例销毁前

    (10)destroyed()
    周期节点:组件销毁后

    2、执行顺序

    3、例子

    1. created () {
    2. console.log('新闻页面创建');
    3. },
    4. destroyed () {
    5. console.log('新闻页面销毁');
    6. },

    五、keep-alive组件缓存(保活)

    1、介绍

    使用切换页面,组件会被摧毁并经历完整的生命周期
    但是有时需要组件数据能够保存,而不是每次进入就重新获取数据进行页面渲染

    1. <keep-alive>
    2. <router-view />
    3. keep-alive>

    2、属性

    ①include:字符串或正则表达式,名称匹配的组件会被缓存。
    ②exclude:字符串或正则表达式,名称匹配的组件都不会被缓存。
    ③max: 数字,最多可以缓存多少组件实例。

    1. <keep-alive include="HomePage">
    2. <router-view />
    3. keep-alive>

    3、代码例子

    1. <template>
    2. <div>
    3. <nav>
    4. <router-link to="/home/index">首页router-link>
    5. <router-link to="/home/mine">我的router-link>
    6. nav>
    7. <keep-alive>
    8. <router-view />
    9. keep-alive>
    10. div>
    11. template>
  • 相关阅读:
    每日一道力扣题
    嵌入式学习笔记(40)看门狗定时器
    军事ar虚拟现实电子沙盘系统的功能
    三步实现Mybatis(Mybatis-Plus)多数据源配置
    弘辽科技:淘宝店铺被管控还能开吗?原因是什么?
    四旋翼无人机学习第3节--cadence原理图库创建以及基础元器件绘制
    深入了解Java 8 新特性:lambda表达式进阶
    Proteus8.10软件安装教程
    React@16.x(40)路由v5.x(5)常见应用场景(2)- 实现类似 vue 的路由模式
    Cygwin安装
  • 原文地址:https://blog.csdn.net/qq_51478745/article/details/132673605