欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue中this.$nextTick的作用及用法

 更新時(shí)間:2020年02月04日 08:31:38   作者:素素  
在本文章里小編給大家整理了關(guān)于Vue中this.$nextTick的作用及用法,有需要的朋友們可以跟著學(xué)習(xí)參考下。

Vue實(shí)現(xiàn)響應(yīng)式后DOM的變化

data對(duì)象中數(shù)據(jù)改變是如何追蹤的?

vue將遍歷data對(duì)象中所有的屬性,并通過 Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter;但是我們是沒有辦法看到 getter/setter的,但是在內(nèi)部它們讓 Vue 能夠追蹤依賴,在屬性被訪問和修改時(shí)通知變更。

每個(gè)組件都對(duì)應(yīng)一個(gè) watcher 實(shí)例,它會(huì)在組件渲染的過程中把“接觸”過的數(shù)據(jù)屬性記錄為依賴。之后當(dāng)依賴項(xiàng)的 setter 觸發(fā)時(shí),會(huì)通知 watcher,從而使它關(guān)聯(lián)的組件重新渲染。

Vue是無法檢測(cè)到data對(duì)象屬性的添加和刪除

原因:Vue在對(duì)初始化組件時(shí)會(huì)對(duì)對(duì)象屬性執(zhí)行g(shù)etter/setter轉(zhuǎn)化,所以屬性必須在data對(duì)象上存在才能讓Vue將它轉(zhuǎn)化為初始化。

 var vm = new Vue({
 data:{
 a:1
 }
 })

 // `vm.a` 是響應(yīng)式的

 vm.b = 2
 // `vm.b` 是非響應(yīng)式的

如何動(dòng)態(tài)添加根級(jí)別的響應(yīng)式屬性【就是對(duì)data添加屬性】

 this.$set(this.someObject,'b',2)

異步更新隊(duì)列

Vue 在更新 DOM 時(shí)是異步執(zhí)行的。只要偵聽到數(shù)據(jù)變化,Vue 將開啟一個(gè)隊(duì)列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更。

如果同一個(gè) watcher 被多次觸發(fā),只會(huì)被推入到隊(duì)列中一次。這種在緩沖時(shí)去除重復(fù)數(shù)據(jù)對(duì)于避免不必要的計(jì)算和 DOM 操作是非常重要的。

然后,在下一個(gè)的事件循環(huán)“tick”中,Vue 刷新隊(duì)列并執(zhí)行實(shí)際 (已去重的) 工作。

Vue 在內(nèi)部對(duì)異步隊(duì)列嘗試使用原生的 Promise.then、MutationObserver 和 setImmediate,如果執(zhí)行環(huán)境不支持,則會(huì)采用 setTimeout(fn, 0) 代替。

例如,當(dāng)你設(shè)置 vm.someData = 'new value',該組件不會(huì)立即重新渲染。

當(dāng)刷新隊(duì)列時(shí),組件會(huì)在下一個(gè)事件循環(huán)“tick”中更新。

多數(shù)情況我們不需要關(guān)心這個(gè)過程,但是如果你想基于更新后的 DOM 狀態(tài)來做點(diǎn)什么,這就可能會(huì)有些棘手。雖然 Vue.js 通常鼓勵(lì)開發(fā)人員使用“數(shù)據(jù)驅(qū)動(dòng)”的方式思考,避免直接接觸 DOM,但是有時(shí)我們必須要這么做。為了在數(shù)據(jù)變化之后等待 Vue 完成更新 DOM,可以在數(shù)據(jù)變化之后立即使用 Vue.nextTick(callback)。這樣回調(diào)函數(shù)將在 DOM 更新完成后被調(diào)用。例如:

<div id="example">{{message}}</div>
 var vm = new Vue({
  el: '#example',
  data: {
  message: '123'
  }
 })
 vm.message = 'new message' // 更改數(shù)據(jù)
 vm.$el.textContent === 'new message' // false
 Vue.nextTick(function () {
  vm.$el.textContent === 'new message' // true
 })

在組件內(nèi)使用 vm.$nextTick() 實(shí)例方法特別方便,因?yàn)樗恍枰?Vue,并且回調(diào)函數(shù)中的 this 將自動(dòng)綁定到當(dāng)前的 Vue 實(shí)例上:

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
  return {
   message: '未更新'
  }
  },
  methods: {
  updateMessage: function () {
   this.message = '已更新'
   console.log(this.$el.textContent) // => '未更新'
   this.$nextTick(function () {
   console.log(this.$el.textContent) // => '已更新'
   })
  }
  }
 })

因?yàn)?$nextTick() 返回一個(gè) Promise 對(duì)象,所以你可以使用新的 ES2017 async/await 語法完成相同的事情:

methods: {
updateMessage: async function () {

this.message = '已更新'
console.log(this.$el.textContent) // => '未更新'
await this.$nextTick()
console.log(this.$el.textContent) // => '已更新'
}
}

Vue 實(shí)現(xiàn)響應(yīng)式并不是數(shù)據(jù)發(fā)生變化之后 DOM 立即變化,而是按一定的策略進(jìn)行 DOM 的更新。

$nextTick 是在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào),在修改數(shù)據(jù)之后使用 $nextTick,則可以在回調(diào)中獲取更新后的 DOM

實(shí)例化理解Vue響應(yīng)化

<div id="app">

<div>Price :¥{{ price }}</div>
<div>Total:¥{{ price * quantity }}</div>
<div>Taxes: ¥{{ totalPriceWithTax }}</div>
<button @click="changePrice">改變價(jià)格</button>
</div>
var app = new Vue({
el: '#app',
data() {

return {
 price: 5.0,
 quantity: 2
};
},
computed: {

totalPriceWithTax() {
 return this.price * this.quantity * 1.03;
}
},
methods: {

changePrice() {
 this.price = 10;
}
}
})

上例中當(dāng)price 發(fā)生變化的時(shí)候,Vue就知道自己需要做三件事情:

  • 更新頁面上price的值
  • 計(jì)算表達(dá)式 price*quantity 的值,更新頁面
  • 調(diào)用totalPriceWithTax 函數(shù),更新頁面

數(shù)據(jù)發(fā)生變化后,會(huì)重新對(duì)頁面渲染,這就是Vue響應(yīng)式,那么這一切是怎么做到的呢?

想完成這個(gè)過程,我們需要:

  • 偵測(cè)數(shù)據(jù)的變化
  • 收集視圖依賴了哪些數(shù)據(jù)
  • 數(shù)據(jù)變化時(shí),自動(dòng)“通知”需要更新的視圖部分,并進(jìn)行更新

對(duì)應(yīng)專業(yè)俗語分別是:

  • 數(shù)據(jù)劫持 / 數(shù)據(jù)代理
  • 依賴收集
  • 發(fā)布訂閱模式

總結(jié)

再來回顧下整個(gè)過程:

在new Vue()后, Vue 會(huì)調(diào)用_init函數(shù)進(jìn)行初始化,也就是init 過程,在 這個(gè)過程Data通過Observer轉(zhuǎn)換成了getter/setter的形式,來對(duì)數(shù)據(jù)追蹤變化,當(dāng)被設(shè)置的對(duì)象被讀取的時(shí)候會(huì)執(zhí)行g(shù)etter函數(shù),而在當(dāng)被賦值的時(shí)候會(huì)執(zhí)行setter函數(shù)。

當(dāng)外界通過Watcher讀取數(shù)據(jù)時(shí),會(huì)觸發(fā)getter從而將Watcher添加到依賴中。

在修改對(duì)象的值的時(shí)候,會(huì)觸發(fā)對(duì)應(yīng)的setter,setter通知之前依賴收集得到的 Dep 中的每一個(gè) Watcher,告訴它們自己的值改變了,需要重新渲染視圖。這時(shí)候這些 Watcher就會(huì)開始調(diào)用update來更新視圖。

以上就是本次介紹的全部相關(guān)知識(shí)點(diǎn)內(nèi)容,如果大家學(xué)習(xí)中有任何補(bǔ)充可以聯(lián)系腳本之家小編。

相關(guān)文章

  • Vue動(dòng)態(tài)組件和異步組件原理詳解

    Vue動(dòng)態(tài)組件和異步組件原理詳解

    這篇文章主要給大家介紹了關(guān)于Vue動(dòng)態(tài)組件和異步組件原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vuex?localStorage的具體使用

    Vuex?localStorage的具體使用

    本文主要介紹了Vuex?localStorage的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 在Vue中使用mockjs代碼實(shí)例

    在Vue中使用mockjs代碼實(shí)例

    這篇文章主要介紹了在Vue中使用mockjs代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • vue使用axios跨域請(qǐng)求數(shù)據(jù)問題詳解

    vue使用axios跨域請(qǐng)求數(shù)據(jù)問題詳解

    這篇文章主要為大家詳細(xì)介紹了vue使用axios跨域請(qǐng)求數(shù)據(jù)的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 前端大文件上傳與下載(分片上傳)的詳細(xì)過程

    前端大文件上傳與下載(分片上傳)的詳細(xì)過程

    最近遇見一個(gè)需要上傳超大大文件的需求,所以下面這篇文章主要給大家介紹了關(guān)于前端大文件上傳與下載(分片上傳)的詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • vue-froala-wysiwyg 富文本編輯器功能

    vue-froala-wysiwyg 富文本編輯器功能

    這篇文章主要介紹了vue-froala-wysiwyg 富文本編輯器功能,分步驟給大家介紹了vue3.中如何安裝使用froala,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vue代理如何配置重寫方法(pathRewrite與rewrite)

    vue代理如何配置重寫方法(pathRewrite與rewrite)

    這篇文章主要介紹了vue代理如何配置重寫方法(pathRewrite與rewrite),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 安裝VUE-CLI一直失敗的排錯(cuò)過程及解決方案

    安裝VUE-CLI一直失敗的排錯(cuò)過程及解決方案

    這篇文章主要介紹了安裝VUE-CLI一直失敗的排錯(cuò)過程及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue.js directive自定義指令詳解

    Vue.js directive自定義指令詳解

    這篇文章主要介紹了Vue.js directive自定義指令詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 一文帶你了解vue3.0響應(yīng)式

    一文帶你了解vue3.0響應(yīng)式

    Vue3.0相比較于之前的版本更快、更小、更易于維護(hù)、更貼近原生、對(duì)開發(fā)者更友好,本文就Vue3.0進(jìn)行詳細(xì)介紹,需要了解的小伙伴可以參考一下這篇文章
    2021-09-09

最新評(píng)論