背景
简单做个冒泡排序的效果,vue数据交换过后视图不刷新
解决方案总结
序号 | 方法 | 备注 |
---|---|---|
1 | 对数据进行拆装箱 | 相当于直接更新数据 |
2 | Vue.set(target, key, value) | vue提供的方法简洁明了 |
3 | 对item进行组件封装使用watch监听 | 针对于内容复杂的个人推荐 |
栗子
知识点
能触发vue视图更新的方法
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
无效的
// 直接设置值
this.arr[index] = value;
根本原因
vue2 是通过defineProperty,进行遍历监听属性,所以无法监听到对象的删除等操作
如下:observe是一个类似的原理实现
const observe = (obj: any) => {
for (const key in obj) {
let val = obj[key]
if (typeof val === 'object' && val != null) {
observe(val)
}
Object.defineProperty(obj, key, {
get () {
console.log(key, '读取', val)
return val
},
set (nVal) {
if (nVal !== val) {
console.log(key, '更改', nVal)
val = nVal
}
}
})
}
}
const obj = {
id: 1,
name: '关羽',
age: 22,
equip: {
head: '',
weaponry: '砍柴刀'
}
}
observe(obj)
obj.equip.weaponry = '青龙偃月刀'
console.log(obj.name)
饮水思源
- Vue-set