「Vue面试题」在vue中为什么data属性是一个函数而不是一个对象
创始人
2024-06-02 14:33:27
0

在这里插入图片描述

文章目录

    • 一、实例和组件定义data的区别
    • 二、组件data定义函数与对象的区别
    • 三、原理分析
    • 四、结论

一、实例和组件定义data的区别

vue实例的时候定义data属性既可以是一个对象,也可以是一个函数

const app = new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}}
})

组件中定义data属性,只能是一个函数

如果为组件data直接定义为一个对象

Vue.component('component1',{template:`
组件
`,data:{foo:"foo"} })

则会得到警告信息

在这里插入图片描述

警告说明:返回的data应该是一个函数在每一个组件实例中

二、组件data定义函数与对象的区别

上面讲到组件data必须是一个函数,不知道大家有没有思考过这是为什么呢?

在我们定义好一个组件的时候,vue最终都会通过Vue.extend()构成组件实例

这里我们模仿组件构造函数,定义data属性,采用对象的形式

function Component(){}
Component.prototype.data = {count : 0
}

创建两个组件实例

const componentA = new Component()
const componentB = new Component()

修改componentA组件data属性的值,componentB中的值也发生了改变

console.log(componentB.data.count)  // 0
componentA.data.count = 1
console.log(componentB.data.count)  // 1

产生这样的原因这是两者共用了同一个内存地址,componentA修改的内容,同样对componentB产生了影响

如果我们采用函数的形式,则不会出现这种情况(函数返回的对象内存地址并不相同)

function Component(){this.data = this.data()
}
Component.prototype.data = function (){return {count : 0}
}

修改componentA组件data属性的值,componentB中的值不受影响

console.log(componentB.data.count)  // 0
componentA.data.count = 1
console.log(componentB.data.count)  // 0

vue组件可能会有很多个实例,采用函数返回一个全新data形式,使每个实例对象的数据不会受到其他实例对象数据的污染

三、原理分析

首先可以看看vue初始化data的代码,data的定义可以是函数也可以是对象

源码位置:/vue-dev/src/core/instance/state.js

function initData (vm: Component) {let data = vm.$options.datadata = vm._data = typeof data === 'function'? getData(data, vm): data || {}...
}

data既能是object也能是function,那为什么还会出现上文警告呢?

别急,继续看下文

组件在创建的时候,会进行选项的合并

源码位置:/vue-dev/src/core/util/options.js

自定义组件会进入mergeOptions进行选项合并

Vue.prototype._init = function (options?: Object) {...// merge optionsif (options && options._isComponent) {// optimize internal component instantiation// since dynamic options merging is pretty slow, and none of the// internal component options needs special treatment.initInternalComponent(vm, options)} else {vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor),options || {},vm)}...}

定义data会进行数据校验

源码位置:/vue-dev/src/core/instance/init.js

这时候vm实例为undefined,进入if判断,若data类型不是function,则出现警告提示

strats.data = function (parentVal: any,childVal: any,vm?: Component
): ?Function {if (!vm) {if (childVal && typeof childVal !== "function") {process.env.NODE_ENV !== "production" &&warn('The "data" option should be a function ' +"that returns a per-instance value in component " +"definitions.",vm);return parentVal;}return mergeDataOrFn(parentVal, childVal);}return mergeDataOrFn(parentVal, childVal, vm);
};

四、结论

  • 根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况
  • 组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData时会将其作为工厂函数都会返回全新data对象

相关内容

热门资讯

九年级你好作文700字【最新... 九年级你好作文700字 篇一初中生活的收获与感悟初中生活即将结束,回首这三年的时光,我仿佛看到了一幅...
初三100多字的优美句子【精... 初三100多字的优美句子 篇一初三,是我们人生中一个重要的阶段。这个阶段的我们正在开始追寻自己的梦想...
向目的地进发初三作文800字... 向目的地进发初三作文800字 篇一目的地,是每个人心中的追求和向往。初三,是每个中学生成长的关键时期...
美味寿司初三作文(最新3篇) 美味寿司初三作文 篇一:探寻寿司的魅力寿司,是一道源自日本的美食,以其精致的制作工艺和独特的口感,在...
师恩难忘初三优秀作文600字... 师恩难忘初三优秀作文600字 篇一师恩难忘初三,是我人生中最难忘的一年。这一年里,我经历了许多事情,...
半瓢初三我沉浮 -初中作文(... 半瓢初三我沉浮 -初中作文 篇一初三,是一个让人充满期待和焦虑的阶段。对于我来说,初三的生活就像是在...
感谢你我的老师初三作文(经典... 感谢你我的老师初三作文 篇一在我初三的这一年里,我结识了许许多多的老师,他们用他们的知识和智慧,引导...
初三毕业留言英文大全(精简3... 初三毕业留言英文大全 篇一Dear Classmates,As we reach the end o...
献给全天下为学生带来温暖的老... 献给全天下为学生带来温暖的老师们初三作文 篇一老师,您是我们成长道路上的指路明灯,是我们学习生活中的...
忘不了的那个人初三作文【精彩... 忘不了的那个人初三作文 篇一那个人,是我初三时候班上的一位同学,他的名字叫李明。李明是一个非常聪明而...
九年级作文我的新老师(优质6... 九年级作文我的新老师 篇一我的新老师我很庆幸在这个学期里遇到了一位特别好的新老师,她就是我们班的班主...
雨夜初三上册语文第一单元作文... 雨夜初三上册语文第一单元作文450字 篇一雨夜初三上册语文第一单元作文450字 篇一 雨夜初三上册语...
初三语文作文(优秀6篇) 初三语文作文 篇一:我的偶像作为一个初三学生,我有许多偶像。他们有的是优秀的运动员,有的是杰出的科学...
初三毕业赠言(通用3篇) 初三毕业赠言 篇一初三毕业了,时间过得真快。回顾这三年的学习生活,我不禁感慨万分。在这里,我想给同学...
我的初三生活作文【精选6篇】 我的初三生活作文 篇一初三,对于每一个初中生来说都是一个重要的阶段。对我而言,初三不仅仅是一个学习的...
写初三的幸福作文500字(优... 写初三的幸福作文500字 篇一初三是学生生活中最为重要的一年,也是最为紧张和忙碌的一年。然而,尽管充...
初三写哈尔滨作文范文【通用6... 初三写哈尔滨作文范文 篇一哈尔滨,一个美丽的城市哈尔滨是我国东北地区的一座美丽城市,也是我最喜欢的城...
初三优秀范文记叙(优选6篇) 初三优秀范文记叙 篇一勇敢面对变化这个寒假,我经历了一次意想不到的变化。爸爸妈妈告诉我他们要搬到另一...
灯初三作文【精彩6篇】 灯初三作文 篇一初三晚上,我和爸爸一起准备放灯笼。我们先去买了一些彩纸、竹签和蜡烛,然后回家开始动手...
我眼中的初三作文800字记叙... 我眼中的初三作文800字记叙文 篇一初三,对于每个初中生来说都是一个特殊的阶段。它意味着告别稚嫩的初...