从文档(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
会发现reactive setter
. product.location
该属性最初不在 Vue 控制台 devtool 中,但在我开始在该字段中输入时它就会出现。
那么,什么给了?