本文知识点比较简单,主要面向vue新人解惑,vue前辈请忽略。
实现功能:
见上图,这是一个产品列表,当进入不同列表时应该更新内容。
代码如下:
//router配置
{path: "/products/:category",name: "Products",components: {...}}
//组件js配置
mounted() {this.getData(this.$route.params.category);},methods: {getData: function(category){this.axios.get("/products/" + category).then(res => {const data = res.data.data;this.pros = data.pro;}).catch(error => {console.log("error init." + error);});}}
目前症状:
1、点击不同类别,url有变化已正确指向不同的路由,但是内容没有更新
2、由当前类别进入其他类别路由后刷新页面,可正确获取数据
知识点
在使用Vue-router做项目时,会遇到如/serviceId/:id这样只改变id号的场景。由于router-view是复用的,单纯的改变id号并不会刷新router-view
watch 除了可以监听数据的变化,路由的变化也能被其监听到
:key vue为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可
针对以上,经过本人项目实践以及网友贡献,有三种方法可解决:
方法一:通过 watch 监听路由(亲测可行)
mounted() {this.getData(this.$route.params.category);},methods: {getData: function(category){...}},watch: { //通过watch来监听路由变化"$route": function(){this.getData(this.$route.params.category);}}
方法二:用 :key 来阻止“复用”
具体使用方法:
<router-view :key="key"></router-view>computed: {key() {return this.$route.name !== undefined? this.$route.name +new Date(): this.$route +new Date()}}
tips:使用computed属性和Date()可以保证每一次的key都是不同的,这样就可以如愿刷新数据了
方法三:通过 vue-router 的钩子函数 beforeRouteEnter beforeRouteUpdate beforeRouteLeave
computed:mapGetters([...]),beforeRouteEnter (to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当钩子执行前,组件实例还没被创建},beforeRouteUpdate (to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}
本人尝试使用"beforeRouteUpdate",但位得到解决,其他方法没有尝试。
以上内容如果有错误,请各位朋友指出,谢谢。