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

  • 相关阅读:
    mac 中配置idea自带maven环境变量
    消灭空指针,Java 8 给我们更好的解决方案
    互联网程序设计课程 第2讲 网络对话程序设计
    [附源码]Python计算机毕业设计SSM家纺商品展示平台(程序+LW)
    数商云S2B2C商城积分商城功能如何实现家用电器企业营销价值最大化?
    DWA算法,仿真转为C用于无人机避障
    AOSP.~ Android.bp 添加自定义模块
    【MySQL从0到1】第五篇:表的增删查改
    设计和实施
    【Docker中Kafka+Zookeeper基本命令使用】
  • 原文地址:https://blog.csdn.net/m0_60376759/article/details/126099722