最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue響應(yīng)式原理深入解析及注意事項(xiàng)

 更新時(shí)間:2017年12月11日 15:00:05   作者:miko  
Vue 最顯著的一個(gè)功能是響應(yīng)系統(tǒng) —— 模型只是普通對(duì)象,修改它則更新視圖。下面這篇文章主要給大家深入講解了關(guān)于Vue的響應(yīng)式原理,以及Vue響應(yīng)式的一些注意事項(xiàng),需要的朋友下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Vue最明顯的特性之一便是它的響應(yīng)式系統(tǒng),其數(shù)據(jù)模型即是普通的 JavaScript 對(duì)象。而當(dāng)你讀取或?qū)懭胨鼈儠r(shí),視圖便會(huì)進(jìn)行響應(yīng)操作。文章簡(jiǎn)要闡述下其實(shí)現(xiàn)原理,如有錯(cuò)誤,還請(qǐng)不吝指正。下面話(huà)不多說(shuō)了,來(lái)隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

響應(yīng)式data

<div id = "exp">{{ message }}</div>
const vm = new Vue({
 el: '#exp',
 data: {
 message: 'This is A'
 }
})
vm.message = 'This is B' // 響應(yīng)式
vm._message = 'This is C' // 非響應(yīng)式

上述代碼中,data是Vue實(shí)例的數(shù)據(jù)對(duì)象,當(dāng)實(shí)例初始化時(shí),Vue 會(huì)遍歷 data 中的所有屬性,并且使用 Object.definePropery 把這些屬性全都轉(zhuǎn)為 getter/setter ,從而讓 data 的屬性能夠響應(yīng)數(shù)據(jù)變化。另外,Object.defineProperty 是 ES5 中一個(gè)無(wú)法 shim(墊片) 的特性,這也就是為什么 Vue 不支持 IE8 以及更低版本瀏覽器的原因。對(duì)象必須是純粹的對(duì)象 (含有零個(gè)或多個(gè)的 key/value 鍵值對(duì)):瀏覽器 API 創(chuàng)建的原生對(duì)象。所以,在data中聲明過(guò)的message是響應(yīng)式數(shù)據(jù),而由于_message是在data外使用 Vue 實(shí)例增加的數(shù)據(jù),所以亦不屬于響應(yīng)式。

關(guān)于Object.definePropery

Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回這個(gè)對(duì)象。這個(gè)API是實(shí)現(xiàn)響應(yīng)式數(shù)據(jù)的關(guān)鍵所在。

Syntax: Object.defineProperty(obj, prop, descriptor)

  • obj: 要定義屬性的對(duì)象
  • prop: 要定義或修改的屬性的名稱(chēng)
  • descriptor: 將被定義或修改的屬性描述符。

Tips: 要知道ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪(fǎng)問(wèn)器屬性。這里的descriptor可取值有數(shù)據(jù)屬性和訪(fǎng)問(wèn)器屬性。

數(shù)據(jù)屬性: 包含一個(gè)數(shù)據(jù)值的位置,在此位置可以進(jìn)行讀寫(xiě)操作,有以下特性:

  • [[Configurable]]:對(duì)屬性的操作可配置性開(kāi)關(guān),如刪除,修改。默認(rèn)值為true。
  • [[Enumberble]]:是否可枚舉(通過(guò)for-in)。默認(rèn)值為true。
  • [[Writable]]:能否修改屬性的值。默認(rèn)值為true。
  • [[value]]:包含這個(gè)屬性的數(shù)據(jù)值,讀取時(shí)從該位置讀,寫(xiě)入時(shí)把新值存到該位置。默認(rèn)值為undefined。

訪(fǎng)問(wèn)器屬性: 不包含數(shù)據(jù)值,包含一個(gè)函數(shù)對(duì)(getter/setter)。特性如下:

  • [[Configurable]]:對(duì)屬性的操作可配置性開(kāi)關(guān),如刪除,修改。默認(rèn)值為true。
  • [[Enumberble]]:是否可枚舉(通過(guò)for-in)。默認(rèn)值為true。
  • [[Get]]:讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined。
  • [[Set]]:寫(xiě)入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined。

Tips: 在讀取訪(fǎng)問(wèn)器屬性時(shí),就會(huì)調(diào)用getter函數(shù),該函數(shù)負(fù)責(zé)返回有效的值;在寫(xiě)入訪(fǎng)問(wèn)器屬性時(shí),會(huì)調(diào)用setter函數(shù)

并傳入新值,該函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù),但是這兩個(gè)函數(shù)不一定非要同時(shí)存在。Vue便是利用getter/setter這一特性來(lái)實(shí)現(xiàn)的響應(yīng)系統(tǒng)。

示例代碼:

// 定義一個(gè)book對(duì)象,_year和edition都屬于數(shù)據(jù)屬性。
var book = {
 _year : 2004,
 edition : 1
};
// 對(duì)book對(duì)象創(chuàng)建 year 訪(fǎng)問(wèn)器屬性。
Object.defineProperty(book, "year",{ 
 // 讀取 year 訪(fǎng)問(wèn)器屬性時(shí),get() 方法返回 _year 的值。
 get : function () {
 console.info(this._year, 'get'); // 2004
 return this._year;
 },
 // 寫(xiě)入 year 訪(fǎng)問(wèn)器屬性時(shí),set() 方法對(duì)新值進(jìn)行操作。
 set : function (newValue) {
 if (newValue > 2004) {
 this._year = newValue;
 console.info(this._year, 'set') // 2005 
 this.edition += newValue - 2004;
 }
 }
});
// 讀取 year 訪(fǎng)問(wèn)器屬性時(shí)會(huì)返回_year的值。
book.year;
// 寫(xiě)入 year 訪(fǎng)問(wèn)器屬性時(shí)會(huì)調(diào)用set() 函數(shù),進(jìn)行操作。
book.year = 2005; 
console.info(book.edition) // 2
console.info(book) // 此處藏有彩蛋。

watcher

官方表述:每個(gè)組件實(shí)例都有相應(yīng)的 watcher 實(shí)例對(duì)象,它會(huì)在組件渲染的過(guò)程中把屬性記錄為依賴(lài),之后當(dāng)依賴(lài)項(xiàng)的 setter 被調(diào)用時(shí),會(huì)通知 watcher 重新計(jì)算,從而致使它關(guān)聯(lián)的組件得以更新。

如下圖所示:

Tips:模板中每個(gè)指令/數(shù)據(jù)綁定都有一個(gè)對(duì)應(yīng)的 watcher 對(duì)象。其中 watcher扮演的角色相當(dāng)于是一個(gè)紐帶,這個(gè)紐帶的作用就是依賴(lài)收集。

變化檢測(cè)

      1·(Object.observe的廢棄),Vue不能檢測(cè)對(duì)象屬性的添加或刪除,因此屬性必須在data對(duì)象上,但是可以使用Vue.set(Object,key,value) 來(lái)將響應(yīng)屬性添加到對(duì)象上 (vm.$set 實(shí)例方法Vue.set全局方法)。

      2.使用(Object.assign() 或者_.extend() )方法添加屬性,不會(huì)觸發(fā)更新,這時(shí)3建議使用oldobject=Object.assign({},oldobject,{key1:value1,key2:value2})

      3.Vue不允許動(dòng)態(tài)添加 根級(jí)響應(yīng)式屬性,所有初始實(shí)例必須聲明(空值也需要)

      4.在數(shù)據(jù)變化之后立即使用 vm.$nextTick(calllback) 實(shí)現(xiàn)在Dom更新后操作

文中還有部分深層細(xì)節(jié)沒(méi)有講述到,后續(xù)我也會(huì)接著更新系列文章來(lái)進(jìn)一步深深深究vue底層的響應(yīng)式原理,SYNT。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • vue 使用原生組件上傳圖片的實(shí)例

    vue 使用原生組件上傳圖片的實(shí)例

    這篇文章主要介紹了vue 使用原生組件上傳圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • vue中如何使用echarts動(dòng)態(tài)渲染數(shù)據(jù)

    vue中如何使用echarts動(dòng)態(tài)渲染數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于vue中如何使用echarts動(dòng)態(tài)渲染數(shù)據(jù)的相關(guān)資料,echarts是一款基于JavaScript的開(kāi)源可視化圖表庫(kù),它通過(guò)簡(jiǎn)單的配置即可實(shí)現(xiàn)各種各樣的可視化效果,需要的朋友可以參考下
    2023-11-11
  • Vue中rules的寫(xiě)法使用小結(jié)

    Vue中rules的寫(xiě)法使用小結(jié)

    這篇文章主要介紹了Vue中rules的寫(xiě)法使用小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • vue獲取驗(yàn)證碼倒計(jì)時(shí)組件

    vue獲取驗(yàn)證碼倒計(jì)時(shí)組件

    這篇文章主要為大家詳細(xì)介紹了vue獲取驗(yàn)證碼倒計(jì)時(shí)組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • vue常見(jiàn)的通信方式總結(jié)

    vue常見(jiàn)的通信方式總結(jié)

    我們?nèi)粘m?xiàng)目開(kāi)發(fā)中,少不了組件之間的通信,我們可能只知道一些常見(jiàn)的方式比如props,emits,其實(shí),實(shí)現(xiàn)組件間的通信有很多種方式,本文就給大家總結(jié)一些我們常見(jiàn)的通信方式,需要的朋友可以參考下
    2023-08-08
  • Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法

    Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法

    項(xiàng)目中如果沒(méi)有對(duì)異常做處理,可能導(dǎo)致應(yīng)用崩潰或顯示報(bào)錯(cuò)信息影響用戶(hù)體驗(yàn),因此需要對(duì)不同層級(jí)的錯(cuò)誤進(jìn)行捕獲,所以本文給大家介紹了Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法,需要的朋友可以參考下
    2025-01-01
  • vue中的v-touch事件用法說(shuō)明

    vue中的v-touch事件用法說(shuō)明

    這篇文章主要介紹了vue中的v-touch事件用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Vue3如何在setup中獲取元素引用(ref)

    Vue3如何在setup中獲取元素引用(ref)

    這篇文章主要介紹了Vue3如何在setup中獲取元素引用(ref)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 在vue中實(shí)現(xiàn)日歷功能的代碼示例

    在vue中實(shí)現(xiàn)日歷功能的代碼示例

    在許多Web應(yīng)用程序中,日歷是一個(gè)常見(jiàn)的組件,它通常用于顯示日期、安排會(huì)議、查看活動(dòng)等,在Vue中,我們可以使用第三方庫(kù)來(lái)輕松實(shí)現(xiàn)日歷功能,也可以手動(dòng)編寫(xiě)代碼來(lái)實(shí)現(xiàn)日歷的展示和操作,本文將介紹如何使用vue-calendar和手動(dòng)編寫(xiě)代碼來(lái)實(shí)現(xiàn)日歷功能
    2023-07-07
  • VSCode Vue開(kāi)發(fā)推薦插件和VSCode快捷鍵(小結(jié))

    VSCode Vue開(kāi)發(fā)推薦插件和VSCode快捷鍵(小結(jié))

    這篇文章主要介紹了VSCode Vue開(kāi)發(fā)推薦插件和VSCode快捷鍵(小結(jié)),文中通過(guò)圖文表格介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論

麻栗坡县| 曲水县| 富川| 元朗区| 剑河县| 江源县| 江川县| 成武县| 新乡市| 丰台区| 西乡县| 鞍山市| 嘉祥县| 扎赉特旗| 绥德县| 临西县| 昌图县| 恩施市| 曲松县| 平利县| 漳平市| 奉新县| 枝江市| 扎囊县| 南雄市| 台东市| 阿勒泰市| 湘西| 康乐县| 修文县| 瓮安县| 山东省| 固镇县| 安福县| 望奎县| 永清县| 庐江县| 高密市| 馆陶县| 宝坻区| 甘孜县|