在业务代码里,组里发现Vue的watch在使用中的一个细节问题。
场景:三维模型的渲染需要一组坐标数据信息(包括经纬高),假设我们现在需要更新数组其中一个坐标,并且在position发生变化时,通过监听,实时刷新。
当bad_compute_method = true:
因为 r.push({ x: coord.lat * 10, y: coord.lng * 10, z: coord.alt * 10 })
创建一堆新对象放入数组,所以所有的item的watch都被激活了。
(1)点击:good_edit()
1 | edited |
(2)点击:bad_edit(),与good_edit()表现一致。
1 | changed |
当bad_compute_method = false:
因为Bad Edit创建了一个新的点坐标对象替换了coordinates里面第一个元素,computed被激活。
(1)点击:good_edit()
1 | edited |
(2)点击:bad_edit()
1 | changed |
App.vue
1 | <template> |
Item.vue
1 | <template> |
通过上述例子可以发现:
对象数组中,不必总是需要通过splice创建新的对象。每个对象中的元素可以直接进行更改并且能够触发视图更新,但是如果需要通过watch来监听这个数组是否发生变化,必须加上deep:true
。