一. data为什么是一个函数
如果data是一个函数的话,这样每复用一次组件,就会返回一份新的data(类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据)
Object是引用数据类型,里面保存的是内存地址,单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。
组件中的data写成一个函数
,数据以函数返回值形式定义
,这样每复用一次组件,就会返回一份
新的data(
类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据)
注: 而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果
二. data为什么必须是一个函数?
因为组件是可以复用的, JS里对象是引用关系, 如果组件data是一个对象, 那么在子组件中的data属性值会互相污染, 产生副作用。
所以一个组件的data选项必须是一个函数, 因此每个实例可以维护一份被返回对象的独立拷贝。new Vue的实例是不会被复用的,因此不存在以上问题。
总结:
根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况
组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。
采用函数的形式
,initData时会将其作为工厂函数都会返回全新data对象