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

Vue2面試考點之$nextTick原理解析

 更新時間:2023年05月30日 08:14:58   作者:前端技術棧  
平時在獲取真實DOM的時候獲取不到最新的DOM元素,使用$nextTick就可以,那為什么$nextTick就可以獲取到最新的DOM元素呢,本文就來帶著這兩個問題來解析一下nextTick的原理

nextTick原理

平時在獲取真實DOM的時候獲取不到最新的DOM元素,使用$nextTick就可以

為什么$nextTick就可以獲取到最新的DOM元素?

帶著以上問題,來解析nextTick的原理

為什么獲取不到最新的DOM元素

因為Vue修改視圖是異步執(zhí)行的,這也是為了優(yōu)化性能,在我們修改data中的數(shù)據(jù)時,Vue內(nèi)部監(jiān)聽到依賴數(shù)據(jù)發(fā)生了改變,通過dep通知組件的watcher執(zhí)行視圖更新,每一次視圖更新都需要重新生成vnode再進行新舊vnode比對,生成DOM元素掛載到頁面上,這一輪操作是非常消耗性能的,所以Vue內(nèi)部會把頁面更新watcher推入到一個隊列中,并加入了節(jié)流方法,當同步代碼執(zhí)行完了之后才會把隊列中的watcher拿出來遍歷更新視圖,我們在使用this.$refs獲取DOM的時候是同步代碼,其實DOM還沒有更新,所以是獲取不到的

為什么使用$nextTick就可以獲取到最新DOM

Vue的視圖更新是異步執(zhí)行的,使用的就是nextTick,這也是能獲取到最新DOM的原因,在Vue內(nèi)部有一個nextTick函數(shù),他也是使用隊列去處理回調(diào)函數(shù),并不是調(diào)用后就馬上執(zhí)行,首先是推入到一個隊列中,當所有的同步代碼執(zhí)行完的時候再通過循環(huán)取出調(diào)用,接下來可以通過代碼了解

let callback = []
let pending = false
let timerFunc
function flush() {
  callback.forEach((cb) => cb())
  pending = false
  callback = []
}
// 處理兼容問題
if (Promise) {
  timerFunc = () => {
    Promise.resolve().then(flush)
  }
} else if (MutationObserver) {
  let observe = new MutationObserver(flush)
  let textNode = document.createTextNode(1)
  observe.observe(textNode, {
    characterData: true,
  })
  timerFunc = () => {
    textNode.textContent = 2
  }
} else if (setImmediate) {
  // ie瀏覽器支持得定時器
  timerFunc = () => {
    setImmediate(flush)
  }
}
export function nextTick(cb) {
  callback.push(cb)
  // Promise.then
  if (!pending) {
    console.log('執(zhí)行了')
    timerFunc() // 這個方法就是異步方法
    pending = true
  }
}
 

1.定義一個callback數(shù)組,每次調(diào)用nextTick就會把回調(diào)函數(shù)push到callback數(shù)組中,因為callback.push是同步代碼,timerFunc是異步代碼,所以執(zhí)行完所有push后才會調(diào)用timerFunc

2.那么視圖更新和獲取DOM的流程是怎么樣的呢

通過偽代碼來解釋

data(){
    return {
        name: 'zs',
        list: [1,2,3]
    }
}
this.name = 'ls'
this.list.push(4)
const fn = () => {
  this.$el.innerHTML // 獲取最新DOM
}
this.$nextTick(fn)

this.name和this.list修改了2個數(shù)據(jù),會觸發(fā)兩次視圖更新,這個時候就會把watcher推入到隊列中,下面調(diào)用了$nextTick獲取DOM,nextTick中的fn函數(shù)也會推入到隊列中,這個時候的數(shù)組是這樣的[watcher,fn]通過循環(huán)調(diào)用,先執(zhí)行視圖更新,后獲取DOM就可以獲取到最新DOM了

到此這篇關于Vue2面試考點之$nextTick原理解析的文章就介紹到這了,更多相關Vue2 $nextTick內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解讀Vue組件注冊方式

    解讀Vue組件注冊方式

    無論是Vue還是React,都有組件的概念。組件,就是能和別人組合在一起的物件。在前端頁面開發(fā)過程中,將一個頁面劃分成一個個小的模塊,每個模塊單獨定義,每個模塊就是一個組件。組件可以進行復用,A頁面和B頁面有一個相似的模塊,可以抽離成一個可局部修改的組件。
    2021-05-05
  • vue3系統(tǒng)進入頁面前的權限判斷和重定向方式

    vue3系統(tǒng)進入頁面前的權限判斷和重定向方式

    這篇文章主要介紹了vue3系統(tǒng)進入頁面前的權限判斷和重定向方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue項目中引入Sass實例方法

    vue項目中引入Sass實例方法

    在本文里小編給大家整理的是關于vue項目中引入Sass的相關知識點內(nèi)容,有需要的朋友們可以測試參考下。
    2019-08-08
  • vue中使用帶隱藏文本信息的圖片、圖片水印的方法

    vue中使用帶隱藏文本信息的圖片、圖片水印的方法

    這篇文章主要介紹了vue中使用帶隱藏文本信息的圖片、圖片水印的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 在vue中使用axios實現(xiàn)post方式獲取二進制流下載文件(實例代碼)

    在vue中使用axios實現(xiàn)post方式獲取二進制流下載文件(實例代碼)

    這篇文章主要介紹了在vue中使用axios實現(xiàn)post方式獲取二進制流下載文件的相關資料,需要的朋友可以參考下
    2019-12-12
  • 解決vuex刷新狀態(tài)初始化的方法實現(xiàn)

    解決vuex刷新狀態(tài)初始化的方法實現(xiàn)

    這篇文章主要介紹了解決vuex刷新狀態(tài)初始化的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Vue3中ref和reactive的基本使用及區(qū)別詳析

    Vue3中ref和reactive的基本使用及區(qū)別詳析

    這篇文章主要給大家介紹了關于Vue3中ref和reactive的基本使用及區(qū)別的相關資料,需要的朋友可以參考下
    2022-07-07
  • Antd下拉選擇,自動匹配功能的實現(xiàn)

    Antd下拉選擇,自動匹配功能的實現(xiàn)

    這篇文章主要介紹了Antd下拉選擇,自動匹配功能的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue3中實現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)

    Vue3中實現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)

    最近忙著開發(fā)自己的博客系統(tǒng),在做界面展示的時候,需要讓代碼高亮,于是經(jīng)過在網(wǎng)上查閱,發(fā)現(xiàn)有兩款比較好用的插件實現(xiàn)代碼高亮,分別是prismjs和highlight.js,下面我分別介紹下,方便給需要的同學參考
    2025-04-04
  • Vue3和Vue2的slot-scope插槽用法解讀

    Vue3和Vue2的slot-scope插槽用法解讀

    這篇文章主要介紹了Vue3和Vue2的slot-scope插槽用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評論