久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
中文字幕日韩亚洲| 欧美日韩免费观看视频| 视频一区免费在线观看| 天海翼亚洲一区二区三区| 欧美日一区二区三区在线观看国产免 | 久久先锋影音| 久久国际精品| 偷拍精品精品一区二区三区| 久久久亚洲一区| 亚洲欧美日本视频在线观看| 欧美日韩中出| 免费在线小视频| 在线观看视频免费一区二区三区| 国产精品午夜一区二区三区| 日韩精品欧美| 日韩福利视频导航| 人人香蕉久久| 97se亚洲| 日韩精品一区二区三区免费观看| 伊人久久亚洲| а√在线中文在线新版| 日韩中文字幕区一区有砖一区 | 日韩欧美精品一区二区综合视频| 久久av日韩| 黄色欧美日韩| 免费日韩成人| 亚洲深夜福利| 美女久久精品| 视频一区欧美精品| 日韩av有码| 综合亚洲视频| 麻豆网站免费在线观看| 蜜桃传媒麻豆第一区在线观看| 久久麻豆视频| 亚洲在线观看| 国产一区国产二区国产三区 | 日韩欧美中文字幕电影| 三上悠亚国产精品一区二区三区 | 在线亚洲成人| 欧美成人一二区| 在线一区电影| 另类小说一区二区三区| 视频一区二区国产| 国产综合色区在线观看| 日韩精品福利一区二区三区| 88xx成人免费观看视频库| 国产日韩1区| 亚洲一区二区免费看| 水蜜桃精品av一区二区| 青草av.久久免费一区| 国产精品99免费看| 另类欧美日韩国产在线| 日韩精品一级二级| 亚洲天堂黄色| 国产精品99一区二区三| 亚洲精品成a人ⅴ香蕉片| 日韩精品一区二区三区免费观看| 欧美视频一区| 视频一区在线播放| 99久久99视频只有精品 | 激情久久99| 国产亚洲精品美女久久 | 久久精品国内一区二区三区水蜜桃| 国产日韩一区二区三区在线 | 久久国产三级精品| 中文不卡在线| 一区二区三区四区在线看| 成人日韩av| 国产伦精品一区二区三区千人斩 | 色偷偷偷在线视频播放| 麻豆国产精品| 日韩不卡一区二区三区 | 日韩激情网站| 综合色一区二区| 免费看黄色91| 石原莉奈在线亚洲二区| 免费看的黄色欧美网站| 国产高清久久| 99久久九九| 日韩在线精品| 亚洲永久av| 日韩欧美午夜| 日韩久久精品网| 成人国产精品| 国产成人a视频高清在线观看| 国产精品欧美日韩一区| 91精品国产自产精品男人的天堂| 免费一区二区视频| 免费人成在线不卡| 一本一道久久a久久| 99视频一区| 影院欧美亚洲| 欧美日韩精品免费观看视频完整| 欧美不卡视频| 亚洲精品1区| aa国产精品| 久久av在线| 亚洲香蕉久久| 日韩精品午夜视频| 日本欧美大码aⅴ在线播放| 日韩高清欧美激情| 欧美一区二区三区久久精品| 四虎国产精品免费久久| 色狠狠一区二区三区| 亚洲日本三级| 日本在线不卡视频一二三区| 日韩av午夜在线观看| 国产精品久久久久久av公交车| 国产激情一区| 色综合五月天| 久久久国产精品一区二区中文| 成人在线网站| 亚洲激情av| 亚洲香蕉视频| 91欧美日韩在线| 国产精品亚洲综合色区韩国| 美女精品视频在线| 日韩一区欧美| 国产精品日本欧美一区二区三区| 一区二区国产在线| 国产精品xxx在线观看| 成人黄色av| 午夜精品免费| 香蕉久久久久久| 国产精品一级| 欧美丰满日韩| 欧美日韩国产高清电影| 免费在线观看一区二区三区| 亚洲三级观看| 狂野欧美性猛交xxxx| 欧美aa在线观看| 亚洲一区成人| 国产欧美一区二区三区精品观看| 高清久久一区| 99热免费精品| 欧美午夜三级| 国产激情在线播放| 欧美专区一区二区三区| 国产乱码精品一区二区三区亚洲人| 成人国产精品一区二区免费麻豆| 久久麻豆精品| 日韩激情精品| 精品日韩视频| 亚洲综合五月| 国产成人久久精品一区二区三区| 在线精品视频在线观看高清| 91av一区| 久久精品国产www456c0m| 日韩国产精品久久久久久亚洲| a天堂资源在线| 美美哒免费高清在线观看视频一区二区 | 日本综合精品一区| 日本蜜桃在线观看视频| 中文精品在线| 美女高潮久久久| 午夜国产欧美理论在线播放 | 亚洲国产一区二区在线观看| 成人在线黄色| 午夜精品免费| 日韩高清在线不卡| 国产成人精品一区二区免费看京| 欧美日韩一二| 久久永久免费| 亚洲毛片在线免费| 成人片免费看| 免费日韩av| 日韩.com| 91欧美精品| 亚洲二区免费| 国产精品美女午夜爽爽| av亚洲免费| 国产极品一区| 日韩精品一二三| 国产精品美女午夜爽爽| 中文字幕系列一区| 亚洲三级精品| 日本不卡免费高清视频在线| 国产毛片一区| 精品三级久久久| 久久亚洲欧洲| 中文一区二区| 国产精品亚洲综合在线观看| 性一交一乱一区二区洋洋av| 国产一区调教| 国产日韩欧美一区在线| 视频一区在线视频| 亚洲天堂黄色| 国产精品专区免费| 国产精品久久久久久久久久久久久久久 | 日韩不卡一区二区| 欧美日韩国产综合网| 丰满少妇一区| 日韩精品视频在线看| 欧美va亚洲va日韩∨a综合色| 精品国产午夜肉伦伦影院 | 亚洲国产专区校园欧美| 国产 日韩 欧美 综合 一区| 国产精品视频首页| 日本精品另类| 亚洲欧洲国产精品一区|