vue路由传参,刷新之后参数还在的问题

今天在做项目时遇到一个路由传参问题,跳转页面时,通过query传参了;跳转的目标页面也通过this.$route.query 拿到值了,然后通过传过来的参数去请求接口;但是当刷新页面时,我希望参数不要在请求接口的参数中

一开始的解决方法:用watch来监听路由的变化,如果是从/home跳转过来的,请求接口时就把参数设为上个页面传过来的参数,如果是执行刷新操作,就将参数设为空

moubted(){
    this.servicelist(true) 
},   
watch: {
      $route(to,from){       
           console.log(to,'---',from,'tot11')
           if(from.path == '/home'){
            this.form.list = this.$route.query.list
             this.form.id = this.$route.query.id
           }else{
             this.form.list= []
            this.form.id= ''
           }
        this.servicelist(true)   
      }
  },

但是这样有一个问题:第一次带参跳转页面时,路由并没有发生变化,也没有进行监听;返回上一个页面后,再跳转才会监听并打印路由to,from,但是每一次的跳转也是需要进行带参调接口的

修改如下:使用beforeRouteEnter路由守卫来进行判断,每次进入这个页面的时候都会打印路由参数

moubted(){
    this.servicelist(true) 
}, 
beforeRouteEnter (to, from, next) {
    console.log(to,'to009')
    console.log(from,'from009')
    next(vm=>{
      if(from.path == '/home'){
            vm.form.list= vm.$route.query.list
            vm.form.id= Number(vm.$route.query.id)
          }else{
            vm.form.list= []
            vm.form.id= ''
          }
          
            vm.servicelist(true)
       
    })
  },

又出现一个问题:当我每次跳转的时候,他会先执行mouted生命周期里面的方法去调接口(此时参数为空),然后再调一次带参的接口,这时页面显示的还是不带参的数据,虽然不带参的接口是先调的,但可能是数据比较多,后面才赋值上来,所以页面显示的还是不带参的数据

解决:将beforeRouteEnter 里面的方法延迟调用

beforeRouteEnter (to, from, next) {
    console.log(to,'to009')
    console.log(from,'from009')
    next(vm=>{
      if(from.path == '/home'){
            vm.form.list= vm.$route.query.list
            vm.form.id= Number(vm.$route.query.id)
          }else{
            vm.form.list= []
            vm.form.id= ''
          }
    setTimeout(()=>{
            vm.servicelist(true)
          },100)
 }) },

解决!

仅此记录下工作中遇到的问题,上述问题如果又更好的解决办法,请各位大佬告知

vue的另一种传参方式:这种方式传参,刷新页面参数也不会丢失

routes: [
    {
      path: '/list/:serverid',  // 要在路径里面配置动态参数,否则刷新页面,参数会丢失
      name: 'list'
    }
]
 
1
this.$router.push({name:'list', params:{serverid: id}}); // path和params不可以一起用
this.$route.params.serverid

 上面解决问题的方式时比较愚蠢的,因为即使将参数置空去调接口了,但是参数还是显示在路径中,于是我采用了刷新页面就失去参数的传参方式,这样刷新页面后参数就置空了

this.$router.push({name:'list',params:{serverid:this.id,labelid:newArr,labelArr:this.labelArr}})

在list页面中:

activated(){
      
      this.form.labelMap = this.$route.params.labelid?this.$route.params.labelid:[]
      this.form.serviceId = this.$route.params.serverid?this.$route.params.serverid:''
      this.labelArr = []
      this.getAlllabel()
      this.servicelist(true)
   },

methods:{
    activated(){
      
      this.form.labelMap = this.$route.params.labelid?this.$route.params.labelid:[]  // 这样当刷新页面时,参数丢失,将参数设为空
      this.form.serviceId = this.$route.params.serverid?this.$route.params.serverid:''
      this.labelArr = []
      this.getAlllabel()
      this.servicelist(true)
   },

methods:{  
    async getAlllabel(){
        const {data} = await getAlllabel()
        this.labelArr = data
        let array = []
        this.orderLabelArr.map(function(item) {
        array.push(
            Object.assign({},item,{isSelectList:[]})
        )
    })
        // this.orderLabelArr = array 
        this.labelArr = this.$route.params.labelArr?this.$route.params.labelArr:array// 这样当刷新页面时,参数丢失,将参数设为从接口拿到的数据
}, } } 

 

posted @ 2021-05-20 14:40  程序员瑶琴  阅读(2011)  评论(0编辑  收藏  举报