vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vue多层数据结构响应式失效,视图更新失败

Vue多层数据结构响应式失效,视图更新失败问题

作者:布依前端

这篇文章主要介绍了Vue多层数据结构响应式失效,视图更新失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在表单设计和流程设计时,碰到多层数据响应式失效问题,当时也是一脸懵,找不到错在哪里,运行代码不报错,就是不能响应式更新视图了。

特此记录一下填坑过程。

1、数据初始化结构被破坏

表单配置需要config属性,初始化时对象里没有,导致vue响应式失效,因为在页面完成渲染之后,vue就已经完成了响应式绑定,对于监听且没有属性的字段将会失去数据的响应式,从而无法实时更新视图。

先看看这个对象,是修复之前的结构。

formDesign: {
	process:{},
	list: []
}

修复后的数据结构,每一个需要响应式的属性,初始化页面时都需要正确的结构。

否则将失去响应式的后果。

formDesign: {
	process:{},
	list: [],
	config: {}
}

2、js-delete删除未触发数据更新

在调用js删除vue的data的数据后,既是传入组件的data绑定sync属性和watch监听都将变成徒劳的,因为js的delete更新不是链式响应式的,不会触发vue的响应式数据驱动更新视图。

当然这里针对是多层次数据结构,尤其是在流程设计,递归展示视图和操作数据时最为常见。

解决办法

使用vue的Vue.delete( target, propertyName/index )

官方解释

官方解释—深层响应性

在 Vue 中,状态都是默认深层响应式的。

这意味着即使在更改深层次的对象或数组,你的改动也能被检测到。

你也可以直接创建一个浅层响应式对象。

它们仅在顶层具有响应性,一般仅在某些特殊场景中需要。

export default {
  data() {
    return {
      obj: {
        nested: { count: 0 },
        arr: ['foo', 'bar']
      }
    }
  },
  methods: {
    mutateDeeply() {
      // 以下都会按照期望工作
      this.obj.nested.count++
      this.obj.arr.push('baz')
    }
  }
}

总结

每一个需要响应式的属性,初始化页面时都需要正确的data结构,不管数据结构是否复杂,都应该保持Vue响应式的数据规范,避免踩坑,否则将失去响应式的后果。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文