Vue数组变化视图不刷新 方案汇总

背景

简单做个冒泡排序的效果,vue数据交换过后视图不刷新


demo效果

解决方案总结

序号 方法 备注
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

你可能感兴趣的:(Vue数组变化视图不刷新 方案汇总)