成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

vue組件中data為啥是函數

原因:防止多個組件實例對象之間共用一個data,產生數據污染;采用函數的形式,initData時會將其作為工廠函數都會返回全新data對象。當將組件中的data寫成一個函數,數據以函數返回值形式定義,這樣每復用一次組件,就會返回一份新的data,擁有自己的作用域,類似于給每個組件實例創建一個私有的數據空間,讓各個組件實例維護各自的數據。

vue組件中data為啥是函數

前端(vue)入門到精通課程,老師在線輔導:聯系老師
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、vue3版,DELL G3電腦。

一、實例和組件定義data的區別

vue實例的時候定義data屬性既可以是一個對象,也可以是一個函數

const app = new Vue({     el:"#app",     // 對象格式     data:{         foo:"foo"     },     // 函數格式     data(){         return {              foo:"foo"         }     } })
登錄后復制

組件中定義data屬性,只能是一個函數

如果為組件data直接定義為一個對象

Vue.component('component1',{     template:`<div>組件</div>`,     data:{         foo:"foo"     }})
登錄后復制

則會得到警告信息

vue組件中data為啥是函數

警告說明:返回的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產生了影響。【學習視頻分享:vue視頻教程、web前端視頻】

如果我們采用函數的形式,則不會出現這種情況(函數返回的對象內存地址并不相同)

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.data   data = 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 options     if (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對象

說明:

  • vue中組件是用來復用的,為了防止data復用,將其定義為函數。

  • vue組件中的data數據都應該是相互隔離,互不影響的,組件每復用一次,data數據就應該被復制一次,之后,當某一處復用的地方組件內data數據被改變時,其他復用地方組件的data數據不受影響,就需要通過data函數返回一個對象作為組件的狀態。

  • 當我們將組件中的data寫成一個函數,數據以函數返回值形式定義,這樣每復用一次組件,就會返回一份新的data,擁有自己的作用域,類似于給每個組件實例創建一個私有的數據空間,讓各個組件實例維護各自的數據。

  • 當我們組件的date單純的寫成對象形式,這些實例用的是同一個構造函數,由于JavaScript的特性所導致,所有的組件實例共用了一個data,就會造成一個變了全都會變的結果。

(學習視頻分享:web前端開發、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
免费无码又爽又刺激激情视频 | 亚洲成人AV在线| 亚洲AV永久无码精品桃花岛| 亚洲熟女乱综合一区二区| 又粗又黄又猛又爽大片APP| 97AV麻豆蜜桃一区二区| OLDGRAANNY日本老熟妇| 俄罗斯人和欧洲人的性格差异| 国产精品久久久久久久久久直播| 国产自偷在线拍精品热乐播AV| 精产国品一二三产区区别在线观看 | 蜜臀av一区二区三区久久| 欧美黑人一级二级巨大久久天堂 | 天堂AV无码大芭蕉伊人AV| 亚洲AⅤ熟女五十路中出| 亚洲午夜福利在线观看| 99在线精品视频高潮喷吹| 荡公乱妇第1章95| 国内精品伊人久久久影视 | 亚洲孕妇精品无码av| 99国精品午夜福利视频不卡| 抖抈探探APP入口免费| 国产在线内射婷婷| 一本久久A精品一区二区| 欧美伊人色综合久久天天| 男人扒开添女人下部免费视频| 国产SUV精品一区二区883| 亚洲性无码AV在线| 玩弄老太婆BBW视频| 麻花传媒MD0076沈芯语在线| 色欲AV综合久久一区二区三区| 久久综合给久久狠狠97色| 和人妻隔着帘子按摩中字| 关灯后在线高清免费观看| 激情视频传媒一区二区| 女色窝人体色777777九色| 天堂А√在线地址中文在线| 亚洲无人区码一码二码三码区别| Y1111111少妇影院无码| 国产啪精品视频网站免费| 乱老熟女成熟50ⅩXXX小| 色噜噜国产精品视频一区二区| 亚洲精品国产成人AV| T66Y地址一地址二满18周岁| 国产精品美女久久久| 麻豆精品一卡2卡三卡4卡免费观| 色综合天天综合网国产| 艳妇乳肉豪妇荡乳| 丰满女教师中文字幕5| 久久久久久久精品免费| 少妇被又大又粗又爽毛片久久黑人 | 熟妇人妻中文AV无码| 亚洲香蕉成人AAAV在线网站 | 欧美XXXXX高潮喷水| 午夜亚洲WWW湿好爽| 91人妻人人澡人人爽人人精品| 国产麻豆精选AV| 欧美成人精品高清在线观看| 亚洲AV成人综合五月天在线观看 | 女儿的朋友5中汉字晋通话| 亚欧洲乱码视频一二三区| AV片在线观看免费| 精品v内射66偷窥| 日本久久夜夜一本婷婷| 亚洲色偷偷综合亚洲AV色欲| 粗大挺进朋友未婚妻| 老牛精品亚洲成AV人片| 无码一区二区三区不卡AV| 99久久精品国产一区二区蜜芽| 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 国产XXXX农村野外高潮HD发| 男生女生一起相差差差30| 亚洲不卡无码AV中文字幕| 菠萝视频高清观看免费6| 久久人人做人人妻人人玩精品HD | 俄罗斯ZOOM与人性ZOOM| 毛茸茸的撤尿正面BBW| 亚洲AV无码成人精品区在线观看| 把女人弄爽特黄A大片片| 狂猛欧美激情性XXXX大豆行情| 亚A∨国AV综AV涩涩涩| 成人无码精品一区二区三区| 蜜桃国产乱码精品一区二区三区| 亚洲AV无码二区鸳鸯影院| 丰满大爆乳波霸奶| 精品无码一区二区三区电影| 色欲人妻AAAAAA无码| 永久免费看照片的聊骚软件| 国产偷国产偷亚洲高清人| 日韩无码蜜桃视频| ATLANTICOCEAN巨大| 久久久综合九色综合鬼色| 亚洲av网站在线| 国产成人免费AV片在线观看 | 国产真人无遮挡作爱免费视频| 色综合色综合久久综合频道88| 99久久免费只有精品国产| 老太奶性BBWBBWBBW| 亚洲欧洲无码一区二区三区| 国产精品自在线拍国产手机版 | 亚洲AV无码国产精品久久| 国产粉嫩嫩00在线正在播放 | 成片人卡1卡2卡3手机免费看| 男人猛躁进女人免费播放| 一本色道久久综合亚洲精品| 中国内地毛片免费高清| 国产AV永久精品无码| 精品国产乱码久久久软件下载| 无码午夜福利片在线观看| 亚洲成AV人片在线观看无码| 国产AⅤ无码专区亚洲AV综合网| 日本丰满少妇高潮XXXX| GAY成年男人露J网站| 某处紧密的结合在一起| 真实国产乱啪福利露脸| 久久久久亚洲AV无码观看| 亚洲乱码精品久久久久| 激情综合色综合久久综合| 亚洲AV无码久久寂寞少妇| 国产精品亚洲VA在线| 无码天堂亚洲国产AV麻豆| 国产成人精品无码播放| 熟女少妇一区二区三区| 高清无码国产黄色视频人爽人一区二区| 人妻天天爽夜夜爽精品视频| FREE性欧美HD另类精品| 欧美日日日日BBBBB视频| CHINESE国产老熟女| 欧美最猛性XXXXX免费| А√天堂BT中文在线| 人人妻人人爽人人爽| 被强迫的爱人 电影| 人人人澡人人人妻人人人精品| 爸爸你不能谢在里面来| 日本少妇三级HD激情在线观看| 成人免费一区二区三区视频 | 凸凹人妻人人澡人人添医| 国产高清自产拍AV在线| 午夜夫妻试看120国产| 国产人成无码视频在线| 亚洲AV性色在线观看| 精品日韩亚洲AV无码| 野花高清完整版免费观看视频大全 | 久久婷婷成人综合色| 伊人色综合一区二区三区影院视频| 九热爱视频精品视频| 一本之道加勒比在线观看| 抖抈APP入口免费| 天天狠天天透天天爱综合| 国产精品亚洲专区无码唯爱网| 亚洲AV激情无码专区在线播放| 河南妇女毛深深的沟WCD| 亚洲一区二区自偷自拍另类| 美女无遮挡免费视频网站| AV无码爆乳护士在线播放| 日本老肥婆BBBWBBBWZR| 国产SUV精品一区二区88L| 小雪第一次交换又粗又大老杨| 精品第一国产综合精品蜜芽| 一二三四在线视频社区8| 你下水好多下水道BD| 波多野结衣TORRENT| 无码人妻 在线视频| 精品人伦一区二区三区蜜桃| 中文字幕久无码免费久久| 人妻中文字幕AV无码专区| 国产成人综合五月天久久| 亚洲成a人蜜臀AV在线播放| 邻居把我弄的高潮三次面舞| JAPANESEHD熟女熟妇伦| 天天摸日日摸狠狠添| 精品久久人人爽人人玩人人妻| 中文字幕一区二区精品区| 日韩精品无码人妻一区二区三区| 国产精品无码久久AV| 亚洲欧洲中文日韩AV乱码| 妺妺窝人体色777777换脸| 饭桌上故意张开腿让公H| 亚洲AV日韩AV高潮无码专区| 麻豆成人久久精品二区三区免费| 班级每人C了我半小时班长| 无码天堂亚洲国产AV| 狂野欧美性猛XXXX乱大交 | 全免费A级毛片免费看无码| 国产精品白丝AV嫩草影院| 亚洲人成在线观看无码| 免费看片A级毛片免费看| 高雅人妻被迫沦为玩物电影BD| 亚洲AV中文无码字幕色最| 女人扒开的小泬高潮喷水小说| 丰满少妇高潮惨叫在线观看| 亚洲欧美在线制服丝袜国产 | 为了升职丈夫把我献给他们领导| 精品人妻一区二区三区免费| AV成人片无码夜色AV大胸| 无码中文字幕VA精品影院| 蜜桃久久精品成人无码AV| 国产V亚洲V天堂A无码久久蜜桃| 亚洲一区二区三区日本久久九| 日本大肚子孕妇交XXX|