国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue中的$nextTick有什么作用?

這篇具有很好參考價(jià)值的文章主要介紹了Vue中的$nextTick有什么作用?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識(shí),希望對大家有所幫助

Vue中的$nextTick有什么作用?

一、NextTick是什么

官方對其的定義

在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲取更新后的 DOM

什么意思呢?

我們可以理解成,Vue?在更新?DOM?時(shí)是異步執(zhí)行的。當(dāng)數(shù)據(jù)發(fā)生變化,Vue將開啟一個(gè)異步更新隊(duì)列,視圖需要等隊(duì)列中所有數(shù)據(jù)變化完成之后,再統(tǒng)一進(jìn)行更新

舉例一下

Html結(jié)構(gòu)

<div id="app"> {{ message }} </div>

構(gòu)建一個(gè)vue實(shí)例

const vm = new Vue({
  el: '#app',
  data: {
    message: '原始值'
  }
})

修改message

this.message = '修改后的值1'
this.message = '修改后的值2'
this.message = '修改后的值3'

這時(shí)候想獲取頁面最新的DOM節(jié)點(diǎn),卻發(fā)現(xiàn)獲取到的是舊值

console.log(vm.$el.textContent) // 原始值

這是因?yàn)?code>message數(shù)據(jù)在發(fā)現(xiàn)變化的時(shí)候,vue并不會(huì)立刻去更新Dom,而是將修改數(shù)據(jù)的操作放在了一個(gè)異步操作隊(duì)列中

如果我們一直修改相同數(shù)據(jù),異步操作隊(duì)列還會(huì)進(jìn)行去重

等待同一事件循環(huán)中的所有數(shù)據(jù)變化完成之后,會(huì)將隊(duì)列中的事件拿來進(jìn)行處理,進(jìn)行DOM的更新

為什么要有nexttick

舉個(gè)例子

{{num}}
for(let i=0; i<100000; i++){
    num = i
}

如果沒有?nextTick?更新機(jī)制,那么?num?每次更新值都會(huì)觸發(fā)視圖更新(上面這段代碼也就是會(huì)更新10萬次視圖),有了nextTick機(jī)制,只需要更新一次,所以nextTick本質(zhì)是一種優(yōu)化策略

二、使用場景

如果想要在修改數(shù)據(jù)后立刻得到更新后的DOM結(jié)構(gòu),可以使用Vue.nextTick()

第一個(gè)參數(shù)為:回調(diào)函數(shù)(可以獲取最近的DOM結(jié)構(gòu))

第二個(gè)參數(shù)為:執(zhí)行函數(shù)上下文

// 修改數(shù)據(jù)
vm.message = '修改后的值'
// DOM 還沒有更新
console.log(vm.$el.textContent) // 原始的值
Vue.nextTick(function () {
  // DOM 更新了
  console.log(vm.$el.textContent) // 修改后的值
})

組件內(nèi)使用?vm.$nextTick()?實(shí)例方法只需要通過this.$nextTick(),并且回調(diào)函數(shù)中的?this?將自動(dòng)綁定到當(dāng)前的?Vue?實(shí)例上

this.message = '修改后的值'
console.log(this.$el.textContent) // => '原始的值'
this.$nextTick(function () {
    console.log(this.$el.textContent) // => '修改后的值'
})

$nextTick()?會(huì)返回一個(gè)?Promise?對象,可以是用async/await完成相同作用的事情

this.message = '修改后的值'
console.log(this.$el.textContent) // => '原始的值'
await this.$nextTick()
console.log(this.$el.textContent) // => '修改后的值'

三、實(shí)現(xiàn)原理

源碼位置:/src/core/util/next-tick.js

callbacks也就是異步操作隊(duì)列

callbacks新增回調(diào)函數(shù)后又執(zhí)行了timerFunc函數(shù),pending是用來標(biāo)識(shí)同一個(gè)時(shí)間只能執(zhí)行一次

export function nextTick(cb?: Function, ctx?: Object) {
  let _resolve;

  // cb 回調(diào)函數(shù)會(huì)經(jīng)統(tǒng)一處理壓入 callbacks 數(shù)組
  callbacks.push(() => {
    if (cb) {
      // 給 cb 回調(diào)函數(shù)執(zhí)行加上了 try-catch 錯(cuò)誤處理
      try {
        cb.call(ctx);
      } catch (e) {
        handleError(e, ctx, 'nextTick');
      }
    } else if (_resolve) {
      _resolve(ctx);
    }
  });

  // 執(zhí)行異步延遲函數(shù) timerFunc
  if (!pending) {
    pending = true;
    timerFunc();
  }

  // 當(dāng) nextTick 沒有傳入函數(shù)參數(shù)的時(shí)候,返回一個(gè) Promise 化的調(diào)用
  if (!cb && typeof Promise !== 'undefined') {
    return new Promise(resolve => {
      _resolve = resolve;
    });
  }
}

timerFunc函數(shù)定義,這里是根據(jù)當(dāng)前環(huán)境支持什么方法則確定調(diào)用哪個(gè),分別有:

Promise.then、MutationObserversetImmediatesetTimeout

通過上面任意一種方法,進(jìn)行降級操作

export let isUsingMicroTask = false
if (typeof Promise !== 'undefined' && isNative(Promise)) {
  //判斷1:是否原生支持Promise
  const p = Promise.resolve()
  timerFunc = () => {
    p.then(flushCallbacks)
    if (isIOS) setTimeout(noop)
  }
  isUsingMicroTask = true
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
  isNative(MutationObserver) ||
  MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {
  //判斷2:是否原生支持MutationObserver
  let counter = 1
  const observer = new MutationObserver(flushCallbacks)
  const textNode = document.createTextNode(String(counter))
  observer.observe(textNode, {
    characterData: true
  })
  timerFunc = () => {
    counter = (counter + 1) % 2
    textNode.data = String(counter)
  }
  isUsingMicroTask = true
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
  //判斷3:是否原生支持setImmediate
  timerFunc = () => {
    setImmediate(flushCallbacks)
  }
} else {
  //判斷4:上面都不行,直接用setTimeout
  timerFunc = () => {
    setTimeout(flushCallbacks, 0)
  }
}

無論是微任務(wù)還是宏任務(wù),都會(huì)放到flushCallbacks使用

這里將callbacks里面的函數(shù)復(fù)制一份,同時(shí)callbacks置空

依次執(zhí)行callbacks里面的函數(shù)

function flushCallbacks () {
  pending = false
  const copies = callbacks.slice(0)
  callbacks.length = 0
  for (let i = 0; i < copies.length; i++) {
    copies[i]()
  }
}

小結(jié):文章來源地址http://www.zghlxwxcb.cn/news/detail-836796.html

  1. 把回調(diào)函數(shù)放入callbacks等待執(zhí)行
  2. 將執(zhí)行函數(shù)放到微任務(wù)或者宏任務(wù)中
  3. 事件循環(huán)到了微任務(wù)或者宏任務(wù),執(zhí)行函數(shù)依次執(zhí)行callbacks中的回調(diào)

參考文獻(xiàn)

  • https://juejin.cn/post/6844904147804749832

到了這里,關(guān)于Vue中的$nextTick有什么作用?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 淺談Vue中的NextTick。

    ????????等待下一次 DOM 更新刷新的工具方法。(在修改數(shù)據(jù)后使用這個(gè)方法,能獲取更新的dom) ????????當(dāng)你在 Vue 中更改響應(yīng)式狀態(tài)時(shí),最終的 DOM 更新并不是同步生效 的,而是由 Vue 將它們緩存在一個(gè)隊(duì)列中,直到下一個(gè)“tick”才一起執(zhí)行。這樣是為了確保每個(gè)組

    2024年01月16日
    瀏覽(16)
  • Vue 中的 $nextTick 深度解毒

    $nextTick 的底層原理涉及Vue的更新機(jī)制和異步隊(duì)列。 vue 的視圖更新是異步的,數(shù)據(jù)變動(dòng)后視圖的更新是異步的,整個(gè)異步額實(shí)現(xiàn),它最核心的 api 就是 nextTick。 Vue的更新機(jī)制是基于異步的,在修改數(shù)據(jù)后,Vue會(huì)將DOM更新操作放在異步隊(duì)列中,并在下一個(gè)事件循環(huán)中執(zhí)行更新。

    2024年02月17日
    瀏覽(13)
  • 面試題:react、 vue中的key有什么作用? (key的內(nèi)部原理)

    面試題:react、 vue中的key有什么作用? (key的內(nèi)部原理)

    1.虛擬DOM中key的作用: key是虛擬DOM對象的標(biāo)識(shí),當(dāng)狀態(tài)中的數(shù)據(jù)發(fā)生變化時(shí),Vue會(huì)根據(jù)【新數(shù)據(jù)】生成【新的虛擬DON】,隨后Vue進(jìn)行【新虛擬DOM】與【舊虛擬DOM】的差異比較,比較規(guī)則如下: 2.對比規(guī)則: (1). 舊虛擬DOM 中找到了與 新虛擬DOM 相同的key: .若虛擬DOM中內(nèi)容沒變,直接使

    2024年02月04日
    瀏覽(31)
  • 電子取證之服務(wù)器取證,本人第一次從pc取證到服務(wù)器,這里有一套例題分享給大家,所有解析我都盡可能全面具體,希望與各位同仁一起學(xué)習(xí)。(二次修改)

    電子取證之服務(wù)器取證,本人第一次從pc取證到服務(wù)器,這里有一套例題分享給大家,所有解析我都盡可能全面具體,希望與各位同仁一起學(xué)習(xí)。(二次修改)

    話不多說,先上鏈接,這個(gè)包含一個(gè)2G的服務(wù)器鏡像和題目,原題是弘連公司的,致謝,此處純粹分享解法供大家學(xué)習(xí)。 第二次做題目,發(fā)現(xiàn)寶塔新版已經(jīng)不支持,所以題目意義減少,還是歡迎手搓與小白來看看 鏈接: https://pan.baidu.com/s/1p8T7Fez_VlnSqdzvptARRw?pwd=ybww 提取碼: ybww

    2024年02月07日
    瀏覽(27)
  • 【源碼&庫】Vue3 中的 nextTick 魔法背后的原理

    【源碼&庫】Vue3 中的 nextTick 魔法背后的原理

    根據(jù)官網(wǎng)的簡單介紹, nextTick 是等待下一次 DOM 更新刷新的工具方法。 類型定義如下: 然后再根據(jù)官網(wǎng)的詳細(xì)介紹,我們可以知道 nextTick 的大體實(shí)現(xiàn)思路和用法: 當(dāng)你在 Vue 中更改響應(yīng)式狀態(tài)時(shí),最終的 DOM 更新并不是同步生效的,而是由 Vue 將它們緩存在一個(gè)隊(duì)列中,直到

    2024年02月03日
    瀏覽(17)
  • 揭秘Vue 2中的$nextTick:等待DOM更新的神奇時(shí)刻!

    揭秘Vue 2中的$nextTick:等待DOM更新的神奇時(shí)刻!

    在 Vue 2 中, $nextTick 是一個(gè)異步方法,用于在下次 DOM 更新循環(huán)結(jié)束后執(zhí)行回調(diào)函數(shù)。 它的原理可以解析如下: Vue 2 維護(hù)了一個(gè)隊(duì)列,用于存儲(chǔ)需要延遲執(zhí)行的回調(diào)函數(shù)。 下面是一個(gè)簡單的代碼案例,演示了 Vue 2 中的 $nextTick 方法和隊(duì)列機(jī)制: HTML: JavaScript: 在上述代碼中,

    2024年02月12日
    瀏覽(18)
  • 畢設(shè)分享springBoot+vue 網(wǎng)上購物商城系統(tǒng)(含源碼+論文)

    畢設(shè)分享springBoot+vue 網(wǎng)上購物商城系統(tǒng)(含源碼+論文)

    Hi,各位同學(xué)好呀,這里是M學(xué)姐! 今天向大家分享一個(gè)今年(2022)最新完成的畢業(yè)設(shè)計(jì)項(xiàng)目作品,【基于SSM的網(wǎng)上購物商城】 學(xué)姐根據(jù)實(shí)現(xiàn)的難度和等級對項(xiàng)目進(jìn)行評分(最低0分,滿分5分) 難度系數(shù):3分 工作量:5分 創(chuàng)新點(diǎn):3分 界面美化:5分 界面美化的補(bǔ)充說明:使用vue的

    2024年02月11日
    瀏覽(26)
  • WebSocket 中的心跳是什么,有什么作用?

    在網(wǎng)絡(luò)應(yīng)用開發(fā)中,WebSocket 是一種重要的通信協(xié)議,它允許客戶端和服務(wù)器之間建立持久性的雙向通信連接。然而,為了保持連接的穩(wěn)定性,WebSocket 中的心跳是一個(gè)不可或缺的概念。本文將詳細(xì)介紹 WebSocket 中的心跳是什么,以及它的作用。 WebSocket 心跳是指定期向服務(wù)器發(fā)

    2024年02月11日
    瀏覽(14)
  • [word] word定時(shí)自動(dòng)保存功能的作用是什么 #知識(shí)分享#學(xué)習(xí)方法#媒體

    [word] word定時(shí)自動(dòng)保存功能的作用是什么 #知識(shí)分享#學(xué)習(xí)方法#媒體

    word定時(shí)自動(dòng)保存功能的作用是什么 word定時(shí)自動(dòng)保存功能的作用是什么 這是word提供的一個(gè)保護(hù)用戶文檔的功能,一般情況下是為了預(yù)防在未知原因的情況下,用戶電腦關(guān)閉,或者不小關(guān)掉Word,導(dǎo)致正在使用的文檔丟失,給用戶造成不必要的損失。 主要是針對使用Word頻率高

    2024年02月21日
    瀏覽(21)
  • MyBatis中的ResultMap有什么作用

    MyBatis中的ResultMap有什么作用

    MyBatis是一款廣泛使用的Java持久層框架,它簡化了數(shù)據(jù)庫訪問和數(shù)據(jù)映射的工作。在MyBatis中,ResultMap是一個(gè)強(qiáng)大的工具,用于將數(shù)據(jù)庫查詢結(jié)果映射到Java對象上。本文將深入探討MyBatis中的ResultMap,解釋它的作用以及如何使用它來提高數(shù)據(jù)訪問的效率和可維護(hù)性。 在開始之前

    2024年02月07日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包