• 路由中的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. }

  • 相关阅读:
    Lustre和MARTE等建模语言的区别
    OI 数论中的上界估计与时间复杂度证明
    万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来
    什么是ConcurrentHashMap?
    嵌入式开发中模板方法模式实现
    ng Schematics
    算法分析至栈与队列
    el-upload 上传&表单校验成功后再触发上传
    OpenAI 重磅发布GPT 4o!可以视频聊天的AI?
    如何成为提示词工程师(精简版)
  • 原文地址:https://blog.csdn.net/m0_60376759/article/details/126099722