[列表——>详情] 同一页面下,切换不同组件,路由发生变化,但是数据不重载

文章讨论了在Vue中,当列表和详情在同一页面下,通过子路由切换详情时,数据不会因路由改变而重载的问题。这是由于Vue的组件缓存机制。提到了两种解决方法:一是给`router-view`添加唯一key,二是通过在detail组件中监听$router变化来局部更新数据。第一种方法会导致组件重载,第二种则能提高性能但可能使代码复杂。
摘要由CSDN通过智能技术生成

在同一页面下,切换不同组件,路由发生变化,但是数据不重载

在嵌套路由时容易出现的问题:
列表——>详情 问题:

​ 当列表和详情在同一父组件视图下时,详情是通过‘子路由’引入的,此时修改路由/detail/1,/detail/2,detail组件只被加载一次,路由组件不会因为路由的变化,而重载。

​ 这是由于Vue底层虚拟DOM比较导致的,对detail组件进行了缓存,这会导致detail组建内的生命周期函数不会重新调用,data不会重新初始化,看到的现象就是:更新路由,数据视图不变化,刷新一下才会变化

有两种解决办法:
​ 1,另一种做法:是为router-view提供一个独立key,让每次detail组件都被进行重载

<template>
  <div class="flex">
      <ul>
        <li v-for="i in 3" :key="i" @click="$router.push({
           name:'detail',
           params:{id:i}
        })">列表{{ i }}</li>
      </ul>
      <div class="container">
      //key的值与路由相同,容易区分,也可以是其他随机值
        <router-view :key="$route.path"></router-view>
      </div>
  </div>
</template>

2,vue-router官方推荐:在detail组件中对 $router进行watch,将业务代码都写在监听中(优点:组件不重载,数据可以局部更新,性能效率高,缺点:代码编写容易混乱)

export default {
// 详情业务
  data () {
    return {
      count: '详情页面' + this.$route.params.id
    }
  },
  created () {
    alert('create')
  },
  mounted () {
    alert('mounted')
  }
  监听路由,重载页面
  watch: {
    $route (newVal, oldVal) {
      alert(newVal.fullPath)
      this.count = '详情页面' + this.$route.params.id
      alert('create')
      alert('mounted')
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值