Vue 组件模板中 data 为什么是函数?
May 08, 2019 10:48·369 words ·1 minutes read
在创建或注册组件模板的时候,data 必须是函数,而不能直接把一个对象赋值给它
而在 new Vue() 的时候,却可以给 data 直接赋值为一个对象。
这是为什么呢?
解释:
需要理解:
new Vue()
是创建一个组件实例,而创建或注册组件模板实际是建立一个组件构造器constructor()
的引用所以,注册组件其实并不产生新的组件类,但会产生一个可以用来实例化的新方式
核心原因:原型链
var MyComponent = function() {} MyComponent.prototype.data = { a: 1, b: 2, }
上面是一个虚拟的组件构造器,真实的组件构造器方法很多
var component1 = new MyComponent() var component2 = new MyComponent()
上面实例化出来两个组件实例,也就是通过
<my-component>
调用,创建的两个实例component1.data.a === component2.data.a // true component1.data.b = 5 component2.data.b // 5
这里就存在问题了,当你改其中一个属性的时候,另外一个实例也会跟着改。
这怎么可以,两个实例应该有自己各自的域才对!
所以,需要通过下面方法来进行处理:
var MyComponent = function() { this.data = this.data() } MyComponent.prototype.data = function() { return { a: 1, b: 2, } }
这样每一个实例的data属性都是独立的,不会相互影响了
其实 vue 不应该把这个方法名取为 data(),应该叫 setData 或其他更容易立即的方法名