因为vue2的响应式是通过Object.defineProperty()实现的,如果给data中对象动态添加属性,后面新增的属性能被添加进对象,但不会被设置成响应式数据,因为data中对象一开始会通过Object.defineProperty()实现响应式,但后面新增的属性不会被Object.defineProperty()设置成响应式数据。
解决办法:通过vue.$set()去动态添加属性,该属性会被添加进响应式系统中
在使用v-model时,一般会在data中初始化数据,但某些地方数据类似,我就想能不能不初始化数据,然后通过v-model动态绑定data对象中的属性,看能不能实现响应式的双向绑定
<template v-for="value in formData">
<div :key="value">{{ value }}</div>
</template>
<input v-model="formData['test']">
data(){
return {
formData:{}
}
}
发现这样写是可以实现动态添加属性且该属性是响应式的,那么这是如何实现响应式的呢?
通过实践我发现它可能是这样子实现的
<input :value="formData['test']" @input="e => $set(formData,'test',e.target.value)">