成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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產生了影響?!緦W習視頻分享: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號
狠狠躁天天躁夜夜躁婷婷| 国产一区二区三区在线电影| 国产精品V片在线观看不卡| 国产精品内射后入合集| 国产亚洲AV片在线观看播放| 精JAVAPARSER乱偷| 久碰人妻人妻人妻人妻人掠| 欧美老熟妇欲乱高清视频| 人人妻人人妻人人片色AV| 色婷婷一区二区三区四区成人网| 天堂中文在线资源| 亚洲国产成人久久综合电影| 影音先锋女人AV女色资源| FREE护士XXXXⅩONHD| 东京热无码人妻系列综合网站| 国产精品线在线精品| 久久99精品久久久久久水蜜桃| 免费中文无码AV动作片| 日韩GAY小鲜肉啪啪18禁| 亚瑟国产精品久久| 游泳教练在水里含我奶小说| 锕锕锕锕锕WWW湿透了10秒| 国产精品国产亚洲精品看不卡 | 久久亚洲春色中文字幕久久久| 欧美日韩亚洲中文字幕二区| 婷婷蜜桃国产精品| 亚洲伊人成无码综合影院| FREE性满足孕妇VⅠDE0S| 国产精品久久久久精品香蕉爆乳| 精品一区二区三区无码免费直播| 欧美高清熟妇啪啪内射不卡自拍 | 国产成人亚洲精品无码H在线| 精品国产Ⅴ无码大片在线观看| 免费无码AV片在线观看| 他扒开内裤把舌头进去会有影响吗| 亚洲AV综合色区无码二区偷拍| 最新国产AⅤ精品无码| 夫妻毛片盗摄国产内射| 精品一区二区AV天堂| 人和畜禽CROPROATION| 性色AⅤ一二三天美传媒| 18黑白丝水手服自慰喷水网站| 公车上双乳被老汉揉搓玩弄漫画 | 日韩欧美人妻系列中文字幕一区二区三区 | 制服 丝袜 人妻 专区一本| 吃瓜网51CG7爆料| 精品人妻无码视频一区二区三区| 人妻AV无码专区| 亚洲插肏熟女人妇的屄网址| CAOPORN国产精品免费| 国产无遮挡裸体免费直播| 女儿国在线观看免费版高清| 性做久久久久久免费观看| 97久久综合亚洲色HEZYO| 国产欧美日韩精品丝袜高跟鞋 | 18禁真人床震无遮挡免费| 国产精品久久久久久久久电影网 | FREEZEFRAME丰满老妇| 国产一卡二卡四卡无卡免费| 欧美体内SHE精视频| 亚洲国产成人无码AV在线播放| YSL千人千色8610| 精品综合久久久久久97| 日韩精品无码免费一区二区三区| 亚洲欧洲日产国码无码APP| 成人日韩熟女高清视频一区| 久久久久久久亚洲AV无码| 丝袜一区二区三区在线播放| 中文国产成人精品久久不卡| 国产精品无码AⅤ精品影院| 欧美黑人男士和白人美女a级黄片视频在线播放 | 看国产一毛片在线看手机看| 无码人妻一区二区三区密桃手机版| 337P粉嫩日本欧洲亚洲大胆艺 | 各种少妇BBW撒尿| 美女裸体跪姿扒开屁股无内裤| 亚洲AⅤ爽爽香蕉久久影片| 波多野结衣放荡的护士| 拒嫁豪门少奶奶99次出逃| 亚洲AV无码乱码在线观看牲色| 成人精品视频一区二区| 蜜臀AⅤ免费网站| 亚洲国产精品久久久久久无码 | 久久精品国产精品亚洲精品| 玩两个丰满老熟女久久网| 一本大道无码日韩精品影视_| 国产成人精品免费视频大全软件 | 超级黄18禁色惰网站| 久久综合综合久久综合| 亚洲AV无码专区国产乱码APP| 暗交拗一区二区三区| 久久综合狠狠综合久久综| 亚洲AV成人无码网天堂| 成人拳交喷水在线播放| 欧美成人精品视频在线观看| 亚洲人成色777777在线观看| 国产成人一区二区三区| 热RE99久久6国产精品免费| 亚洲人成网站18禁止大APP| 国产性生交XXXXX免费| 日小骚B少妇真舒服| 999久久久国产精品消防器材| 精品无码日韩一区二区三区不卡| 无码国产色欲XXXXX视频| 成人国产亚洲精品A区天堂| 乱码精品一卡2卡二卡三| 亚洲精品无码AV专区最新| 国产精品乱子乱XXXX| 色噜噜狠狠色综合久色AⅤ网视频| 97精品依人久久久大香线蕉97| 久久精品国产精品国产一区| 偷窥妇科TUBESEX妇| 绯色av一区二区| 人妻内射.PORN| 99久久精品午夜一区二区| 久青草国产97香蕉在线视频| 亚洲乱妇老熟女爽到高潮的片| 国产睡熟迷奷系列网站| 无码男男作爱G片在线观看| 丰满少妇高潮惨叫久久久| 欧产日产国产精品| 18禁H漫免费漫画无码网站国产| 久久久久久久性潮| 亚洲色大成网站WWW| 河南妇女毛浓浓BW| 亚洲AV色一区二区三区蜜桃| 国产精品无码久久久久久| 太太你也不想你丈夫被开除吧| 成人午夜视频精品一区| 人与禽交VIDEOSGRATI| BBW厕所白嫩BBWXXXX| 女人偷拍厕所69XXXXXWW| 中国女人内射6XXXXX| 久久精品人妻一区二区三区| 亚洲乱妇老熟女爽到高潮的片| 黄 色 网 站 免 费 涩涩屋| 亚洲AV无码一区二区三区天堂古| 国产又粗又猛又爽又黄的网站| 午夜成人爽爽爽视频在线观看| 国产精品一国产精品一K频道| 忘忧草在线社区日本WWW| 国产成人无码AA精品一区 | 啊灬啊别停灬用力啊公视频| 人妻丰满AV无码中文字幕| 边吃奶边扎下面动态| 日韩人妻无码一区二区三区| 妇女性内射冈站HDWWW000| 无码国产精品一区二区免费式芒果| 国产精品无码AV一区二区三区| 午夜美女裸体福利视频| 国产亚洲欧美日韩二三线| 亚洲不乱码卡一卡二卡4卡5卡| 精产国品一二三产区区别在线观看 | 久久久噜噜噜久久中文字幕色伊伊| 一起碰一起噜一起| 里面也请好好疼爱第三季| 2019日韩中文字幕MV| 欧美精品九九99久久在免费线| А√天堂资源官网在线资源| 日本成熟少妇喷浆在线观看| MM131亚洲国产美女久久| 少妇ⅩXXOOOZZXXHD| 国产精品日日摸夜夜添夜夜添20| 亚洲 暴爽 AV人人爽日日碰| 久久精品国产99国产精偷| 中文无码人妻有码人妻中文字幕 | A级毛片免费观看网站| 日产无码精品一区二区三区| 国产精品55夜色66夜色| 亚洲AV无码专区在线播放中文 | √天堂资源中文WWW| 日本高清视频网站WWW| 国产精品成人久久久久久久| 亚洲AV无码久久久久网站蜜桃| 久久精品亚洲熟妇少妇任你躁 | 大哥的女人中文字幕完整版| 无码人妻AV一区二区三区蜜臀| 国产一码二码三码区别| 一本一道人人妻人人妻| 青草伊人久久综在合线亚洲| 国产AV露脸一线国语对白| 亚洲AV无码久久寂寞少妇多毛| 精品国产乱码久久久久夜深人妻 | 亚洲综合国产精品无码AⅤ| 老外免费CSGO交易网站下载| ンピースのエロス在线WWW| 婷婷五月深爱憿情网六月综合| 护士的小嫩嫩好紧好爽| 13小箩利洗澡无码视频网站| 欧美肉欲XXⅩOOOHD| 国产丰满麻豆VIDEOSSEX| 亚洲日产韩国一二三四区| 欧美精品久久久久久精品爆乳| 国产成人精品午夜福利| 亚洲国产精品尤物YW在线观看| 久久综合亚洲鲁鲁五月天| 厨房里的激战2免费观看不打丐赛| 亚洲AV无码一区二区二三区下载| 免费中国帅气体育生GARY| 国产精品一国产精品|