码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Vue(十)——页面路由(2)


    目录

    router-link的replace属性

    编程式路由导航

    缓存路由组件

    两个新的生命周期钩子

    路由守卫

    全局守卫

    独享守卫

    组件内守卫

    路由器的两种工作模式

    hash模式

    history模式


    router-link的replace属性

    浏览器历史记录的操作模式:push模式

    对历史记录的操作除了有push模式还有一种replace模式,就是每次都替换掉栈顶元素

    只需要在router-link标签里添加replace属性就行

     

    1. 作用:控制路由跳转时操作浏览器历史记录的模式

    2. 浏览器的历史记录有两种写入方式:分别为```push```和```replace```,```push```是追加历史记录,```replace```是替换当前记录。路由跳转时候默认为```push```

    3. 如何开启```replace```模式:```News```

    编程式路由导航

            最终会转换成,如果导航项是用button写的怎么办?加入只是让用户等3s跳转无需点击按钮怎么办?

    需求如下:

    新增按钮并绑定事件,传入 m(messageList中的元素)参数获取数据。

    定义事件方法,使用push和replace方法携带数据实现跳转(体会编程式路由导航)



            在顶部实现浏览器的前进和后退($router中的back()和forword()方法)

            还有一个go()方法,这个方法要传入一个数字n,如果是正数则相当于连点n次前进,如果是负数则相当于退回n次。

    ./components/Banner.vue

    1. <template>
    2. <div class="col-xs-offset-2 col-xs-8">
    3. <div class="page-header">
    4. <h2>Vue Router Demoh2>
    5. <button @click="back">后退button>
    6. <button @click="forward">前进button>
    7. <button @click="test">测试一下gobutton>
    8. div>
    9. div>
    10. template>
    11. <script>
    12. export default {
    13. name:'Banner',
    14. methods: {
    15. back(){
    16. this.$router.back()
    17. // console.log(this.$router)
    18. },
    19. forward(){
    20. this.$router.forward()
    21. },
    22. test(){
    23. this.$router.go(3)
    24. }
    25. },
    26. }
    27. script>

    1. 作用:不借助``` ```实现路由跳转,让路由跳转更加灵活

    2. 具体编码:

    1. //$router的两个API
    2. this.$router.push({
    3. name:'xiangqing',
    4. params:{
    5. id:xxx,
    6. title:xxx
    7. }
    8. })
    9. this.$router.replace({
    10. name:'xiangqing',
    11. params:{
    12. id:xxx,
    13. title:xxx
    14. }
    15. })
    16. this.$router.forward() //前进
    17. this.$router.back() //后退
    18. this.$router.go() //可前进也可后退

    缓存路由组件

            在news后面添加输入框,因为路由跳转之后。原先的路由组件就会被销毁,所以切换到message之后再切换回来,组件会被重新挂载,输入框里的东西会消失。怎么办?

    使用标签,则在标签里的所有东西都会被缓存

    使用include属性可以决定哪个组件会被缓存(include属性写的是组件名)

    还可以通过数组的形式缓存多个路由组件

    ./pages/Home.vue

    1. <template>
    2. <div>
    3. <h2>Home组件内容h2>
    4. <div>
    5. <ul class="nav nav-tabs">
    6. <li>
    7. <router-link class="list-group-item" active-class="active" to="/home/news">Newsrouter-link>
    8. li>
    9. <li>
    10. <router-link class="list-group-item" active-class="active" to="/home/message">Messagerouter-link>
    11. li>
    12. ul>
    13. <keep-alive :include="['News','Message']"/>
    14. <keep-alive include="News">
    15. <router-view>router-view>
    16. keep-alive>
    17. div>
    18. div>
    19. template>
    20. <script>
    21. export default {
    22. name:'Home',
    23. }
    24. script>

    1. 作用:让不展示的路由组件保持挂载,不被销毁。

    2. 具体编码:

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

    两个新的生命周期钩子

    ./pages/News.vue

    1. <template>
    2. <ul>
    3. <li :style="{opacity}">欢迎学习vueli>
    4. <li>news001 <input type="text">li>
    5. <li>news002 <input type="text">li>
    6. <li>news003 <input type="text">li>
    7. ul>
    8. template>
    9. <script>
    10. export default {
    11. name:'News',
    12. data(){
    13. return{
    14. opacity:1
    15. }
    16. },
    17. activated(){
    18. console.log('News组件被激活了')
    19. this.timer = setInterval(() => {
    20. this.opacity -= 0.01
    21. if(this.opacity <= 0) this.opacity = 1
    22. },16)
    23. },
    24. deactivated(){
    25. console.log('News组件失活了')
    26. clearInterval(this.timer)
    27. }
    28. }
    29. script>

    使用keep-alive缓存后将不会触发销毁了,使用 deactivated可使其失活,使用activated再次激活。vue之组件的激活activated与失活deactivated

    1. 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。

    2. 具体名字:

            1. ```activated```路由组件被激活时触发。被 keep-alive 缓存的组件激活时调用。初始化操作放在actived里面。

            2. ```deactivated```路由组件失活时触发。被 keep-alive 缓存的组件停用时调用。在deactived里面,在里面进行一些善后操作。

            添加keep-alive标签后会增加activated和deactivated这两个生命周期函数,初始化操作放在actived里面,一旦切换组件,因为组件没有被销毁,所以它不会执行销毁阶段的钩子函数,所以移除操作需要放在deactived里面,在里面进行一些善后操作,这个时候created钩子函数只会执行一次,销毁的钩子函数一直没有执行。

    路由守卫

    有时候不是所有的导航项都是可以点击的,此时得符合某些要求才可以点击并呈现相关组件。

    1. 作用:对路由进行权限控制

    全局守卫

    src/router/index.js:

    1. //该文件专门用于创建整个应用的路由器
    2. import VueRouter from "vue-router";
    3. //引入组件
    4. import Home from '../pages/Home'
    5. import About from '../pages/About'
    6. import News from '../pages/News'
    7. import Message from '../pages/Message'
    8. import Detail from '../pages/Detail'
    9. //创建一个路由器
    10. const router = new VueRouter({
    11. routes:[
    12. {
    13. name:'guanyv',
    14. path:'/about',
    15. component:About,
    16. meta:{title:'关于'}
    17. },
    18. {
    19. name:'zhuye',
    20. path:'/home',
    21. component:Home,
    22. meta:{title:'主页'},
    23. children:[
    24. {
    25. name:'xinwen',
    26. path:'news',
    27. component:News,
    28. meta:{isAuth:true,title:'新闻'}
    29. },
    30. {
    31. name:'xiaoxi',
    32. path:'message',
    33. component:Message,
    34. meta:{isAuth:true,title:'消息'},
    35. children:[
    36. {
    37. name:'xiangqing',
    38. path:'detail',
    39. component:Detail,
    40. meta:{isAuth:true,title:'详情'},
    41. props($route){
    42. return {
    43. id:$route.query.id,
    44. title:$route.query.title,
    45. }
    46. }
    47. }
    48. ]
    49. }
    50. ]
    51. }
    52. ]
    53. })
    54. //全局前置路由守卫————初始化的时候、每次路由切换之前被调用
    55. router.beforeEach((to,from,next) => {
    56. console.log('前置路由守卫',to,from)
    57. if(to.meta.isAuth){
    58. if(localStorage.getItem('school')==='atguigu'){
    59. next()
    60. }else{
    61. alert('学校名不对,无权限查看!')
    62. }
    63. }else{
    64. next()
    65. }
    66. })
    67. //全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
    68. router.afterEach((to,from)=>{
    69. console.log('后置路由守卫',to,from)
    70. document.title = to.meta.title || '硅谷系统'
    71. })
    72. //导出路由器
    73. export default router
    1. //全局前置守卫:初始化时执行、每次路由切换前执行
    2. router.beforeEach((to,from,next)=>{
    3. console.log('beforeEach',to,from)
    4. if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
    5. if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
    6. next() //放行
    7. }else{
    8. alert('暂无权限查看')
    9. // next({name:'guanyu'})
    10. }
    11. }else{
    12. next() //放行
    13. }
    14. })
    15. //全局后置守卫:初始化时执行、每次路由切换后执行
    16. router.afterEach((to,from)=>{
    17. console.log('afterEach',to,from)
    18. if(to.meta.title){
    19. document.title = to.meta.title //修改网页的title
    20. }else{
    21. document.title = 'vue_test'
    22. }
    23. })

    独享守卫

    src/router/index.js:

    1. //该文件专门用于创建整个应用的路由器
    2. import VueRouter from "vue-router";
    3. //引入组件
    4. import Home from '../pages/Home'
    5. import About from '../pages/About'
    6. import News from '../pages/News'
    7. import Message from '../pages/Message'
    8. import Detail from '../pages/Detail'
    9. //创建一个路由器
    10. const router = new VueRouter({
    11. routes:[
    12. {
    13. name:'guanyv',
    14. path:'/about',
    15. component:About,
    16. meta:{title:'关于'}
    17. },
    18. {
    19. name:'zhuye',
    20. path:'/home',
    21. component:Home,
    22. meta:{title:'主页'},
    23. children:[
    24. {
    25. name:'xinwen',
    26. path:'news',
    27. component:News,
    28. meta:{title:'新闻'},
    29. //独享守卫,特定路由切换之后被调用
    30. beforeEnter(to,from,next){
    31. console.log('独享路由守卫',to,from)
    32. if(localStorage.getItem('school') === 'atguigu'){
    33. next()
    34. }else{
    35. alert('暂无权限查看')
    36. }
    37. }
    38. },
    39. {
    40. name:'xiaoxi',
    41. path:'message',
    42. component:Message,
    43. meta:{title:'消息'},
    44. children:[
    45. {
    46. name:'xiangqing',
    47. path:'detail',
    48. component:Detail,
    49. meta:{title:'详情'},
    50. props($route){
    51. return {
    52. id:$route.query.id,
    53. title:$route.query.title,
    54. }
    55. }
    56. }
    57. ]
    58. }
    59. ]
    60. }
    61. ]
    62. })
    63. //全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
    64. router.afterEach((to,from)=>{
    65. console.log('后置路由守卫',to,from)
    66. document.title = to.meta.title || '硅谷系统'
    67. })
    68. //导出路由器
    69. export default router
    1. beforeEnter(to,from,next){
    2. console.log('beforeEnter',to,from)
    3. if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
    4. if(localStorage.getItem('school') === 'atguigu'){
    5. next()
    6. }else{
    7. alert('暂无权限查看')
    8. // next({name:'guanyu'})
    9. }
    10. }else{
    11. next()
    12. }
    13. }

    组件内守卫

    src/pages/About.vue:

    1. <template>
    2. <h2>我是About组件的内容h2>
    3. template>
    4. <script>
    5. export default {
    6. name:'About',
    7. //通过路由规则,离开该组件时被调用
    8. beforeRouteEnter (to, from, next) {
    9. console.log('About--beforeRouteEnter',to,from)
    10. if(localStorage.getItem('school')==='atguigu'){
    11. next()
    12. }else{
    13. alert('学校名不对,无权限查看!')
    14. }
    15. },
    16. //通过路由规则,离开该组件时被调用
    17. beforeRouteLeave (to, from, next) {
    18. console.log('About--beforeRouteLeave',to,from)
    19. next()
    20. }
    21. }
    22. script>
    1. //进入守卫:通过路由规则,进入该组件时被调用
    2. beforeRouteEnter (to, from, next) {
    3. },
    4. //离开守卫:通过路由规则,离开该组件时被调用
    5. beforeRouteLeave (to, from, next) {
    6. }

    路由器的两种工作模式

    1. 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。

    2. hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。

    hash模式

       1. 地址中永远带着#号,不美观 。

       2. 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。

       3. 兼容性较好。

    history模式

       1. 地址干净,美观 。

       2. 兼容性和hash模式相比略差。

       3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。

  • 相关阅读:
    【洛谷 P1105】平台 题解(结构体+暴力枚举)
    深度解读昇腾CANN多流并行技术,提高硬件资源利用率
    MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别
    ​Pycharm远程连接服务器(Ubuntu版)​
    用docker搭建简易ctf题目
    【Mac】时间机器频繁提示磁盘没有正常推出
    【计算机网络笔记】路由算法之链路状态路由算法
    1001 A+B Format(字符串处理)
    大饼简记.
    简单实现接口自动化测试(基于python)
  • 原文地址:https://blog.csdn.net/m0_52601969/article/details/127896617
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号