Vue开发技巧(避免踩坑) ---- 持续更新

一、数组更新检测

在Vue中操作数组,当你使用索引设置一个项,例如 vm.items[index] = newVal,或者修改数组长度,例如vm.item.lenghts = newLenghts,因为javascript的限制,将能不能触发状态更新,但是你可以使用如下方法触发更新

// 第一个问题
Vue.set(items, indexOfItem, newVal)
// or 
items.splice(indexOfItem, 1, newVal)

// 第二个问题
item.splice(newLength)

同时,以下的数组API都会触发状态更新

push(), pop(), shift(), unshift(), splice() (上面有演示), sort(), reverse()

我曾经在一个项目中直接使用索引去操作数组,结果被坑了10分钟,谨记谨记。
还有剩下一些例如 fitler(), concat(), slice() 。这些方法不会改变原始数组,但总是返回一个新数组,所以可以用新数组替代旧数组。或许你会认为这样Vue会丢弃现有DOM并重新渲染整个列表,事实上Vue为了使DOM元素得到最大范围的重用使用了一些智能的,启发式的方法,所以用一个含有相同元素的数组去替换原来的数组非常高效。

二、for循环加key

开发中有时会碰到 Vue提示,for循环里缺少key,其实这个key加不加是不会影响程序正常运行的,但是加了之后又有什么好处呢,这里主要涉及虚拟DOM的Diff算法,看图

Vue开发技巧(避免踩坑) ---- 持续更新_第1张图片

我们想在dom B,C之间插入dom F,如果没有key,默认的diff算法执行如下


Vue开发技巧(避免踩坑) ---- 持续更新_第2张图片

节点不变,只更新里面的属性内容,把c换成f,d换成c,e换成d,然后创建一个e插入最后,如果有100,1000条数据,我如果在第二个位置插一个数据,想一下这个计算量是很多的。
但是有了key之后,就大不一样了,看图


Vue开发技巧(避免踩坑) ---- 持续更新_第3张图片

每个节点都有自己唯一的key,新的节点直接根据位置插入节点,是不是很快,但是key也不是必须要的,但是如果操作大量数据频繁变化时,就要用上key啦~

三、v-show,v-if的动态监测

开发中,如果我们对v-show,if的状态判断为返回一个函数如

商品评价

如果我们在test方法中对onlyContent的状态进行了判断,那么此时的onlyContent处于被监听的状态(就像在watch里),如果onlyContent的状态发生了改变,那么test方法将会被再次执行,这样就减轻了多余的watch监听。我在created 的时候添加一个定时器,效果就是test函数每隔1s就会被触发一次。

你可能感兴趣的:(Vue开发技巧(避免踩坑) ---- 持续更新)