You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
strats.data=function(parentVal: any,childVal: any,vm?: Component): ?Function{if(!vm){if(childVal&&typeofchildVal!=="function"){process.env.NODE_ENV!=="production"&&warn('The "data" option should be a function '+"that returns a per-instance value in component "+"definitions.",vm);returnparentVal;}returnmergeDataOrFn(parentVal,childVal);}returnmergeDataOrFn(parentVal,childVal,vm);};
面试官:为什么data属性是一个函数而不是一个对象?
一、实例和组件定义data的区别
vue
实例的时候定义data
属性既可以是一个对象,也可以是一个函数组件中定义
data
属性,只能是一个函数如果为组件
data
直接定义为一个对象则会得到警告信息
警告说明:返回的
data
应该是一个函数在每一个组件实例中二、组件data定义函数与对象的区别
上面讲到组件
data
必须是一个函数,不知道大家有没有思考过这是为什么呢?在我们定义好一个组件的时候,
vue
最终都会通过Vue.extend()
构成组件实例这里我们模仿组件构造函数,定义
data
属性,采用对象的形式创建两个组件实例
修改
componentA
组件data
属性的值,componentB
中的值也发生了改变产生这样的原因这是两者共用了同一个内存地址,
componentA
修改的内容,同样对componentB
产生了影响如果我们采用函数的形式,则不会出现这种情况(函数返回的对象内存地址并不相同)
修改
componentA
组件data
属性的值,componentB
中的值不受影响vue
组件可能会有很多个实例,采用函数返回一个全新data
形式,使每个实例对象的数据不会受到其他实例对象数据的污染三、原理分析
首先可以看看
vue
初始化data
的代码,data
的定义可以是函数也可以是对象源码位置:
/vue-dev/src/core/instance/state.js
data
既能是object
也能是function
,那为什么还会出现上文警告呢?别急,继续看下文
组件在创建的时候,会进行选项的合并
源码位置:
/vue-dev/src/core/util/options.js
自定义组件会进入
mergeOptions
进行选项合并定义
data
会进行数据校验源码位置:
/vue-dev/src/core/instance/init.js
这时候
vm
实例为undefined
,进入if
判断,若data
类型不是function
,则出现警告提示四、结论
data
可以是对象也可以是函数(根实例是单例),不会产生数据污染情况data
必须为函数,目的是为了防止多个组件实例对象之间共用一个data
,产生数据污染。采用函数的形式,initData
时会将其作为工厂函数都会返回全新data
对象The text was updated successfully, but these errors were encountered: