亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

VUE實(shí)時(shí)監(jiān)聽元素距離頂部高度的操作

瀏覽:68日期:2022-12-23 15:46:10

效果圖如下所示

VUE實(shí)時(shí)監(jiān)聽元素距離頂部高度的操作

.html

<!-- 監(jiān)聽ref距離頂部高度 --><div ref='pronbit'> <div>今日熱門</div> <div>今日熱銷</div></div>

.js

mounted(){ window.addEventListener(’scroll’,this.handleScrollx,true)},methods: { handleScrollx() { console.log(’滾動(dòng)高度’,window.pageYOffset) console.log(’距離頂部高度’,this.$refs.pronbit.getBoundingClientRect().top) },}

補(bǔ)充知識(shí):Vue異步更新隊(duì)列 及 $nextTick的使用

問題一:什么是$nextTick?

簡單回答:

因?yàn)閂ue的異步更新隊(duì)列,$nextTick是用來知道什么時(shí)候DOM更新完成的。

詳細(xì)解讀:

我們先來看這樣一個(gè)場景:有一個(gè)div,默認(rèn)用 v-if 將它隱藏,點(diǎn)擊一個(gè)按鈕后,改變 v-if 的值,讓它顯示出來,同時(shí)拿到這個(gè)div的文本內(nèi)容。如果v-if的值是 false,直接去獲取div內(nèi)容是獲取不到的,因?yàn)榇藭r(shí)div還沒有被創(chuàng)建出來,那么應(yīng)該在點(diǎn)擊按鈕后,改變v-if的值為 true,div才會(huì)被創(chuàng)建,此時(shí)再去獲取,示例代碼如下:

<div id='app'> <div v-if='showDiv'>這是一段文本</div> <button @click='getText'>獲取div內(nèi)容</button> </div> <script> var app = new Vue({ el : '#app', data:{ showDiv : false }, methods:{ getText:function(){this.showDiv = true;var text = document.getElementById(’div’).innnerHTML; console.log(text); } } }) </script>

這段代碼并不難理解,但是運(yùn)行后在控制臺(tái)會(huì)拋出一個(gè)錯(cuò)誤:Cannot read property ’innnerHTML of null,意思就是獲取不到div元素。這里就涉及Vue一個(gè)重要的概念:異步更新隊(duì)列。

異步更新隊(duì)列

Vue在觀察到數(shù)據(jù)變化時(shí)并不是直接更新DOM,而是開啟一個(gè)隊(duì)列,并緩沖在同一個(gè)事件循環(huán)中發(fā)生的所有數(shù)據(jù)改變。在緩沖時(shí)會(huì)去除重復(fù)數(shù)據(jù),從而避免不必要的計(jì)算和DOM操作。然后,在下一個(gè)事件循環(huán)tick中,Vue刷新隊(duì)列并執(zhí)行實(shí)際(已去重的)工作。所以如果你用一個(gè)for循環(huán)來動(dòng)態(tài)改變數(shù)據(jù)100次,其實(shí)它只會(huì)應(yīng)用最后一次改變,如果沒有這種機(jī)制,DOM就要重繪100次,這固然是一個(gè)很大的開銷。

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

知道了Vue異步更新DOM的原理,上面示例的報(bào)錯(cuò)也就不難理解了。事實(shí)上,在執(zhí)行this.showDiv = true時(shí),div仍然還是沒有被創(chuàng)建出來,直到下一個(gè)vue事件循環(huán)時(shí),才開始創(chuàng)建。$nextTick就是用來知道什么時(shí)候DOM更新完成的,所以上面的示例代碼需要修改為:

<div id='app'> <div v-if='showDiv'>這是一段文本</div> <button @click='getText'>獲取div內(nèi)容</button> </div> <script> var app = new Vue({ el : '#app', data:{ showDiv : false }, methods:{ getText:function(){this.showDiv = true;this.$nextTick(function(){ var text = document.getElementById(’div’).innnerHTML; console.log(text); }); } } }) </script>

這時(shí)再點(diǎn)擊事件,控制臺(tái)就打印出div的內(nèi)容“這是一段文本“了。

理論上,我們應(yīng)該不用去主動(dòng)操作DOM,因?yàn)閂ue的核心思想就是數(shù)據(jù)驅(qū)動(dòng)DOM,但在很多業(yè)務(wù)里,我們避免不了會(huì)使用一些第三方庫,比如 popper.js、swiper等,這些基于原生javascript的庫都有創(chuàng)建和更新及銷毀的完整生命周期,與Vue配合使用時(shí),就要利用好$nextTick。

以上這篇VUE實(shí)時(shí)監(jiān)聽元素距離頂部高度的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 国产色产综合色产在线观看视频 | 国产区在线观看视频 | 玖玖精品在线观看 | 免费无限制观看黄的网址 | 黑人双插 | 黄色网址入口 | 国产美女亚洲精品久久久综合91 | 久久99精品久久久久久国产越南 | 天天影视亚洲 | 99在线热视频 | 亚洲欧美日本综合一区二区三区 | 国产精品久久久久天天影视 | 在线观看国产欧美 | 99久久精品国产交换 | 精品一区二区三区在线观看视频 | 日韩美女专区中文字幕 | 久青草免费视频手机在线观看 | 一级全黄视频 | 亚洲一级片在线播放 | 国产拍拍视频一二三四区 | 日本人与黑人做爰视频网站 | 久久91精品国产一区二区 | 亚洲黄网在线播放高清 | 免费一级做a爰片性色毛片 免费一级做a爰片性视频 | 草草视频免费在线观看 | 在线欧美日韩国产 | 亚洲欧美日产综合一区二区三区 | 91一区二区午夜免费福利网站 | 9久热久re爱免费精品视频 | 国内自拍在线观看 | 一级毛片中文字幕 | 国产免费大片 | 国产性大片免费播放网站 | 国产高跟丝袜 | 黄色录像一级片 | 国产精品爽爽影院在线 | 国产乱在线观看视频 | 午夜毛片不卡高清免费 | 亚洲人成黄网在线观看 | 久久国产精品99久久久久久牛牛 | 国产码欧美日韩高清综合一区 |