天天看點

vue中nextTick()、this.$nextTick()的了解及使用

作者:不凡的小路丫

在Vue中, 當響應式資料變化時,DOM節點并不會立即更新,而是在下一次DOM更新時才會更新。這是因為Vue使用異步更新DOM來提高性能和減少不必要的DOM操作。

但是在某些時候我們需要在DOM更新後執行一些操作,比如在資料變化後進行某些操作,或者在元件mounted後操作DOM等。

Vue提供了一個方法nextTick()來解決這個問題。nextTick()方法會在DOM更新完成之後執行回調函數,如下所示:

Vue.nextTick(function () {
  // DOM更新完成後執行的代碼
})
           

這個方法還可以使用Promise等方式來實作。

nextTick()方法的應用場景主要有以下幾種:

1:在修改資料之後立即操作dom

2:在Vue生命周期鈎子函數中進行某些必須在DOM更新後執行的操作

3:在自定義元件中,需要操作子元件的DOM時,可以在子元件mounted生命周期鈎子函數中操作,來確定子元件的DOM已經挂載好了。

如下是一個使用nextTick()方法的示例,在元件中的mounted生命周期鈎子函數中使用:

mounted() {
  this.$nextTick(() => {
    // DOM 更新後執行的代碼
  })
}
           

這就是Vue中nextTick()的一些了解及使用方法。

Vue中的nextTick()方法可以讓我們在下一次DOM更新周期之後執行回調函數,這非常有用,因為在Vue的更新周期中,如果我們直接修改資料,它不會立即反應在DOM中,而是在異步更新隊列中等待更新。如果我們希望在DOM更新完成後執行某些操作,例如計算元素的高度或根據DOM更新執行某些動畫,這非常有用。

我們可以使用nextTick()方法在異步更新完成後執行回調函數,這樣可以確定我們的操作在DOM更新後執行。例如:

// 代碼
Vue.nextTick(function () {
  // DOM 更新已經完成
  // 這裡可以執行某些操作
})
           

在實際開發中,我們還可以使用Promise封裝nextTick()方法來實作異步的DOM更新:

Vue.prototype.$nextTickPromise = function () {
  return new Promise(resolve => {
    Vue.nextTick(resolve)
  })
}
           

這樣我們就可以在需要異步更新DOM時,使用Promise來處理操作。

用法示例:

async function foo() {
   // 更新 data 中的值
   this.someValue = 'new Value';
    
   // 等待更新
   await this.$nextTickPromise();
    
   // 執行一些操作
   const el = document.querySelector('.my-element');
   console.log(el.clientHeight); // -> 列印元素的高度
}
           

總之,nextTick()方法是Vue中一個非常重要的方法,可以用于保證 DOM 更新的順序和避免一些潛在的問題。

Vue中this.$nextTick()的了解與使用方法

在 Vue.js 中,當修改資料後,DOM 并不會立即更新,而是在下一輪的事件循環中更新,是以如果在修改資料後想要立即操作更新後的 DOM,就需要使用 this.$nextTick() 方法。

this.$nextTick() 接收一個回調函數作為參數,在 DOM 更新完畢後會立即執行該函數,這樣就可以確定在回調函數中操作更新後的 DOM。

下面是使用 this.$nextTick() 的示例代碼

new Vue({
  el: '#app',
  data() {
    return {
      title: 'hello'
    }
  },
  methods: {
    changeTitle() {
      this.title = 'world'
      this.$nextTick(() => {
        // DOM 更新完畢後執行該回調函數
        console.log(document.querySelector('h1').innerText) // 'world'
      })
    }
  }
})
           

在上面的代碼中,當執行 changeTitle() 方法時,會先将 title 資料修改為 'world',然後使用 this.$nextTick() 方法來確定 DOM 已經更新完畢後,再執行回調函數輸出标題内容。

需要注意的是,this.$nextTick() 方法是異步執行的,如果想要在資料更新後立即擷取更新後的 DOM,可以使用以下兩種方式:

1.在回調函數中使用 this.$refs 擷取更新後的元件執行個體,進而通路更新後的 DOM 元素。

this.$nextTick(() => {
  console.log(this.$refs.content.innerText)
})
           

2.使用 async/await 來等待 DOM 更新完成後再執行後續代碼。

async changeTitle() {
  this.title = 'world'
  await this.$nextTick()
  console.log(document.querySelector('h1').innerText) // 'world'
}
           

以上就是關于 Vue.js 中 this.$nextTick() 方法的了解與使用方法。

繼續閱讀