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

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

vue初始化data方法有哪些

vue初始化data方法有兩種:1、object方式,語法“var data = { 鍵值對 }”;2、function方式,語法“data: function () {return { 鍵值對 }}”。需要注意組件和extend中的data初始化不能是Object,否則會報錯。組件中data用function方式是為了防止多個組件實例對象之間共用一個data,產生數據污染。

vue初始化data方法有哪些

本教程操作環境:windows7系統、vue3版,DELL G3電腦。

vue data有兩種初始化的方式,function和object,但是這兩種情況適用場景有哪些?能不能通用?帶著這兩個問題咱們一起分析下

data初始化

// 代碼來源于官網示例  // 第一種定義方式 var data = { a: 1 }  // 直接創建一個實例 var vm = new Vue({   data: data })  // Vue.extend() 中 data 必須是函數 var Component = Vue.extend({ // 第二種定義方式   data: function () {     return { a: 1 }   } })
登錄后復制

上述代碼簡單描述了data定義的兩種方式

  • function

  • object

官網demo中也著重說了extend中data初始化不能用object。那么為什么呢?

源碼分析

按照官網demo,Vue.extend中的data初始化不能是Object,如果我們強制寫成Object會出現什么?

var Component = Vue.extend({   data: { a: 1 } })
登錄后復制

運行以后chrome的consolo直接報錯,信息如下

vue.esm.js?efeb:591 [Vue warn]: The "data" option should be a function that returns a per-instance value in component definitions.
登錄后復制

通過分析源碼以及報錯信息,當觸發Vue.extend的時候,他會做一個合并操作,把一個基礎組件(里面vmode, transtion等)和你定義在extend內的信息,通過mergeField往options上合并,當合并到data的時候,他會觸發strats.data,在這個里面會check data是不是一個function,這里需要注意的是filter、components等和data走的是兩套合并流程,詳細的請看代碼注釋,如下

// vue.extend 源碼地址https://github.com/vuejs/vue/blob/dev/src/core/global-api/extend.js    Vue.extend = function (extendOptions: Object): Function {   ...   // 在這里會觸發mergeOptions方法   Sub.options = mergeOptions(       Super.options,       extendOptions     )   ... }  // mergeOptions 源碼地址https://github.com/vuejs/vue/blob/dev/src/core/util/options.js  export function mergeOptions (   parent: Object,   child: Object,   vm?: Component ): Object {   ...    const options = {}   let key   // parent對象內包含components、filter,、directive   for (key in parent) {     mergeField(key)   }   // child對象內對應的是Vue.extend內定義的參數   for (key in child) {     if (!hasOwn(parent, key)) {       mergeField(key)     }   }   function mergeField (key) {   // 這一步是根據傳入的key找到不同的合并策略filter、components、directives用到合并策略是這個方法mergeAssets和data用到的不一樣,當合并到data的時候會進入專屬的合并策略方法內     const strat = strats[key] || defaultStrat     options[key] = strat(parent[key], child[key], vm, key)   } }  // strats.data  源碼地址https://github.com/vuejs/vue/blob/dev/src/core/util/options.js strats.data = function (   parentVal,   childVal,   vm ) {   if (!vm) {   // 如果data不是function的話會直接走下面的報錯信息     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定義為一個對象,因為他們底層都調用了mergeOptions方法

什么時候可以定義成一個對象

在vue初始化的時候,如下

new Vue({   data: {     linke: '//sinker.club'   } })
登錄后復制

意義

ok,上面說了那么多,那么這么做的意義是什么?為什么那幾種情況不可以定義為對象? 其實回答這個問題,需要回到js本身,眾所周知js數據類型分為引用和基本,引用類型包含Object, Array, Function,何為引用類型就不在這里闡述了

  var obj = {link: '//www.sinker.club'}   var obj2 = obj   var obj3 = obj   obj2.link = "//gitlab.sinker.club"   console.log(obj3.link) // "//gitlab.sinker.club"
登錄后復制

上述代碼反應了一個問題,由于obj3和obj2在內存中都是指向一個地址,那么obj2的修改會影響到obj3,當然處理這種問題可以用深copy來做到

  • JSON.parse(JSON.stringify(obj))

  • deepClone(obj)

但是這兩種做法需要開發或者框架每一次都要深copy一次,當數據量大的時候對性能什么都不友好,那么Vue怎么做的呢?把data定義成一個function

function data() {   return {    link: '//sinker.club'   } }  var obj = test() var obj2 = test()  obj2.link ="//gitlab.sinker.club" console.log(obj.link) '//sinker.club'
登錄后復制

為什么這么做?解決的場景是什么呢?

比如我定一個子組件,data是按照對象的方式定義的,這個組件在多個地方引用,如果其中一個引用此組件的data修改了,那么就會造成其余引用此組件的data同時改變, end.

擴展知識:

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方法有哪些

說明:

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

  • vue組件中的data數據都應該是相互隔離,互不影響的,組件每復用一次,data數據就應該被復制一次,之后,當某一處復用的地方組件內data數據被改變時,其他復用地方組件的data數據不受影響,就需要通過data函數返回一個對象作為組件的狀態。

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

  • 當我們組件的date單純的寫成對象形式,這些實例用的是同一個構造函數,由于JavaScript的特性所導致,所有的組件實例共用了一個data,就會造成一個變了全都會變的結果。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产精品人人爽人人做我的可爱| 亚洲综合精品| 香蕉国产精品| 久久中文视频| 久久久五月天| 久久久久网站| 免费观看久久av| 激情视频一区二区三区| 激情欧美亚洲| 在线亚洲成人| 日韩精品一区二区三区免费视频| 午夜久久美女| 在线精品视频在线观看高清| 亚洲精品午夜av福利久久蜜桃| 亚洲永久av| 日韩国产一区二区| 一区免费视频| 中文精品电影| 国产午夜精品一区在线观看| 老色鬼精品视频在线观看播放| 亚洲天堂资源| 婷婷激情久久| 亚洲丝袜啪啪| 欧美精品97| 久久视频精品| 日韩专区视频网站| 九九99久久精品在免费线bt| 亚洲天堂资源| 性色一区二区| 国产欧美日韩亚洲一区二区三区| 色在线视频观看| 男人的天堂久久精品| 蜜臀a∨国产成人精品| 久久国产精品免费一区二区三区| 久久精品官网| 人人精品久久| 高清一区二区| 久久精品国产网站| 在线一区免费| 国产精品大片| 欧美日韩精品一本二本三本| 日韩激情网站| 91久久午夜| 成人福利av| 国产伦一区二区三区| 免费在线观看日韩欧美| 国产成人免费精品| 麻豆久久精品| 欧美/亚洲一区| 你懂的国产精品| 日本一区免费网站| 亚洲小说欧美另类婷婷| 国产精品一卡| 色婷婷成人网| 99国产精品| 亚洲性色视频| 国产91精品对白在线播放| 久久久久久色 | 亚洲一区二区成人| 99久久精品费精品国产| 国产精品巨作av| 欧美午夜网站| 亚洲免费专区| 99视频+国产日韩欧美| 欧美三区四区| 色在线中文字幕| 丝袜诱惑一区二区| 日韩精品1区| 亚洲啊v在线| 蜜臀久久精品| 日韩视频不卡| 亚洲一区二区三区中文字幕在线观看| 另类av一区二区| 99国产精品| 亚洲精品麻豆| 久久激情五月婷婷| 欧美国产先锋| 日韩欧美国产精品综合嫩v| 色婷婷色综合| 国产 日韩 欧美 综合 一区| 国产精品成人一区二区不卡| 日韩av在线免费观看不卡| 日韩高清不卡在线| 午夜亚洲福利在线老司机| 在线看片福利| 久久视频国产| 国产视频欧美| 丝袜美腿成人在线| 日本高清久久| 久久精品国产一区二区| 高清一区二区| 99视频精品全国免费| 欧美aa国产视频| 99久久九九| 自由日本语亚洲人高潮| 亚洲免费激情| 鲁大师成人一区二区三区| 亚洲91精品| 亚洲欧美日韩高清在线| 亚洲精品2区| 免费视频一区二区| 亚洲日韩中文字幕一区| 蜜臀av在线播放一区二区三区| 日韩中文字幕区一区有砖一区| 国产欧美综合一区二区三区| 丝袜美腿诱惑一区二区三区| 91精品国产成人观看| 水蜜桃久久夜色精品一区| 免费一区二区三区在线视频| 麻豆免费精品视频| 欧美私人啪啪vps| 国产亚洲欧美日韩精品一区二区三区 | 亚洲最新无码中文字幕久久| 国产精品极品国产中出| 蜜桃久久久久| 国产欧美二区| 中文另类视频| 另类亚洲自拍| 精品视频国产| 久久久久久婷| 亚洲欧洲美洲国产香蕉| 亚洲欧美日韩专区| 日韩av一区二区在线影视| 日本黄色精品| 亚洲精品欧美| 色爱av综合网| 国产美女视频一区二区| 欧美搞黄网站| 久色成人在线| 日本综合视频| 日本色综合中文字幕| 久久精品91| 久久亚洲黄色| 日韩精品视频在线看| 99热精品久久| 蜜臀久久久99精品久久久久久| 欧美1区2区3| 欧美日韩国产一区精品一区| 国模大尺度视频一区二区| 老牛国产精品一区的观看方式| 97精品久久| 亚洲美女久久精品| 国产精品久久| 亚洲精品国产嫩草在线观看| 日韩精品一级| 视频一区欧美日韩| 久久青青视频| 你懂的国产精品永久在线| 91亚洲精品视频在线观看 | 日韩毛片在线| 欧美经典一区| 老司机精品在线| 国产69精品久久| 黄色在线网站噜噜噜| 少妇精品久久久一区二区| 精品国产一区二区三区av片| 亚洲欧美日韩视频二区| 福利精品一区| 免费在线观看一区| 国产精品对白久久久久粗| 亚洲精品国模| 亚洲最新av| 亚洲精品a级片| 久久精品国产68国产精品亚洲| 精品女同一区二区三区在线观看| 国产精品蜜芽在线观看| 亚洲最新av| 免费欧美一区| 日韩国产专区| sm久久捆绑调教精品一区| 69堂精品视频在线播放| 成人一二三区| 日韩欧美不卡| 欧美日韩精品一本二本三本| 亚洲性视频在线| 久久三级中文| 欧美日韩中文一区二区| 免费人成精品欧美精品| 欧美一区久久| 久草免费在线视频| 九一精品国产| 日韩中出av| av免费不卡国产观看| 亚洲在线国产日韩欧美| 国产伦乱精品| 黄色av一区| 亚洲精品动态| 欧洲精品一区二区三区| 美国三级日本三级久久99| 毛片不卡一区二区| 午夜精品婷婷| 久久精品系列| 日韩中文字幕| 欧美日韩国产欧| 国产一区二区三区四区二区| 视频一区中文字幕国产| 波多野结衣久久精品| 欧美一区二区三区免费看| 婷婷综合在线| 国产精品蜜芽在线观看|