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

vue獲取v-for異步數(shù)據(jù)dom的解決問題

 更新時間:2023年03月24日 09:32:38   作者:飗釧酆  
這篇文章主要介紹了vue獲取v-for異步數(shù)據(jù)dom的解決問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

vue獲取v-for異步數(shù)據(jù)dom

問題描述

每次加載界面時,在 mounted階段,只能獲取普通dom(指靜態(tài)渲染的dom),獲取不到v-for的dom,盡管使用$nextTick也獲取不到,雖然使用setTimeOut能解決,但這種方法真的很low,作為程序員要追求完美,下面我們看看怎么完美解決這個問題。

原因

在v-for里的數(shù)據(jù)是異步獲取的,里面的id或者class也都是動態(tài)綁定的,而mounted階段只是實例掛載完成,這時候異步請求的數(shù)據(jù)大概率還沒請求完成,從而v-for要渲染的dom肯定也還沒開始渲染,這時候連異步請求的數(shù)據(jù)都獲取不到,更別說需要異步數(shù)據(jù)來渲染的dom了。

$nextTick是指整個視圖渲染完成,注意這里不包含異步請求的數(shù)據(jù),在整個視圖渲染完成時異步數(shù)據(jù)未必能請求到。所以調(diào)用$nextTick其實也沒什么兩樣。

解決思路及方案

第一種并不是很完美的方案:使用updated鉤子

updated 階段是完成了數(shù)據(jù)更新到 DOM 的階段(對加載回來的數(shù)據(jù)進行處理),此時,在使用document等獲取dom是可以得到的。

updated 與 mounted 不同的是,在每一次的 DOM 結(jié)構(gòu)更新,Vue.js 都會調(diào)用一次 updated 鉤子函數(shù)!而 mounted 鉤子函數(shù)僅僅只執(zhí)行一次而已。

但是,本人不推薦這么做,因為如果項目中數(shù)據(jù)更新很頻繁,虛擬dom也會跟著經(jīng)常更新,如果在updated中獲取dom,會造成操作過于頻繁的問題,也就會多多少少影響程序性能。在vue官方也有提到。

vue官網(wǎng)

完美解決的方案:在異步數(shù)據(jù)獲取完成時調(diào)用$nextTick獲取dom

想獲取異步請求數(shù)據(jù)渲染的dom就一定得等到數(shù)據(jù)接收到后再進行相應(yīng)的操作。而有同學(xué)就問了,為什么在獲取到數(shù)據(jù)后還要調(diào)$nextTick呢?

因為獲取到數(shù)據(jù)之后v-for去動態(tài)渲染dom肯定也是需要一定時間的,不可能馬上就能渲染完成,所以在獲取到異步數(shù)據(jù)之后再等整個視圖渲染完成時去獲取dom是最好的選擇。

那要在created或者mounted或者在watch中獲取就看個人選擇了。

created或者mounted中需要在獲取完數(shù)據(jù)后在then或者await接受返回的數(shù)據(jù)再調(diào)用$nextTick獲取dom,在watch中就直接監(jiān)視請求的數(shù)據(jù),數(shù)據(jù)改變就說明獲取到了,就可以調(diào)用$nextTick獲取dom了。

vue獲取DOM問題

利用 ref 和 $refs 可以用于獲取 dom 元素

<h1 id="h" ref="myH">我是一個孤獨可憐又能吃的h1</h1>
?
mounted() {
? ? console.log(document.getElementById("h"));
? ? console.log(this.$refs.myH);
? },

使用ref調(diào)用組件內(nèi)的方法。

<Demo ref="de"></Demo>
?
import Demo from "./child/demo";
?
//組件起別名ref
let demoObj = this.$refs.de;
//可以以此調(diào)用組件內(nèi)的方法,變量等
? ? demoObj.fn();

$nextTick使用

如果我們修改某個出現(xiàn)在DOM里的變量,之后又要獲取DOM里的變量值,那么會發(fā)現(xiàn)DOM里變量值并未修改成功,因為Vue更新DOM是異步的,用$nextTick解決。

因為vue 通過異步隊列控制 DOM 更新和 nextTick 回調(diào)函數(shù)先后執(zhí)行。

<p ref="myP">{{ count }}</p>
<button @click="btn">點擊count+1, 馬上提取p標(biāo)簽內(nèi)容</button>
?
btn() {
? ? ? this.count++; // vue監(jiān)測數(shù)據(jù)更新, 開啟一個DOM更新隊列(異步任務(wù))
? ? ? console.log(this.count) //1
? ? ? //因為Vue更新DOM是異步的,所以count雖然完成加一,但這里的DOM還未更新。
? ? ? console.log(this.$refs.myP.innerHTML); // 0
?
? ? ? // 解決: this.$nextTick()
? ? ? // 過程: DOM更新完會挨個觸發(fā)$nextTick里的函數(shù)體
? ? ? this.$nextTick(() => {
? ? ? ? console.log(this.$refs.myP.innerHTML); // 1
? ? ? });
?
? ? ? //方法二: async 函數(shù)執(zhí)行時, async btn(){}
? ? ? //如果遇到 await 就會先暫停執(zhí)行 ,等到觸發(fā)的異步操作完成后,
? ? ? //恢復(fù) async 函數(shù)的執(zhí)行并返回解析值
? ? ? await this.$nextTick()
? ? ? this.$refs.myP.innerHTML
? },

組件name屬性使用 

我們封裝的組件-可以自己定義name屬性組件名-讓使用者有個統(tǒng)一的前綴風(fēng)格

1.給組件(Demo)起個名字,用組件的name屬性值, 來注冊組件名字

export default {
? name: "Mmm",
}

2.之后就可以用Mmm當(dāng)作標(biāo)簽使用

import Demo from "./child/demo";
?
components: {
? ? // Demo,
? ? [Demo.name]: Demo,
? },

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue2.x 對象劫持的原理實現(xiàn)

    vue2.x 對象劫持的原理實現(xiàn)

    這篇文章主要介紹了vue2.x 對象劫持的原理實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Vue中的事件處理詳情

    Vue中的事件處理詳情

    這篇文章主要介紹了Vue中的事件處理詳情,文章通過給按鈕綁定一個?click?事件展開詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Vue3實現(xiàn)掛載全局方法和用getCurrentInstance代替this

    Vue3實現(xiàn)掛載全局方法和用getCurrentInstance代替this

    這篇文章主要介紹了Vue3實現(xiàn)掛載全局方法和用getCurrentInstance代替this,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue 全家桶實現(xiàn)移動端酷狗音樂功能

    Vue 全家桶實現(xiàn)移動端酷狗音樂功能

    這篇文章主要介紹了Vue 全家桶實現(xiàn)移動端酷狗音樂功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • vue普通加密及國密SM2、SM3和sm4的使用例子

    vue普通加密及國密SM2、SM3和sm4的使用例子

    在我的項目中,甲方要求系統(tǒng)登錄時對密碼進行加密后再傳給后端,指定使用國密SM3,下面這篇文章主要給大家介紹了關(guān)于vue普通加密及國密SM2、SM3和sm4使用的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • vue data恢復(fù)初始化數(shù)據(jù)的實現(xiàn)方法

    vue data恢復(fù)初始化數(shù)據(jù)的實現(xiàn)方法

    今天小編就為大家分享一篇vue data恢復(fù)初始化數(shù)據(jù)的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue.js循環(huán)radio的實例

    vue.js循環(huán)radio的實例

    今天小編就為大家分享一篇vue.js循環(huán)radio的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 詳解從零搭建 vue2 vue-router2 webpack3 工程

    詳解從零搭建 vue2 vue-router2 webpack3 工程

    本篇文章主要介紹了詳解從零搭建 vue2 vue-router2 webpack3 工程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • vue2結(jié)合echarts實現(xiàn)一個地圖的效果

    vue2結(jié)合echarts實現(xiàn)一個地圖的效果

    這篇文章主要介紹了vue2結(jié)合echarts實現(xiàn)一個地圖的效果,本文通過實例代碼給大家介紹的非常詳細(xì),對大家何用vue和echarts實現(xiàn)一個地圖有一定的幫助,感興趣的朋友一起看看吧
    2024-03-03
  • Vue3?實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài))

    Vue3?實現(xiàn)驗證碼倒計時功能(刷新保持狀態(tài))

    倒計時的運用場景是需要經(jīng)常用到的,但是根據(jù)業(yè)務(wù)的不同,好比手機驗證碼或者是郵箱驗證碼之類的,即使用戶跳轉(zhuǎn)到其它頁面或者刷新,再次回到登錄也,驗證碼的倒計時也得保持狀態(tài),下面通過本文給大家分享Vue3?驗證碼倒計時功能實現(xiàn),感興趣的朋友一起看看吧
    2022-08-08

最新評論

宜丰县| 潜山县| 修文县| 宁武县| 昔阳县| 稻城县| 休宁县| 内江市| 荥阳市| 化德县| 安岳县| 庄浪县| 广元市| 福鼎市| 荥经县| 凉山| 永年县| 西乡县| 泰顺县| 禹州市| 广河县| 从江县| 宁晋县| 伽师县| 泽库县| 武邑县| 牡丹江市| 乌拉特后旗| 黎川县| 阳西县| 奇台县| 永年县| 乌苏市| 济源市| 青阳县| 望江县| 拉萨市| 左权县| 东源县| 青河县| 衢州市|