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

Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn)

 更新時(shí)間:2022年01月25日 09:14:36   作者:Skuld_yi's?Blog  
本文主要介紹了Vue?nextTick獲取更新后的DOM的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前兩天在開(kāi)發(fā)時(shí)遇到一個(gè)需求:打開(kāi)對(duì)話框的時(shí)候自動(dòng)聚焦其中的輸入框。由于原生的 autofocus 屬性不起作用,需要使用組件庫(kù)提供的 focus 方法手動(dòng)手動(dòng)獲取焦點(diǎn)。于是有如下代碼:

<el-button @click="openDialog">點(diǎn)擊打開(kāi) Dialog</el-button>

<el-dialog :visible.sync="dialogVisible">
? <el-input v-model="input" ref="input"></el-input>
</el-dialog>
methods: {
? openDialog() {
? ? this.dialogVisible = true;
? ? const input = this.$refs.input;
? ? input.focus();
? },
},

結(jié)果報(bào)錯(cuò)了,原因是沒(méi)有獲取到 input 組件;通過(guò) log,也驗(yàn)證了 this.$refs.input 的值確實(shí)是 undefined。但是經(jīng)過(guò)測(cè)試,如果對(duì)話框默認(rèn)狀態(tài)是打開(kāi)的,就不會(huì)報(bào)錯(cuò);明明組件就在那,為什么獲取不到呢?

生命周期 update

經(jīng)過(guò)分析,這種現(xiàn)象是由于 Vue 實(shí)例的更新機(jī)制造成的。從下方的生命周期圖(局部)中可以看出,組件裝載好之后,遇到數(shù)據(jù)變化時(shí)將重新渲染虛擬 DOM(可以理解為 HTML 中的組件節(jié)點(diǎn))。在本例中,隱藏的 Dialog 組件(以及其中的 input 組件)本來(lái)并沒(méi)有渲染在 DOM 中,是在觀察到 dialogVisible 屬性變?yōu)?true 后再進(jìn)行更新渲染的。

而網(wǎng)頁(yè)渲染通常是一個(gè)異步任務(wù),因此在 visible 屬性剛剛更改時(shí)(一個(gè)函數(shù)中是同步過(guò)程),DOM 渲染還沒(méi)有進(jìn)行,因此自然獲取不到此時(shí)還不存在的 input 組件了。

關(guān)于異步、JS任務(wù)隊(duì)列、宏任務(wù)與微任務(wù)等概念的更多介紹,可參考博文JS多線程:任務(wù)隊(duì)列

為了更直觀地展示這個(gè)過(guò)程,可以在更新前后的鉤子函數(shù)中試圖獲取組件并進(jìn)行打印:

beforeUpdate() {
? console.log("beforeUpdate");
? const input = this.$refs.input;
? console.log(input);
},
updated() {
? console.log("updated");
? const input = this.$refs.input;
? console.log(input);
},
methods: {
? openDialog() {
? ? this.dialogVisible = true;
? ? console.log("click open");
? },
},

結(jié)果如下,可以驗(yàn)證之前的分析和猜想:

click open
beforeUpdate
undefined
updated
VueComponent {...}

Vue.nextTick

為了解決這個(gè)問(wèn)題,Vue 提供了全局 api Vue.nextTick(),它的作用是提供下次 DOM 更新之后的回調(diào)。也就是說(shuō),在更新數(shù)據(jù)后調(diào)用 api,就能夠獲取到重新渲染后的 DOM 并進(jìn)行相關(guān)操作。

nextTick 方法可以廣泛適用于各種需要在數(shù)據(jù)更新后對(duì)相關(guān) DOM 進(jìn)行操作的情景,例如 v-if 、watch 等。

在上文的例子中再加入 nextTick:

openDialog() {
? this.dialogVisible = true;
? console.log("click open");
? this.$nextTick(function () {
? ? console.log("next tick");
? ? const input = this.$refs.input;
? ? console.log(input);
? ? input.focus();
? });
},

可以看到,回調(diào)確實(shí)是在 DOM 更新之后,也就是 updated 執(zhí)行之后才執(zhí)行的。獲取組件與手動(dòng)獲得焦點(diǎn)的操作也能夠正確執(zhí)行了。

click open
beforeUpdate
undefined
updated
VueComponent {...}
next tick
VueComponent {...}

Promise

如果沒(méi)有提供回調(diào)參數(shù),并且瀏覽器支持 Promise,調(diào)用 nextTick 將返回一個(gè) Promise。也就是說(shuō)下面幾種寫(xiě)法是等價(jià)的(環(huán)境支持的情況下):

Vue.nextTick(function () {...})
Vue.nextTick(() => {...})

Vue.nextTick().then(function () {...})
Vue.nextTick().then(() => {...})

關(guān)于 Promise 的介紹和用法,可以參考博文 JS Promise

結(jié)語(yǔ)&參考資料

以上是個(gè)人對(duì) Vue 中 nextTick api 的一些理解與思考,希望能給你提供幫助。如果有問(wèn)題或疏漏之處,歡迎在評(píng)論中討論與指正。

參考資料:

Vue 文檔 - api

Vue 文檔 - 實(shí)例

到此這篇關(guān)于Vue nextTick獲取更新后的DOM的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue nextTick獲取更新后的DOM內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue點(diǎn)擊自增和求和的實(shí)例代碼

    vue點(diǎn)擊自增和求和的實(shí)例代碼

    今天小編就為大家分享一篇vue點(diǎn)擊自增和求和的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能

    vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • vue-cli配置文件——config篇

    vue-cli配置文件——config篇

    這篇文章主要介紹了vue-cli中的webpack是如何配置的,本篇文章主要是分析vue中關(guān)于config文件夾中的相關(guān)代碼,config的文件結(jié)構(gòu),感興趣的朋友參考下本文
    2018-01-01
  • vue + axios get下載文件功能

    vue + axios get下載文件功能

    這篇文章主要為大家詳細(xì)介紹了vue + axios get下載文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Vite結(jié)合Vue刪除指定環(huán)境的console.log問(wèn)題

    Vite結(jié)合Vue刪除指定環(huán)境的console.log問(wèn)題

    這篇文章主要介紹了Vite結(jié)合Vue刪除指定環(huán)境的console.log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue3父子同信的雙向數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    vue3父子同信的雙向數(shù)據(jù)的項(xiàng)目實(shí)現(xiàn)

    我們知道的是,父?jìng)髯拥耐ㄐ?,和子傳父的通信,那如何?shí)現(xiàn)父子相互通信的呢,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-08-08
  • Vue實(shí)現(xiàn)拖拽式分割布局

    Vue實(shí)現(xiàn)拖拽式分割布局

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)拖拽式分割布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue頁(yè)面監(jiān)聽(tīng)鍵盤(pán)按鍵的方法總結(jié)

    Vue頁(yè)面監(jiān)聽(tīng)鍵盤(pán)按鍵的方法總結(jié)

    在Vue頁(yè)面中,可以使用多種方法來(lái)監(jiān)聽(tīng)鍵盤(pán)按鍵,這篇文章主要為大家整理了五種常用的方法,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下
    2023-10-10
  • Vue加載json文件的方法簡(jiǎn)單示例

    Vue加載json文件的方法簡(jiǎn)單示例

    這篇文章主要介紹了Vue加載json文件的方法,結(jié)合實(shí)例形式分析了vue.js針對(duì)json文件的加載及數(shù)據(jù)讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • 一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè))

    一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè))

    這篇文章主要介紹了一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論