久久精品五月,日韩不卡视频在线观看,国产精品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综合
日本午夜精品视频在线观看| 久久人人99| 中文字幕日本一区| 男女男精品网站| 丝袜美腿高跟呻吟高潮一区| 一区二区三区四区在线观看国产日韩| 亚洲精品少妇| 六月丁香综合在线视频| 五月天av在线| 亚洲激情二区| 欧美日本不卡高清| 欧美精品91| 久久人人精品| 在线视频亚洲欧美中文| 日韩精品第一| 欧美aⅴ一区二区三区视频| 欧美freesex黑人又粗又大| 国产亚洲在线观看| 国产精品99久久免费| 麻豆mv在线观看| 久久福利毛片| 欧美国产免费| 99国内精品| 久久av偷拍| 欧美日韩国产探花| 欧美久久久网站| 日韩一区二区三区免费| 亚洲综合激情在线| 国内不卡的一区二区三区中文字幕| 日本不良网站在线观看| 丝袜美腿亚洲一区| 97精品中文字幕| 亚洲精品在线二区| 91视频久久| 亚洲久久在线| 麻豆成人在线观看| 久久先锋影音| 国产精品国产三级国产在线观看| 午夜欧美精品| 欧美精品91| 丝袜国产日韩另类美女| 国产精品久久久久久久免费观看 | 午夜在线播放视频欧美| 国产调教一区二区三区| 风间由美中文字幕在线看视频国产欧美| 亚洲午夜精品久久久久久app| 国产日韩中文在线中文字幕| 国产一区亚洲| 欧美精品91| 男女男精品网站| 色爱av综合网| 国产一区2区| 青青草91久久久久久久久| 亚洲性图久久| 精品久久国产一区| 久久国内精品自在自线400部| 国产一级久久| 亚洲婷婷在线| 伊人久久高清| 国产精品a级| 日本精品国产| 在线观看免费一区二区| 国产精品国产一区| 国产精品亚洲综合久久| 亚洲视频电影在线| 中文日韩在线| 999国产精品永久免费视频app| 欧美国产另类| 国产欧美日韩在线一区二区| 亚洲影视一区二区三区| 日韩一级网站| 91九色精品国产一区二区| 日韩影院二区| 日韩啪啪电影网| 麻豆精品久久久| 国产精品片aa在线观看| 日韩成人精品一区二区三区| 日韩在线一二三区| 一区在线视频观看| 国产中文一区| 亚洲高清影视| 午夜精品影院| 亚洲欧美日本日韩| 亚洲欧美日韩一区在线观看| 一本一本久久| 欧美专区在线| 天堂成人免费av电影一区| 好看的av在线不卡观看| 99久久99久久精品国产片果冰 | 免费久久精品| 伊人精品一区| 合欧美一区二区三区| 亚洲精品va| 久久高清国产| 美女被久久久| 日韩欧美四区| 日本aⅴ免费视频一区二区三区| 亚洲精品美女91| 欧美日韩91| 国产精品手机在线播放| 麻豆国产精品| 欧美国产另类| 国产成人精品一区二区免费看京| 韩国一区二区三区视频| 日韩成人免费| 欧美中文一区二区| 日韩精品一级二级| 日韩二区在线观看| 久久精品三级| 日韩精品免费一区二区在线观看 | 久久精品青草| 欧美日韩国产精品一区二区亚洲| 久久亚洲色图| 97成人在线| 国产一区二区三区不卡视频网站| 国产一区二区三区四区五区传媒| 亚洲综合在线电影| 六月丁香综合| 国产日韩一区二区三免费高清 | 国产精品香蕉| 天堂中文在线播放| 亚洲欧美日韩专区| 国产精品66| 蜜桃国内精品久久久久软件9| | 麻豆极品一区二区三区| 日本久久综合| 欧美特黄一区| 欧美一区精品| 高清精品久久| 免费国产自线拍一欧美视频| 国产美女亚洲精品7777| 激情视频网站在线播放色| 欧美成人久久| 国产亚洲欧美日韩精品一区二区三区 | 日韩av网站在线观看| 精品91福利视频| 91精品精品| 日韩毛片一区| 超碰超碰人人人人精品| 天堂成人国产精品一区| 精品一区二区三区中文字幕在线| 亚洲激情中文| 久久精品国产网站| 视频一区视频二区中文| 久久精品福利| 美女久久网站| 神马午夜在线视频| 日韩福利视频网| 午夜国产一区二区| 欧美激情三区| 视频在线观看一区| 中文字幕在线高清| 中文不卡在线| 1024精品一区二区三区| 国产精品男女| 欧美一级专区| 久久久久国产| 欧美精品91| 四虎精品一区二区免费| 久久在线视频免费观看| 国产欧美日韩精品一区二区三区| 五月婷婷亚洲| 欧美精选视频一区二区| 国产精品porn| 日本不卡视频在线| 亚洲精品网址| 国产 日韩 欧美一区| 日韩国产精品久久久久久亚洲| 蜜桃tv一区二区三区| 福利视频一区| 国产精品午夜一区二区三区| 一本综合精品| 99在线精品免费视频九九视| 欧美国产偷国产精品三区| 国产欧美午夜| 婷婷成人av| 玖玖精品视频| 99国产精品久久久久久久成人热| www.九色在线| 精品视频一区二区三区四区五区| 日韩久久一区| 日韩中出av| 亚洲深夜av| 午夜精品一区二区三区国产| 国产 日韩 欧美一区| 精品国产欧美日韩一区二区三区| 日韩欧美中文字幕电影| 免费久久99精品国产| 波多野结衣一区| 国产99久久| 91精品蜜臀一区二区三区在线| 亚洲涩涩在线| 日韩在线不卡| 久久狠狠婷婷| 91精品久久久久久久久久不卡| 国产不卡人人| 亚洲电影有码| 精品一区二区三区在线观看视频 | 日韩午夜黄色|