在 Vue.js 中,组件的 data 必须是一个函数,而不能是一个对象。这是因为:
- 如果是对象,多个组件实例共享一个 data 对象,相互覆盖。
- 如果是函数,每个组件实例都拥有 data 对象的一个全新副本,互不干扰。
示例:
对象形式的 data:
js
data: {
message: 'Hello!'
}
var vm1 = new Vue({ data })
var vm2 = new Vue({ data })
vm1.message = 'Hi!'
console.log(vm2.message) // Hi!
vm1 改变了 message,vm2 的 message 也随之改变, two instances share the same data object。
函数形式的 data:
js
data: function () {
return {
message: 'Hello!'
}
}
var vm1 = new Vue({ data })
var vm2 = new Vue({ data })
vm1.message = 'Hi!'
console.log(vm2.message) // Hello!
现在两次组件实例拥有 data 对象的完全隔离的副本,改变一个实例的 data 不会影响其他实例。
原因总结:
- Vue 需要观察 data 的变化来更新视图,如果是对象形式的 data,所有的实例共享一个对象,一个实例对对象的变更会影响其他实例,这显然是不合适的。
- 函数返回的对象或数组的每个实例都会有属于自己的完整数据副本,彼此不会互相影响。
- 这也使得数据可以根据组件实例进行定制,更加符合实际需求。