$nextTick的定義及理解:

一是己、$nextTick的定義及理解:

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

所以就衍生出了這個獲取更新后的DOM的Vue方法寒波。所以放在Vue.nextTick()回調(diào)函數(shù)中的執(zhí)行的應(yīng)該是會對DOM進(jìn)行操作的 js代碼乘盼;

   理解:nextTick()升熊,是將回調(diào)函數(shù)延遲在下一次dom更新數(shù)據(jù)后調(diào)用,簡單的理解是:當(dāng)數(shù)據(jù)更新了绸栅,在dom中渲染后级野,自動執(zhí)行該函數(shù),

Vue.nextTick()是vue的全局api粹胯,它主要用來在下次dom更新循環(huán)結(jié)束之后執(zhí)性延遲回調(diào)蓖柔。在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的dom

由于vue的更新機(jī)制是異步的风纠,所以當(dāng)數(shù)據(jù)修改之后况鸣,dom還停留在更新之前,此時想要獲取更新之后的dom竹观,可以使用 nextTick镐捧,表示的是下次dom更新循環(huán)結(jié)束后執(zhí)行的回調(diào)。

應(yīng)用場景:created中獲取dom可以使用nextTick
二臭增、$nextTick(callback) 使用原理:

  Vue是異步執(zhí)行dom更新的懂酱,一旦觀察到數(shù)據(jù)變化,Vue就會開啟一個隊(duì)列誊抛,然后把在同一個事件循環(huán) (event loop) 當(dāng)中觀察到數(shù)據(jù)變化的 watcher 推送進(jìn)這個隊(duì)列列牺。如果這個watcher被觸發(fā)多次,只會被推送到隊(duì)列一次拗窃。這種緩沖行為可以有效的去掉重復(fù)數(shù)據(jù)造成的不必要的計(jì)算和DOm操作瞎领。而在下一個事件循環(huán)時,Vue會清空隊(duì)列随夸,并進(jìn)行必要的DOM更新九默。

當(dāng)你設(shè)置 改變了一個新數(shù)據(jù)data,DOM 并不會馬上更新逃魄,而是在異步隊(duì)列被清除荤西,也就是下一個事件循環(huán)開始時執(zhí)行更新時才會進(jìn)行必要的DOM更新。如果此時你想要根據(jù)更新的 DOM 狀態(tài)去做某些事情伍俘,就會出現(xiàn)問題邪锌。。為了在數(shù)據(jù)變化之后等待 Vue 完成更新 DOM 癌瘾,可以在數(shù)據(jù)變化之后立即使用 vue.nextTick(callback) 觅丰。這樣回調(diào)函數(shù)在 DOM 更新完成后就會調(diào)用。

三妨退、什么時候需要用的this.nextTick() 妇萄?

Vue生命周期的created()鉤子函數(shù)進(jìn)行的DOM操作一定要放在Vue.nextTick()的回調(diào)函數(shù)中蜕企,原因是在created()鉤子函數(shù)執(zhí)行的時候DOM 其實(shí)并未進(jìn)行任何渲染,而此時進(jìn)行DOM操作無異于徒勞冠句,所以此處一定要將DOM操作的js代碼放進(jìn)Vue.nextTick()的回調(diào)函數(shù)中轻掩。與之對應(yīng)的就是mounted鉤子函數(shù),因?yàn)樵撱^子函數(shù)執(zhí)行時所有的DOM掛載已完成懦底。

當(dāng)項(xiàng)目中你想在改變DOM元素的數(shù)據(jù)后基于新的dom做點(diǎn)什么唇牧,對新DOM一系列的js操作都需要放進(jìn)Vue.nextTick()的回調(diào)函數(shù)中;通俗的理解是:更改數(shù)據(jù)后當(dāng)你想立即使用js操作新的視圖的時候需要使用它

四聚唐、列舉兩種使用場景

1丐重、有一個div,默認(rèn)用v-if將它隱藏杆查,點(diǎn)擊一個按鈕后扮惦,改變v-if的值,讓它顯示出來亲桦,同時拿到這個div的文本內(nèi)容崖蜜。如果v-if的值是false,直接去獲取div的內(nèi)容是獲取不到的烙肺,因?yàn)榇藭rdiv還沒有被創(chuàng)建出阿里纳猪,那么應(yīng)該在點(diǎn)擊按鈕后,改變v-if的值為true桃笙,div才會被創(chuàng)建氏堤,此時再去獲取。

<template lang="html">
    <div id="app">
        <div id="divBox" v-if="showText">測試文本內(nèi)容</div>
        <button @click="getText">獲取div內(nèi)容</button>
    </div>
</template>
<script>
    export default {
        data () {
            return {
                showText: false
            }
        },
        mounted () {
 
        },
        methods: {
            getText () {
                this.showText = true;
                var innerHTML = document.getElementById('divBox').innerHTML;
                console.log(innerHTML);
            }
        },
    }
</script>
<style lang="less">
 
</style>

運(yùn)行后會拋出一個錯誤:Cannot read property “innerHTML” of null搏明,意思就是獲取不到div元素鼠锈。這里涉及Vue一個重要的概念:異步更新隊(duì)列。

Vue在觀察到數(shù)據(jù)變化時并不是直接更新DOM星著,而是開啟一個隊(duì)列购笆,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)改變。在緩沖時會去除重復(fù)數(shù)據(jù)虚循,從而避免不必要的計(jì)算和DOM操作同欠。然后再下一個事件循環(huán)tick中,Vue刷新隊(duì)列并執(zhí)行實(shí)際(已去重的)工作横缔。所以如果用一個for循環(huán)來動態(tài)改變數(shù)據(jù)100次铺遂,其實(shí)它只會應(yīng)用最后一次改變,如果沒有這種機(jī)制茎刚,DOM就要重繪100次襟锐,過于耗費(fèi)資源。

Vue會根據(jù)當(dāng)前瀏覽器環(huán)境優(yōu)先使用原生的Promise.then和MutationObserver膛锭,如果都不支持粮坞,就會采用setTimeout代替蚊荣。

事實(shí)上,在執(zhí)行this.showText= true莫杈;時互例,div仍然還是沒有被創(chuàng)建出來,直到下一個Vue事件循環(huán)時姓迅,才開始創(chuàng)建敲霍。 $nextTick就是用來指導(dǎo)什么時候DOM更新完成的,所以上面的示例需要改寫為:

<template lang="html">
    <div id="app">
        <div id="divBox" v-if="showText">測試文本內(nèi)容</div>
        <button @click="getText">獲取div內(nèi)容</button>
    </div>
</template>
<script>
    export default {
        data () {
            return {
                showText: false
            }
        },
        mounted () {
 
        },
        methods: {
            getText () {
                this.showText = true;
                this.$nextTick(() => {
                    var innerHTML = document.getElementById('divBox').innerHTML;
                    console.log(innerHTML);
                })
            }
        },
    }
</script>
<style lang="less">
 
</style>

2丁存、修改內(nèi)容

<template>
    <div>
        <button id="btn" @click="testClick()" ref="test">{{testMsg}}</button>
    </div>
</template>
 
<script>
    export default {
        name: 'HelloWorld',
        data () {
            return {
                testMsg: "oldValue",
            }
        },
        methods: {
            testClick () {
                this.testMsg = "newValue";
                console.log(this.$refs.test.innerText);   //this.$refs.test 獲取指定DOM  輸出為:oldValue 還是之前定義的值
            }
        }
    }
</script>

使用this.$nextTick()

https://blog.csdn.net/weixin_42333548/article/details/102606546

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柴我,隨后出現(xiàn)的幾起案子解寝,更是在濱河造成了極大的恐慌,老刑警劉巖艘儒,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聋伦,死亡現(xiàn)場離奇詭異,居然都是意外死亡界睁,警方通過查閱死者的電腦和手機(jī)觉增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翻斟,“玉大人逾礁,你說我怎么就攤上這事》孟В” “怎么了嘹履?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長债热。 經(jīng)常有香客問我砾嫉,道長,這世上最難降的妖魔是什么窒篱? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任焕刮,我火速辦了婚禮,結(jié)果婚禮上墙杯,老公的妹妹穿的比我還像新娘配并。我一直安慰自己,他們只是感情好霍转,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布荐绝。 她就那樣靜靜地躺著,像睡著了一般避消。 火紅的嫁衣襯著肌膚如雪低滩。 梳的紋絲不亂的頭發(fā)上召夹,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音恕沫,去河邊找鬼监憎。 笑死,一個胖子當(dāng)著我的面吹牛婶溯,可吹牛的內(nèi)容都是我干的鲸阔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼迄委,長吁一口氣:“原來是場噩夢啊……” “哼褐筛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叙身,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤渔扎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后信轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃痴,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年财忽,在試婚紗的時候發(fā)現(xiàn)自己被綠了倘核。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡即彪,死狀恐怖紧唱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祖凫,我是刑警寧澤琼蚯,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站惠况,受9級特大地震影響遭庶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稠屠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一峦睡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧权埠,春花似錦澳腹、人聲如沸踩晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春转捕,著一層夾襖步出監(jiān)牢的瞬間作岖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工五芝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痘儡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓枢步,卻偏偏與公主長得像沉删,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子醉途,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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