根据文档(https://vuejs.org/v2/guide/reactivity.html),我的印象是,对象的所有属性都必须在Vue数据对象中才能进行反应,除非使用Vue.set(object, key, value)
明确添加了它们,或this.$set(object, key, value)
。
但是,我将Rails与Vue结合使用,并且我以某种形式收集的任何数据属性(无论最初是否在数据对象中)都变得具有响应性。我正在使用Jbuiler构建JSON对象,但是我不认为这会影响反应性,因为如果我删除那里的属性,则在收集表单时它们仍然是反应性的。我已经尝试过在Rails中的对象上的属性以及是否通过控制台添加的属性(无论是否在Jbuilder中)。一切都变得被动。这很好,但不是我期望的行为,所以我想了解它。
这是一个例子...
# Product attributes: name, code (note: not 'location'!)
# Rails Controller
def new
@product = Product.new
end
# JS
var product = gon.product // using Gon gem to pass variables
var app = new Vue({
el: element,
data: function() {
return {
id: id,
product: product
}
}
)}
# HTML
<div class="col-sm-3">
<input type="text" v-model="product.code" class="form-control form-control-sm" />
</div>
<div class="col-sm-3">
<input type="text" v-model="product.location" class="form-control form-control-sm" />
</div>
<div>
Product Code: {{ product.code }}
Product Location: {{ product.location }}
</div>
当我开始在product.location
字段中键入内容时,输出立即显示在屏幕上,因此它似乎是反应式的。在控制台中检查对象会显示reactive getter
的{{1}}和reactive setter
。该属性最初不在Vue控制台devtool中,但在我开始在该字段中输入后便会出现。
那有什么作用?