Vue包含两种观察数组的方法分别如下:
变异方法会改变被这些方法调用的原始数组,它们也将会触发视图更新,这些方法如下:
push()pop()shift()unshift()splice()sort()reverse()非变异方法与变异方法的区别就说,非变异方法不会改变原始数组,总书返回一个新数组,当使用非变异方法时,可以用新数组替换旧数组,非变异方法大致有:filter() , concat(), slice()
arr = arr.filter(item => item.message.match(/Foo/))由于JavaScript的限制,Vue不能检测以下变动的数组:
当利用索引直接赋值一个项时,例如: vm.items[indexOfItem] = newValue当修改数组的长度时,例如:vm.items.length = newLengthvue针对这两个问题给出了响应的解决办法,使用这两种方法,也会触发状态更新:
使用vue全局方法 Vue.set()或者使用 vm.$set() 实例方法使用 splice concat 等修改数组 Vue.set用法如下(vm.$set方法是Vue.set的别名,与其用法一致)总结:vue能不能检测到数组的变化并更新,取决于原生js的数组方法,如果原生js方法(vue变异方法)能够修改原数组,那么vue就可以检测到变化并更新(例如push等方法) 如果原生js方法(vue非变异方法)不能够修改原数组,而是返回一个新数组,那么vue也可以检测到变化并更新,前提是使用这些方法时要把新数组返回出来去替换掉旧数组,至于原生js的数组的两个坑,我们一定要注意到,直接利用vue提供的方法来解决。
