久久精品五月,日韩不卡视频在线观看,国产精品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久久精品在免费线bt| 精品国产91| 日韩激情一区| 99视频精品| 亚洲精品日本| 国产精品亚洲欧美| 成人在线免费观看91| 欧美成人一二区| 成人日韩av| 日本精品在线中文字幕| 免费av一区二区三区四区| 9久re热视频在线精品| 亚洲精品人人| 国产一区福利| 在线成人直播| 欧美日韩xxxx| 播放一区二区| 日本精品久久| 日韩国产激情| 亚洲精选久久| 国产精品字幕| 日韩精品亚洲专区在线观看| 老牛国内精品亚洲成av人片 | 久久国产三级| 久久久久蜜桃| 国产精品亚洲产品| 激情婷婷亚洲| 国产精品欧美大片| 9色精品在线| 国产一区二区三区四区五区传媒| 制服诱惑一区二区| 精品国产欧美日韩| 亚洲精品极品| 狠狠爱成人网| 精品九九在线| 91精品国产经典在线观看| 精品中文字幕一区二区三区 | 亚洲精品系列| 91欧美日韩| 国产视频一区免费看| 国内精品亚洲| 亚洲尤物av| 合欧美一区二区三区| 人在线成免费视频| 国产精品伦一区二区| 婷婷综合国产| 亚洲午夜国产成人| 久久九九99| 日本不卡免费高清视频在线| 国产欧美日韩免费观看| 免费欧美在线视频| 在线综合视频| 蜜芽一区二区三区| 久久都是精品| 天堂va在线高清一区| 蜜臀精品久久久久久蜜臀 | 青青草伊人久久| 日韩精品社区| 日本少妇一区二区| 日韩国产一区二| 日韩精品一二三| 亚洲精品精选| 国产探花一区在线观看| 国产九九精品| 高清日韩欧美| 欧美1区免费| 免费观看在线色综合| 婷婷综合电影| 美腿丝袜在线亚洲一区| 国产一区国产二区国产三区| 日产精品一区二区| 国产高清一区| 日韩av一区二区在线影视| 国产精品观看| 91一区二区三区四区| 六月婷婷综合| 波多野结衣久久精品| 亚洲欧美日韩国产| 国产欧美成人| 免费高潮视频95在线观看网站| 波多野结衣一区| 久久国产婷婷国产香蕉| 久久夜夜操妹子| 亚洲人成精品久久久| 韩日一区二区| 日韩精品一级中文字幕精品视频免费观看| 7777精品| 日韩不卡视频在线观看| 亚洲人妖在线| 久久美女精品| 国产伦一区二区三区| 久久高清免费| 国产精品1luya在线播放| 国产一区欧美| 精品国产aⅴ| 亚洲91在线| 欧美亚洲国产精品久久| 欧美日韩精品一区二区三区视频| 久久一区二区三区喷水| 欧美精品导航| 亚洲精品韩国| 亚洲电影在线一区二区三区| 麻豆精品久久久| 日韩黄色av| 亚洲激情婷婷| yellow在线观看网址| 69堂免费精品视频在线播放| 国产精品色网| 欧美二区视频| 成人久久久久| 神马久久午夜| 国产成人精品福利| 久久不见久久见国语| 亚洲精品韩国| 日韩一区二区三区精品视频第3页| 激情欧美亚洲| 亚洲欧洲一区| 久久不射中文字幕| 视频在线观看一区二区三区| 蜜臀av免费一区二区三区| 麻豆国产91在线播放| 国产精品一区二区av日韩在线| 97成人在线| 免费在线播放第一区高清av| 麻豆成人91精品二区三区| 国产精品99久久免费| 精品一区二区三区中文字幕| 久久中文在线| 六月婷婷综合| 国产国产精品| 日韩亚洲国产欧美| 日韩在线一二三区| 日韩成人精品一区二区三区| 国产探花一区| 久久免费视频66| 成人国产精品久久| 91看片一区| 日韩在线卡一卡二| 国产精品主播| 美女网站视频一区| 先锋亚洲精品| 国产欧美亚洲一区| 97视频热人人精品免费| 亚洲精品小说| 国产麻豆一区| 欧美久久精品一级c片| 综合一区av| 精品国产免费人成网站| 久久大逼视频| 国产成人免费av一区二区午夜| av日韩中文| 蜜臀久久99精品久久久久宅男 | 精品在线91| 91成人在线| 日韩午夜精品| 国产一区日韩| 蜜桃久久久久久| 四虎成人av| 日本在线视频一区二区| 日韩精品看片| 国产精品99久久免费| 亚洲一区日韩在线| 精品三级av| 日本a口亚洲| 影视先锋久久| 国产精品18| 亚洲资源网站| 亚洲免费高清| 欧美不卡高清一区二区三区| 国产精品久久乐| 日韩免费精品| 久久国产成人午夜av影院宅| 国产精品久久久久久妇女| 爽好多水快深点欧美视频| 四虎影视精品| 欧美天堂视频| 91一区二区三区四区| 国产日韩中文在线中文字幕| 日韩视频一区| 97精品国产| 国产aⅴ精品一区二区三区久久| 97成人超碰| 国产欧美日韩综合一区在线播放| 亚洲精品日韩久久| 视频一区中文字幕国产| 九九久久电影| 黑丝一区二区三区| 激情丁香综合| 亚洲欧美日韩高清在线| 亚洲精品成人| 国产一区91| 亚洲九九精品| 欧美中文一区| 久久99影视| 精品免费av一区二区三区|