• 路由中的meta、params传参的一些问题(可传不可传,为空,搭配,点击传递多次参数报错)


    当一个路由对象不需要显示某个组件时,可以通过meta设置

    登录注册不需要Footer,通过路由meta配置解决
        从route当中可以获取到path判断可以解决但是麻烦
        通过路由配置的时候路由对象当中配置meta设置来做

      {

        path:'/login',

        component:Login,

        // 元设置对象,里面可以配置自己想配的任何数据

        meta:{

          isHidden:true

        }

      },

     问题1:

    指定params参数时可不可以用path和params配置的组合?(对象写法)
            不可以用path和params配置的组合, 
            只能用name和params配置的组合
            query配置可以与path或name进行组合使用

    问题2:

    如何指定params参数可传可不传?    
            path: '/search/:keyword?'

    问题3:

    如果指定name与params配置, 但params中数据是一个"", 无法跳转,路径会出问题
    前提是路由params参数要可传可不传
            解决1: 不指定params
            解决2: 指定params参数值为undefined

    问题4:

    路由组件能不能传递props数据?
            可以: 可以将query或且params参数映射/转换成props传递给路由组件对象
            实现: props: (route)=>({keyword1:route.params.keyword, keyword2: route.query.keyword })
     

    问题5:

    vue_router3.1.0版本以上引入了promise的语法:
            如果我们传递参数,没有去修改参数,同时点击多次,会抛出这样的错误
            Uncaught (in promise) NavigationDuplicated,原因是内部promise是失败的,而我们又没有进行处理造成的
            解决1:降版本,不好
            解决2:处理失败的promise  在push调用之后加.catch(() => {})  不好,每次都要加,烦
            解决3:修改源码,一劳永逸

     push方法是有三个参数:  

            1、匹配的路由(可以是路由路径字符串,也可以是路由对象)

            2、成功的回调

            3、失败的回调

    push方法想要不报错

          vue-router.esm.js?3423:2065 Uncaught (in promise) NavigationDuplicated:

          Avoided redundant navigation to current location: "/search/aa?keyword1=AA".

          传递参数的时候,成功和失败的回调至少要传递一个

          根据源码分析,传递至少一个处理函数,那么就不会引发promise的介入,如果都不传,那么

          就会引入promise介入,而我们又没有处理失败的回调函数,就会抛出异常,报错

           if (!onComplete && !onAbort && typeof Promise !== 'undefined') {

              return new Promise(function (resolve, reject) {

                this$1.history.push(location, resolve, reject);

              });

            } else {

              this.history.push(location, onComplete, onAbort);

            }

    在路由器里配置

    1. // this.$router.push调用的方法就是下面这个方法
    2. // 1、保存之前的push方法,防止后期修改丢失
    3. const originPush = VueRouter.prototype.push
    4. const originReplace = VueRouter.prototype.replace
    5. // 2、修改原型身上的push方法,让后期再去调用的时候调用的是我修改后的push方法
    6. VueRouter.prototype.push = function(location,resolved,rejected){
    7. if(resolved === undefined && rejected === undefined){
    8. return originPush.call(this,location).catch(() => {})
    9. }else{
    10. return originPush.call(this,location,resolved,rejected)
    11. }
    12. }
    13. VueRouter.prototype.replace = function(location,resolved,rejected){
    14. if(resolved === undefined && rejected === undefined){
    15. return originReplace.call(this,location).catch(() => {})
    16. }else{
    17. return originReplace.call(this,location,resolved,rejected)
    18. }
    19. }

  • 相关阅读:
    为什么我建议需要定期重建数据量大但是性能关键的表
    多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)
    在 VirtualBox 虚拟机上搭建 openEuler 并安装桌面环境 详细教程
    UE4 顶点网格动画播放后渲染模糊问题
    2023年大数据平台数据安全厂商汇总
    sqlmap 执行后打开其它程序
    【英语:基础进阶_核心词汇扩充】E4.常见词根拓词
    JVM优化案例实战-手动模拟Young GC
    2022-iOS个人开发者账号申请流程
    【前后端分离系列】 Spring Boot + Vue 实现 EasyPOI 导入导出
  • 原文地址:https://blog.csdn.net/m0_60376759/article/details/126099722