最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

<el-button @click="openDialog">點擊打開 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é)果報錯了,原因是沒有獲取到 input 組件;通過 log,也驗證了 this.$refs.input 的值確實是 undefined。但是經(jīng)過測試,如果對話框默認狀態(tài)是打開的,就不會報錯;明明組件就在那,為什么獲取不到呢?

生命周期 update

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

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

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

為了更直觀地展示這個過程,可以在更新前后的鉤子函數(shù)中試圖獲取組件并進行打?。?/p>

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é)果如下,可以驗證之前的分析和猜想:

click open
beforeUpdate
undefined
updated
VueComponent {...}

Vue.nextTick

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

nextTick 方法可以廣泛適用于各種需要在數(shù)據(jù)更新后對相關(guān) DOM 進行操作的情景,例如 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)確實是在 DOM 更新之后,也就是 updated 執(zhí)行之后才執(zhí)行的。獲取組件與手動獲得焦點的操作也能夠正確執(zhí)行了。

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

Promise

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

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

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

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

結(jié)語&參考資料

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

參考資料:

Vue 文檔 - api

Vue 文檔 - 實例

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

相關(guān)文章

  • Vue極簡生成器?Vuepress的實現(xiàn)

    Vue極簡生成器?Vuepress的實現(xiàn)

    本文主要介紹了Vue極簡生成器?Vuepress的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • Vue項目WebPack打包刪除注釋和console

    Vue項目WebPack打包刪除注釋和console

    這篇文章主要介紹了Vue項目WebPack打包刪除注釋和console,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue子父組件之間傳值的三種方法示例

    Vue子父組件之間傳值的三種方法示例

    Vue的組件化給前端開發(fā)帶來極大的便利,下面這篇文章主要給大家介紹了關(guān)于Vue子父組件之間傳值的三種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • vue $router和$route的區(qū)別詳解

    vue $router和$route的區(qū)別詳解

    這篇文章主要介紹了vue $router和$route的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • UniApp中實現(xiàn)類似錨點定位滾動效果

    UniApp中實現(xiàn)類似錨點定位滾動效果

    一個uniapp小程序的項目,我們需要實現(xiàn)一個非常實用的功能——類似于錨點定位的交互效果,即在首頁中有多個tab(分類標(biāo)簽),每個tab對應(yīng)著不同的模塊,當(dāng)用戶點擊某個分類的tab時,需要流暢地滾動到對應(yīng)的內(nèi)容位置,提供更好的用戶體驗,
    2023-10-10
  • vue 單元測試的推薦插件和使用示例

    vue 單元測試的推薦插件和使用示例

    單元測試是軟件開發(fā)非?;A(chǔ)的一部分。單元測試會封閉執(zhí)行最小化單元的代碼,使得添加新功能和追蹤問題更容易。Vue 的單文件組件使得為組件撰寫隔離的單元測試這件事更加直接。它會讓你更有信心地開發(fā)新特性而不破壞現(xiàn)有的實現(xiàn),并幫助其他開發(fā)者理解你的組件的作用。
    2021-06-06
  • 淺談vuex 閑置狀態(tài)重置方案

    淺談vuex 閑置狀態(tài)重置方案

    本篇文章主要介紹了vuex 閑置狀態(tài)重置方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue中全局路由守衛(wèi)中替代this操作(this.$store/this.$vux)

    vue中全局路由守衛(wèi)中替代this操作(this.$store/this.$vux)

    這篇文章主要介紹了vue中全局路由守衛(wèi)中替代this操作(this.$store/this.$vux),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue3.x如何設(shè)置瀏覽器動態(tài)Title方法

    Vue3.x如何設(shè)置瀏覽器動態(tài)Title方法

    這篇文章主要介紹了Vue3.x如何設(shè)置瀏覽器動態(tài)Title方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue項目結(jié)構(gòu)目錄超詳細介紹

    vue項目結(jié)構(gòu)目錄超詳細介紹

    這篇文章主要給大家介紹了關(guān)于vue項目結(jié)構(gòu)目錄超詳細介紹的相關(guān)資料,Vue項目目錄結(jié)構(gòu)是指在開發(fā)Vue項目時,為了更好地組織和管理代碼,將不同的文件按照一定的規(guī)則和層次結(jié)構(gòu)進行分類和存放的方式,需要的朋友可以參考下
    2023-12-12

最新評論

梧州市| 滁州市| 江华| 焉耆| 搜索| 门头沟区| 隆子县| 镇平县| 多伦县| 始兴县| 墨玉县| 格尔木市| 长宁县| 溧阳市| 萝北县| 顺平县| 格尔木市| 富平县| 宜兰市| 溧水县| 资阳市| 三原县| 浮梁县| 桂平市| 银川市| 藁城市| 黑龙江省| 清徐县| 白银市| 合作市| 交口县| 台南市| 云安县| 买车| 铁力市| 黑水县| 霞浦县| 五家渠市| 宁明县| 德保县| 菏泽市|