背景
最新需要实现动态刷新一个列表的功能,这个列表被封装成了一个子组件,需要父组件向子组件传递列表数据,同时,由于列表数据中有一个为时间属性,需要动态刷新,所以子组件需要监听父组件这个数组的变化。
踩坑点
1.子组件刚进入watch监听时此时父组件的数据还没有处理完成
由于列表数组在父组件中是在mounted中进行获取赋值的,所以,而mounted的生命周期是在dom树渲染完成之后的,针对这点,我的解决方法是延迟子组件dom树的渲染
<child v-if="isShow" />
在父组件中,当列表数据获取完成之后,设置isShow的值为true,再去渲染子组件。
2.对数组的watch监听失效
对于对象而言,可以通过在watch中添加“deep: true”来实现对对象的属性变化的深度监听,但是,对于数组中的对象,此方法会失效。
Vue 不能检测以下数组的变动:
A. 利用索引直接设置数组中某一项的值时,例如:vm.items[index] = newValue;
B. 修改数组的长度时,例如:vm.items.length = newLength。
官方文档:深入响应式原理 — Vue.js (vuejs.org)
解决方案:
this.list[i].time = new Date();
this.$set(this.list, i, this.list[i]);
所以下次要记住,利用watch监听数组的时候要人为触发视图更新!!!
初次编辑,有不足之处还望各位大佬多多留言指教。谢谢大噶们~