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

深入學(xué)習(xí)Vue nextTick的用法及原理

 更新時間:2019年10月08日 08:23:14   作者:有夢想的咸魚前端  
這篇文章主要介紹了深入學(xué)習(xí)Vue nextTick的用法及原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

Vue.nextTick是Vue官方給我們提供的一個API(方法),作用是在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的DOM;

那么我們的理解是:當數(shù)據(jù)發(fā)生變化之后,DOM視圖并不會立即更新,如果我們在發(fā)生變化之后立馬去獲取某個節(jié)點或者某個節(jié)點的值,很有可能結(jié)果就是undefined;因為Vue實現(xiàn)響應(yīng)式并不是數(shù)據(jù)發(fā)生變化之后DOM立即變化,而是按一定的策略進行DOM的更新;

來看一個小demo:

App.vue 

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App',
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   this.msg1=this.$refs.message.innerHTML;
    console.log("更新DOM之前:"+this.msg1)
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

我們通過運行代碼能夠看到當我們不在this.$nextTick方法里面進行DOM操作的時候,this.$refs.message.innerHTML的值存儲的還是之前的初始值;

修改代碼:

App.vue  

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App', 
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   // this.msg1=this.$refs.message.innerHTML;
   // console.log("更新DOM之前:"+this.msg1)
    this.$nextTick(()=>{
     this.msg1=this.$refs.message.innerHTML;
     console.log("更新DOM之后:"+this.msg1)
    })
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

修改代碼之后我們可以發(fā)現(xiàn),使用this.$nextTick很容易的就接收到了更新后的值,正如官網(wǎng)解釋:在下次DOM更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的DOM;

再來修改代碼對比一下:

App.vue

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App', 
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   this.msg1=this.$refs.message.innerHTML;
    console.log("更新DOM之前:"+this.msg1)
    this.$nextTick(()=>{
     this.msg1=this.$refs.message.innerHTML;
     console.log("更新DOM之后:"+this.msg1)
    })
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

經(jīng)過修改代碼,我們現(xiàn)在可以很容易看出來this.$nextTick(callback)的作用,callback是回調(diào)函數(shù)也就是我們要進行操作DOM的事情;

應(yīng)用場景:

在vue的生命周期鉤子函數(shù)created()中進行DOM操作的時候一定要把DOM操作放入到this.$nextTick()中;

因為在created鉤子函數(shù)觸發(fā)的時候,DOM是沒有進行渲染的;DOM沒有進行渲染,然后進行DOM操作無疑是徒勞的;

所以我們在created中進行DOM操作的時候,一定要將DOM操作放入到this.$nextTick()中;

與之相反的是mounted,因為當觸發(fā)mounted的時候,DOM的掛載和渲染都已經(jīng)完成了,所以在mounted中進行DOM操作是不會有任何問題的;

因為DOM更新是異步的,像v-if指令判斷增刪DOM元素,我們在方法中給變量賦值的時候,如果不使用this.$nextTick(),我們很有可能拿到的還是初始值,如果想拿到更新后的值,需要使用this.$nextTick()方法

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解vue3?響應(yīng)式的實現(xiàn)原理

    詳解vue3?響應(yīng)式的實現(xiàn)原理

    Vue.js?3.0?為了解決?Object.defineProperty?的這些缺陷,使用?Proxy?API?重寫了響應(yīng)式部分,并獨立維護和發(fā)布整個?reactivity?庫,這篇文章主要介紹了vue3?響應(yīng)式的實現(xiàn)原理,需要的朋友可以參考下
    2022-06-06
  • Vue3 style CSS 變量注入的實現(xiàn)

    Vue3 style CSS 變量注入的實現(xiàn)

    本文主要介紹了Vue3 style CSS 變量注入的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Vue數(shù)據(jù)變化后頁面更新詳細介紹

    Vue數(shù)據(jù)變化后頁面更新詳細介紹

    這篇文章主要介紹了Vue在數(shù)據(jù)發(fā)生變化后是如何更新頁面的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • vue3監(jiān)聽resize窗口事件(離開頁面要銷毀窗口事件)

    vue3監(jiān)聽resize窗口事件(離開頁面要銷毀窗口事件)

    這篇文章主要給大家介紹了關(guān)于vue3監(jiān)聽resize窗口事件(離開頁面要銷毀窗口事件)的相關(guān)資料,vue是單頁面應(yīng)用,路由切換后,定時器并不會自動關(guān)閉,需要手動清除,當頁面被銷毀時,清除定時器即可,需要的朋友可以參考下
    2023-11-11
  • Vben Admin 多標簽頁狀態(tài)管理源碼學(xué)習(xí)

    Vben Admin 多標簽頁狀態(tài)管理源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Vben Admin 多標簽頁狀態(tài)管理源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Vue.js2.0中的變化小結(jié)

    Vue.js2.0中的變化小結(jié)

    最近小編在學(xué)習(xí)vue.js ,發(fā)現(xiàn)里面有好多好玩的東東,今天小編給大家分享Vue.js2.0中的變化,小編會在日后給大家持續(xù)更新的,感興趣的朋友參考下吧
    2017-10-10
  • Vue組件模板形式實現(xiàn)對象數(shù)組數(shù)據(jù)循環(huán)為樹形結(jié)構(gòu)(實例代碼)

    Vue組件模板形式實現(xiàn)對象數(shù)組數(shù)據(jù)循環(huán)為樹形結(jié)構(gòu)(實例代碼)

    這篇文章主要介紹了Vue組件模板形式實現(xiàn)對象數(shù)組數(shù)據(jù)循環(huán)為樹形結(jié)構(gòu),本文用vue實現(xiàn)方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-07-07
  • vue-router的兩種模式的區(qū)別

    vue-router的兩種模式的區(qū)別

    這篇文章主要介紹了vue-router的兩種模式的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Vue如何使用cdn加載資源加快打包速度

    Vue如何使用cdn加載資源加快打包速度

    外部的庫文件,可以使用CDN資源,或者別的服務(wù)器資源等,下面這篇文章主要給大家介紹了關(guān)于Vue如何使用cdn加載資源加快打包速度的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • Vue3使用icon的兩種方式實例

    Vue3使用icon的兩種方式實例

    vue開發(fā)網(wǎng)站的時候,往往圖標是起著很重要的作用,下面這篇文章主要給大家介紹了關(guān)于Vue3使用icon的兩種方式,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11

最新評論