vue中路由跳转页面不更新问题

文章类型:Vue

发布者:hp

发布时间:2023-08-01

一:产生原因

使用this.$router.push切换路由,从而实现页面之间的跳转。发现切换路由后,页面并没有进行刷新

主要是由于Vue使用了虚拟DOM

每当数据发生改变时,Vue会通过比较新旧虚拟DOM树的差异来更新页面,从而实现页面的动态渲染。

使用this.$router.push切换路由后,并没有触发数据的改变,因此也就没有引起页面的重新渲染。

即使我们使用watch来监听路由的改变,由于Vue的异步更新机制,也仍然不能保证watch回调函数中的代码能够在页面更新之前执行完毕。

二:解决方案

1:使用this.$router.go(0)方法刷新页面,强制再刷新一遍页面,(能实现刷新,但会导致表单数据丢失、重新请求增加服务器压力)

  // 在组件中使用this.$router.push切换路由
  this.$router.push('/my-route')
  
  // 页面不刷新,调用this.$router.go(0)方法
  this.$router.go(0)

2:使用Vue的key特性用来指定组件在更新时的唯一标识符。当组件的key发生改变时,Vue会销毁该组件并重新创建一个新的组件实例,从而重新渲染页面。

 <template>
    <div>
      <ul>
        <router-link to="/route1">Route1</router-link>
        <router-link to="/route2">Route2</router-link>
      </ul>
      <router-view :key="$route.fullPath" />
    </div>
  </template>

3:使用watch监控$route对象,通过watch来监控$route对象的变化,从而在路由切换时自动刷新页面(每次刷新页面都会从服务器重新获取数据)

 <template>
    <div>
      <ul>
        <router-link to="/route1">Route1</router-link>
        <router-link to="/route2">Route2</router-link>
      </ul>
      <router-view />
    </div>
  </template>

  <script>
  export default {
    watch: {
      '$route': function () {
        location.reload()
      }
    }
  }
  </script>

三:总结

1:根本原因在于Vue使用了虚拟DOM技术

2:结合Vue提供的key特性、watch等方法,来实现页面的重新渲染