query 和 params的区别

路由跳转的几种传参方式:

  • query
// 传参: 
this.$router.push({
    path:'/xxx',
    query:{
      id:id
    }
})  

// 接收参数:
this.$route.query.id
  • params
// 传参: 
this.$router.push({
    name:'xxx',
    params:{
      id:id
    }  
})

// 接收参数:
this.$route.params.id

// 如果路由配置里没有添加 /:id,则参数不会体现在url中,如果添加则会在地址栏出现,
// 但是如果params不传参数就会导致页面没有内容或者跳转失败,所以可以设置 /:id? 表示可选

注意:params传参,只能用name来引用路由,否则页面接收到的参数为undefined

区别:query传参会带到URL中(?id='001'),相当于get请求。params不会,相当于post请求

  • path 拼接(因为在url中,所以页面刷新参数不会丢失)
// 传参:
this.$router.push({
    path: `/describe/${id}`,
})

// 路由配置
{
 path: '/describe/:id',
 name: 'Describe',
 component: Describe
}

// 接收参数:
this.$route.params.id
  • 路由props,路由解耦
// 传参:
<router-link :to="{name: 'industryDocument', params: {id: tradeType, key: industryType}}"></router-link>

// 路由配置(将路由的props设置为true,组件内通过props接收params参数,query接收不到)
{
    path: 'industryDocument/:id/:key',
    name: 'industryDocument',
    props: true,
    component: () => import('@/views/industryFocus/industryDocument')
}

// 接收参数:
export default {
    props: ['id', 'key'],
    mounted() {}
}

params传参页面刷新导致数据丢失问题

解决方案如下:

  • 使用query传参,但是遇对象(利用JSON.striginfy先转为字符串)可能会造成地址栏特别丑且信息暴露
  • 利用localStorage,在接收页面created周期获取数据放入缓存,beforeDestorye阶段清除缓存

results matching ""

    No results matching ""