簡(jiǎn)單理解Vue中的nextTick

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

那么我們的理解是:當(dāng)數(shù)據(jù)發(fā)生變化之后喂饥,DOM視圖并不會(huì)立即更新消约,如果我們?cè)诎l(fā)生變化之后立馬去獲取某個(gè)節(jié)點(diǎn)或者某個(gè)節(jié)點(diǎn)的值,很有可能結(jié)果就是undefined员帮;因?yàn)閂ue實(shí)現(xiàn)響應(yīng)式并不是數(shù)據(jù)發(fā)生變化之后DOM立即變化或粮,而是按一定的策略進(jìn)行DOM的更新;

來看一個(gè)小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>

?
image

我們通過運(yùn)行代碼能夠看到當(dāng)我們不在this.$nextTick方法里面進(jìn)行DOM操作的時(shí)候捞高,this.$refs.message.innerHTML的值存儲(chǔ)的還是之前的初始值氯材;

修改代碼:

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>
image.png

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

再來修改代碼對(duì)比一下:

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>
image.png

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

應(yīng)用場(chǎng)景:

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

因?yàn)樵赾reated鉤子函數(shù)觸發(fā)的時(shí)候,DOM是沒有進(jìn)行渲染的月幌;DOM沒有進(jìn)行渲染碍讯,然后進(jìn)行DOM操作無疑是徒勞的;

所以我們?cè)赾reated中進(jìn)行DOM操作的時(shí)候扯躺,一定要將DOM操作放入到this.$nextTick()中捉兴;

與之相反的是mounted,因?yàn)楫?dāng)觸發(fā)mounted的時(shí)候录语,DOM的掛載和渲染都已經(jīng)完成了倍啥,所以在mounted中進(jìn)行DOM操作是不會(huì)有任何問題的;

因?yàn)镈OM更新是異步的澎埠,像v-if指令判斷增刪DOM元素虽缕,我們?cè)诜椒ㄖ薪o變量賦值的時(shí)候,如果不使用this.$nextTick()蒲稳,我們很有可能拿到的還是初始值氮趋,如果想拿到更新后的值伍派,需要使用this.$nextTick()方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剩胁,隨后出現(xiàn)的幾起案子诉植,更是在濱河造成了極大的恐慌,老刑警劉巖昵观,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晾腔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡索昂,警方通過查閱死者的電腦和手機(jī)建车,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椒惨,“玉大人潮罪,你說我怎么就攤上這事康谆。” “怎么了嫉到?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵孽锥,是天一觀的道長惜辑。 經(jīng)常有香客問我,道長介粘,這世上最難降的妖魔是什么题涨? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮正蛙,結(jié)果婚禮上乒验,老公的妹妹穿的比我還像新娘鳄厌。我一直安慰自己,他們只是感情好了嚎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布泪漂。 她就那樣靜靜地躺著,像睡著了一般歪泳。 火紅的嫁衣襯著肌膚如雪萝勤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天夹囚,我揣著相機(jī)與錄音纵刘,去河邊找鬼。 笑死荸哟,一個(gè)胖子當(dāng)著我的面吹牛假哎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞍历,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼舵抹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了劣砍?” 一聲冷哼從身側(cè)響起惧蛹,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后香嗓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迅腔,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年靠娱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沧烈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡像云,死狀恐怖锌雀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迅诬,我是刑警寧澤腋逆,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站侈贷,受9級(jí)特大地震影響惩歉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铐维,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一柬泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫁蛇,春花似錦、人聲如沸露该。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解幼。三九已至抑党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵摆,已是汗流浹背底靠。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留特铝,地道東北人暑中。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像鲫剿,于是被迫代替她去往敵國和親鳄逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容