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等方法,来实现页面的重新渲染