gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

vue組件中data為啥是函數(shù)

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

vue組件中data為啥是函數(shù)

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

本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

一、實(shí)例和組件定義data的區(qū)別

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

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

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

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

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

則會得到警告信息

vue組件中data為啥是函數(shù)

警告說明:返回的data應(yīng)該是一個函數(shù)在每一個組件實(shí)例中

二、組件data定義函數(shù)與對象的區(qū)別

上面講到組件data必須是一個函數(shù),不知道大家有沒有思考過這是為什么呢?

在我們定義好一個組件的時候,vue最終都會通過Vue.extend()構(gòu)成組件實(shí)例

這里我們模仿組件構(gòu)造函數(shù),定義data屬性,采用對象的形式

function Component(){   } Component.prototype.data = { 	count : 0 }
登錄后復(fù)制

創(chuàng)建兩個組件實(shí)例

const componentA = new Component() const componentB = new Component()
登錄后復(fù)制

修改componentA組件data屬性的值,componentB中的值也發(fā)生了改變

console.log(componentB.data.count)  // 0 componentA.data.count = 1 console.log(componentB.data.count)  // 1
登錄后復(fù)制

產(chǎn)生這樣的原因這是兩者共用了同一個內(nèi)存地址,componentA修改的內(nèi)容,同樣對componentB產(chǎn)生了影響?!緦W(xué)習(xí)視頻分享:vue視頻教程、web前端視頻】

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

function Component(){ this.data = this.data() } Component.prototype.data = function (){     return {    count : 0     } }
登錄后復(fù)制

修改componentA組件data屬性的值,componentB中的值不受影響

console.log(componentB.data.count)  // 0 componentA.data.count = 1 console.log(componentB.data.count)  // 0
登錄后復(fù)制

vue組件可能會有很多個實(shí)例,采用函數(shù)返回一個全新data形式,使每個實(shí)例對象的數(shù)據(jù)不會受到其他實(shí)例對象數(shù)據(jù)的污染

三、原理分析

首先可以看看vue初始化data的代碼,data的定義可以是函數(shù)也可以是對象

源碼位置:/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 || {}     ... }
登錄后復(fù)制

data既能是object也能是function,那為什么還會出現(xiàn)上文警告呢?

別急,繼續(xù)看下文

組件在創(chuàng)建的時候,會進(jìn)行選項的合并

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

自定義組件會進(jìn)入mergeOptions進(jìn)行選項合并

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       )     }     ...   }
登錄后復(fù)制

定義data會進(jìn)行數(shù)據(jù)校驗

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

這時候vm實(shí)例為undefined,進(jìn)入if判斷,若data類型不是function,則出現(xiàn)警告提示

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); };
登錄后復(fù)制

四、結(jié)論

根實(shí)例對象data可以是對象也可以是函數(shù)(根實(shí)例是單例),不會產(chǎn)生數(shù)據(jù)污染情況

組件實(shí)例對象data必須為函數(shù),目的是為了防止多個組件實(shí)例對象之間共用一個data,產(chǎn)生數(shù)據(jù)污染。采用函數(shù)的形式,initData時會將其作為工廠函數(shù)都會返回全新data對象

說明:

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

  • vue組件中的data數(shù)據(jù)都應(yīng)該是相互隔離,互不影響的,組件每復(fù)用一次,data數(shù)據(jù)就應(yīng)該被復(fù)制一次,之后,當(dāng)某一處復(fù)用的地方組件內(nèi)data數(shù)據(jù)被改變時,其他復(fù)用地方組件的data數(shù)據(jù)不受影響,就需要通過data函數(shù)返回一個對象作為組件的狀態(tài)。

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

  • 當(dāng)我們組件的date單純的寫成對象形式,這些實(shí)例用的是同一個構(gòu)造函數(shù),由于JavaScript的特性所導(dǎo)致,所有的組件實(shí)例共用了一個data,就會造成一個變了全都會變的結(jié)果。

(學(xué)習(xí)視頻分享:web前端開發(fā)、編程基礎(chǔ)視頻)

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
狠狠精品干练久久久无码中文字幕| 亚洲国产日韩欧美在线观看| 五月天激情播播| 亚洲乱码国产一区三区| 国产性xxxx18免费观看视频| 亚洲不卡中文字幕无码| 国产精彩视频一区二区| 国产玉足脚交久久欧美| 人妻少妇精品无码专区二区 | 91亚洲精品国产| 青青在线免费视频| 久久手机在线视频| 久久久999视频| 男女超爽视频免费播放| 91免费视频网站在线观看| av免费网站观看| 午夜福利123| 国产欧美精品aaaaaa片| 日本精品一区在线观看| 成人性生交免费看| 99久久久无码国产精品性色戒| gogogo免费高清日本写真| 男人日女人的bb| 日韩一级性生活片| 国产视频在线视频| 手机在线观看日韩av| 国产成人在线小视频| 妞干网在线免费视频| 想看黄色一级片| 无码人妻少妇伦在线电影| 精品国产免费av| 中文字幕在线观看日| 免费cad大片在线观看| 欧美成人免费高清视频| 国产探花在线观看视频| 欧美精品一区免费| 伊人色在线观看| 老子影院午夜伦不卡大全| 九九热精品在线播放| 国产精品久久久久9999爆乳| 成年人网站大全| 精品国偷自产一区二区三区| 一本色道久久亚洲综合精品蜜桃 | 麻豆av免费在线| 无码熟妇人妻av在线电影| 波多野结衣天堂| 国产精品自拍片| 狠狠精品干练久久久无码中文字幕 | 小泽玛利亚av在线| 天天操天天干天天做| 成人在线观看黄| 你懂的av在线| 国产黄色激情视频| 色乱码一区二区三区熟女| 亚洲激情在线观看视频| 日韩中文字幕三区| 久久成人福利视频| 一二三四中文字幕| 中文字幕第50页| 中文字幕55页| 成人免费看片视频在线观看| 亚洲色图 在线视频| 丁香婷婷激情网| 成人免费毛片播放| 无码少妇一区二区三区芒果| 黄色免费视频大全| 国模无码视频一区二区三区| 日本在线视频www色| 99精品视频免费版的特色功能| 免费在线观看的毛片| 亚洲黄色a v| 亚洲天堂网一区| 午夜一区二区视频| 丰满女人性猛交| 久久久国内精品| 播放灌醉水嫩大学生国内精品| 久久久亚洲精品无码| 国产中文字幕在线免费观看| 精品国产一二三四区| 成人毛片视频网站| 免费看黄色一级大片| 国产视频1区2区3区| 桥本有菜av在线| 久久综合久久网| 亚洲综合在线网站| 91高清国产视频| 老司机午夜免费福利视频| 国产婷婷一区二区三区| 中文字幕第80页| 特级黄色录像片| 日韩av综合在线观看| 中文字幕国产传媒| 欧美a级免费视频| 成人午夜视频免费在线观看| 午夜大片在线观看| 日韩精品一区二区三区久久| www.日本一区| 成年人午夜视频在线观看| 伊人色在线观看| 霍思燕三级露全乳照| 色婷婷成人在线| 国产原创中文在线观看| 啊啊啊国产视频| 国产高清www| 亚洲制服中文字幕| 欧美牲交a欧美牲交aⅴ免费真 | 日韩伦理在线免费观看| 我要看一级黄色大片| 日韩a级黄色片| 亚洲视频一二三四| 国内性生活视频| www.在线观看av| 亚洲天堂av一区二区三区| 国产淫片av片久久久久久| 丰满人妻一区二区三区53号 | 日本精品一区二区三区四区 | 欧美视频第三页| 女同性恋一区二区| 久久久久久久久久一区二区| 69堂免费视频| 成人免费网站入口| 国产91porn| 三级在线免费观看| 国内av免费观看| 九九热99视频| 老司机久久精品| 亚洲一级片av| 天堂av2020| 热久久久久久久久| 99精品视频国产| av在线网址导航| 国产在线观看中文字幕| 99国产精品久久久久久| 一级黄色片在线免费观看| 亚洲77777| 一本色道久久亚洲综合精品蜜桃 | 8x8x华人在线| 国产一区二区三区小说| 男女日批视频在线观看| 精品人妻人人做人人爽| 成人在线观看毛片| 热久久最新地址| av在线播放天堂| 黑森林福利视频导航| a在线观看免费视频| 五月天视频在线观看| 在线播放黄色av| 特级西西444| 国产美女主播在线播放| 国产精品亚洲a| 三区视频在线观看| 99久久免费观看| 爱福利视频一区二区| 在线免费观看视频黄| 男女污污视频网站| 丰满少妇大力进入| 亚洲色图久久久| 四虎免费在线观看视频| av之家在线观看| 国产精品自在自线| 三上悠亚久久精品| 亚洲男人天堂av在线| 9色porny| 亚洲一区在线不卡| 日韩精品一区二区三区四| 韩国日本在线视频| 在线观看视频黄色| 日韩久久一级片| 青少年xxxxx性开放hg| 久久精品国产sm调教网站演员| 天天操天天爱天天爽| 国产乱子伦精品视频| 91极品视频在线观看| 女人和拘做爰正片视频| 不用播放器的免费av| 日本精品免费在线观看| 天天干天天色天天爽| www.日日操| av日韩一区二区三区| 影音先锋男人的网站| 男女啪啪网站视频| 国产主播自拍av| 免费观看亚洲视频| 欧美激情国内自拍| 网站一区二区三区| 久久国产成人精品国产成人亚洲| 久久婷婷中文字幕| 中文字幕在线观看第三页| 欧美成人三级在线视频| 男人的天堂avav| 日韩精品福利片午夜免费观看| 国产乱女淫av麻豆国产| 奇米影视四色在线| 白嫩少妇丰满一区二区| 干日本少妇首页| 久久久精品在线视频| 欧美xxxxx在线视频| 国产日韩一区二区在线观看| avav在线看| 亚洲精品一二三四五区|