当前位置: 首页 > Web前端 > vue.js

vue项目中不同路由同一个组件识别

时间:2023-03-31 22:21:04 vue.js

当页面切换到同一个路由但参数不同的地址时,不会重新触发组件的生命周期钩子。这是因为vue-router会识别两个路由使用同一个组件进行复用,不会重新创建组件,所以组件的生命周期钩子不会自然触发。组件的本质是映射关系,销毁再重建同一个组件会有很大程度的性能浪费,复用组件才是正确的选择。但这也意味着组件的生命周期钩子将不再被调用。解决这个问题的三种方式:routenavigationguardbeforeRouteUpdatevue-router提供了一个navigationguardbeforeRouteUpdate,当当前路由发生变化,组件复用时调用,所以可以在组件中定义组件navigationguard来解决这个问题.vue-router2.2之后的版本都可以使用。exportdefault{data(){return{}},beforeRouteUpdate(to,from,next){console.log(to,from,next)if(to.fullPath!=from.fullPath){next()//用于路由响应变化//this.changeUser()}},methods:{}}观察$route对象的变化通过watch可以监听路由对象的变化,响应路由变化。例如:watch:{'$route'(to,from){//响应路由变化}}这个方法也可以解决上面的问题,但是代价是组件中多了一个watch,会带来依赖跟踪内存开销。如果你最终选择使用watch来解决这个问题,建议在某些场景下只观察组件中你需要的query,这样有助于减少不必要的请求。watch:{'$route.query.id'(){},'$route.query.page'(){}}在router-view组件中添加一个属性键,非常tricky,非常“暴力”,但是非常高效的。它本质上是利用虚拟DOM在渲染时通过key比较两个节点是否相同的原理。通过为router-view组件设置一个key,每次路由切换时key可以不同,让虚拟DOM认为router-view组件是一个新的节点,从而销毁该组件,然后重新创建一个新的组件.即使是同一个组件,如果url改变了,key也会改变,Vue.js会重新创建组件。因为组件是新创建的,所以组件内的生命周期会反复触发。示例如下:这种方式的缺点是显而易见的。每次路由切换都会销毁并重新创建组件,非常浪费性能。它的优点比较明显,简单粗暴,变化小。为router-view组件设置key后,可以看到问题立马解决了。文章内容摘自《深入浅出Vue.js》