现象:
平时做项目的时候(form表单提交后再次回显示编辑)会对数组或者对象 进行修改操作,结果发现,怎么页面没有重新渲染,但控制台输出确更新了。
原因:
Vue 无法探测普通的新增 属性
官方给出的解决办法:Vue.set()
Vue.set( target, propertyName/index, value )
官方解释:
它用于向响应式对象中添加一个 属性,并确保这个新 属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 属性,因为 Vue 无法探测普通的新增 属性(比如 this.myObject.newProperty = 'hi'
)
方法1:用 Object.assign
对象改变:
oldObj = Object.assign({},newObj);
用法:
this.formData = Object.assign({},this.formData,baseDeviceDto);
原理:
对象是引用类型,直接改变oldObj的某属性指向地址没变,vue不一定能监控到,所以当我们新建一个对象并赋值给oldObj字段的话,直接改变了它的指向地址
方法2:用vue.set
官方:
this.$set( target, propertyName/index, value );
Vue.set( target, propertyName/index, value );
🌹target:要更改的数据源(可以是对象或者数组)
🌹 propertyName/index:要更改的具体数据
🌹 value :重新赋的值
用法:
this.$set(this.formData.tableData, index, row);
this.$set(this.formData,’scrRoomRoleList’,chooseRoleList);
原理:看这里
this.$set和Vue.set区别:
this.$set是Vue.set的别称;
两者原理基本一模一样,都是使用了set函数。set函数是从 ../observer/index 文件中导出的,区别在于Vue.set()是将set函数绑定在Vue构造函数上,this.$set()是将set函数绑定在Vue原型上。
办法3,使用forceUpdate
this.$forceUpdate()强制视图更新