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

Vue異步更新DOM及$nextTick執(zhí)行機制解讀

 更新時間:2023年03月24日 09:59:07   作者:shangdong2023  
這篇文章主要介紹了Vue異步更新DOM及$nextTick執(zhí)行機制解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Vue異步更新DOM策略

我們知道,Vue實現(xiàn)響應式并不是數(shù)據(jù)發(fā)生變化之后DOM立即變化,而是按一定的策略進行DOM的更新。

Vue 在更新 DOM 時是異步執(zhí)行的。只要偵聽到數(shù)據(jù)變化,Vue 將開啟一個隊列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更。如果同一個 watcher 被多次觸發(fā),只會被推入到隊列中一次。這種在緩沖時去除重復數(shù)據(jù)對于避免不必要的計算和 DOM 操作是非常重要的。然后,在下一個的事件循環(huán) “tick" 中,Vue 刷新隊列并執(zhí)行實際(已去重的)工作。

$nextTick執(zhí)行機制

$nextTick會在DOM更新之后被觸發(fā),以獲取最新DOM節(jié)點。

具體來講:我們使用 JavaScript 進行原生DOM操作時,隨著 JavaScript 代碼執(zhí)行會同步進行DOM更新;而使用 Vue 則會異步更新 DOM,會在當前執(zhí)行棧的最后更新DOM。

對于兼容的瀏覽器來說,nextTick相當于是微任務,即$nextTick的回調(diào)函數(shù)是在當前執(zhí)行棧的所有同步任務執(zhí)行完畢后再執(zhí)行,所以nextTick中會得到 DOM 更新后的結果。(不過頁面渲染始終是在微任務執(zhí)行之后才進行的,所以$nextTick回調(diào)函數(shù)執(zhí)行時頁面還沒有進行渲染,回調(diào)函數(shù)執(zhí)行時在頁面上看不到更新后的結果)

注:瀏覽器如果不兼容則有幾種備選方案,其中setTimeout是最后的一種備選方案,它會將回調(diào)函數(shù)加入任務隊列 task 中,等待執(zhí)行。

示例詳解

JavaScript原生DOM操作(隨著JS代碼的執(zhí)行同步進行DOM更新):

<body>
? ? <ul id="ul1">
? ? ? ? <li>100</li>
? ? ? ? <li>200</li>
? ? ? ? <li>300</li>
? ? </ul>

? ? <script>
? ? ? ? const ul1 = document.getElementById('ul1')
? ? ? ? console.log(ul1.children.length); // 3
? ? ? ? const newLi = document.createElement('li')
? ? ? ? newLi.innerHTML = '400'
? ? ? ? ul1.appendChild(newLi)
? ? ? ? console.log(ul1.children.length); // 4
? ? ? ? Promise.resolve().then(() => {
? ? ? ? ? ? alert(ul1.children.length) // 彈出4,此時頁面還沒有進行渲染(頁面還未展示內(nèi)容)
? ? ? ? })
? ? </script>
</body>

Vue異步更新DOM:

<template>
? <div id="app">
? ? <ul ref="ul1">
? ? ? <li v-for="(item, index) in list" :key="index">
? ? ? ? {{ item }}
? ? ? </li>
? ? </ul>
? ? <button @click="addItem">添加一項</button>
? </div>
</template>

<script>
export default {
? name: "app",
? data() {
? ? return {
? ? ? list: ["a", "b", "c"],
? ? };
? },
? methods: {
? ? addItem() {
? ? ? this.list.push(`${Date.now()}`);
? ? ? this.list.push(`${Date.now()}`);
? ? ? this.list.push(`${Date.now()}`);

? ? ? // 獲取 DOM 元素
? ? ? const ulElem = this.$refs.ul1;
? ? ? // eslint-disable-next-line
? ? ? console.log(ulElem.childNodes.length);// 3

? ? ? // 1. 異步進行 dom 更新,$nextTick 待 DOM 更新完再回調(diào)
? ? ? // 2. dom 更新時會將 data 的修改做整合,多次 data 修改只會更新一次
? ? ? this.$nextTick(() => {
? ? ? ? // eslint-disable-next-line
? ? ? ? console.log(ulElem.childNodes.length); // 6

? ? ? ? alert(ulElem.childNodes.length); // 彈出 6,此時頁面還沒有進行渲染(頁面還沒展示新添加的3個元素)
? ? ? });
? ? },
? },
};
</script>

Vue異步更新DOM的目的

因為如果同步進行DOM更新,則每次對響應式數(shù)據(jù)進行修改就都會觸發(fā)setter -> 通知watcher -> 觸發(fā)re-render -> 生成new vnode(vdom) -> patch(更新真實DOM)。

如果每次修改數(shù)據(jù)都會走一遍這個流程是非常消耗性能的,所以使用異步更新 DOM 的策略,先對數(shù)據(jù)修改進行整合,再使用最終的整合結果一次性對 DOM 進行更新。

$nextTick應用示例

<template>
? <div>
? ? <button @click="callbackFun">點我展示輸入框并自動獲取焦點</button> <br />
? ? <input type="text" v-show="test" ref="input" />
? </div>
</template>

<script>
export default {
? name: "App",
? data() {
? ? return {
? ? ? test: false,
? ? };
? },
? methods: {
? ? callbackFun() {
? ? ? this.test = true;
? ? ? this.$nextTick(function () {
? ? ? ? this.$refs.input.focus(); // 若該行代碼不放在 $nextTick 中,則無法展示輸入框后自動獲取焦點
? ? ? });
? ? },
? },
};
</script>

總結

以上代碼,因為將獲取焦點的代碼放入$nextTick的回調(diào)函數(shù)中執(zhí)行,所以點擊button后會展示已經(jīng)獲取到焦點的輸入框。

希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • vue實現(xiàn)拖動調(diào)整左右兩側容器大小

    vue實現(xiàn)拖動調(diào)整左右兩側容器大小

    這篇文章主要為大家詳細介紹了vue實現(xiàn)拖動調(diào)整左右兩側容器大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue watch監(jiān)聽數(shù)據(jù)變化的案例詳解

    vue watch監(jiān)聽數(shù)據(jù)變化的案例詳解

    監(jiān)聽數(shù)據(jù)變化,在Vue中是通過偵聽器來實現(xiàn)的,你也可以將它理解為監(jiān)聽器,時刻監(jiān)聽某個數(shù)據(jù)的變化,本文將通過代碼示例為大家詳細的介紹一下vue watch如何監(jiān)聽數(shù)據(jù)變化,需要的朋友可以參考下
    2023-07-07
  • vue的簡介及@vue/cli?腳手架的使用示例

    vue的簡介及@vue/cli?腳手架的使用示例

    vue 是一個 漸進式的javascript框架,腳手架是一個通用概念,幫助搭建項目的工具,本文以vue2為例結合實例代碼給大家詳細講解,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • 詳解在Vue中通過自定義指令獲取dom元素

    詳解在Vue中通過自定義指令獲取dom元素

    本篇文章主要介紹了詳解在Vue中通過自定義指令獲取dom元素 ,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • vue2.0在table中實現(xiàn)全選和反選的示例代碼

    vue2.0在table中實現(xiàn)全選和反選的示例代碼

    這篇文章主要介紹了vue2.0在table中實現(xiàn)全選和反選的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • vue中控制mock在開發(fā)環(huán)境使用,在生產(chǎn)環(huán)境禁用方式

    vue中控制mock在開發(fā)環(huán)境使用,在生產(chǎn)環(huán)境禁用方式

    這篇文章主要介紹了vue中控制mock在開發(fā)環(huán)境使用,在生產(chǎn)環(huán)境禁用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • el-tree文字顯示不全的解決辦法

    el-tree文字顯示不全的解決辦法

    本文主要介紹了el-tree文字顯示不全的解決辦法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Vue.js 中的異步組件是什么及使用異步組件的示例

    Vue.js 中的異步組件是什么及使用異步組件的示例

    異步組件是 Vue.js 中提高應用程序性能和加載速度的重要功能之一,在使用異步組件時,需要注意組件的加載時間、錯誤處理和命名規(guī)范等問題,本文將介紹 Vue.js 中異步組件的概念、優(yōu)勢以及如何使用異步組件,感興趣的朋友一起看看吧
    2023-10-10
  • 基于Vue實現(xiàn)timepicker

    基于Vue實現(xiàn)timepicker

    這篇文章主要為大家詳細介紹了基于Vue實現(xiàn)timepicker效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 詳解在vue-cli中使用路由

    詳解在vue-cli中使用路由

    本篇文章主要介紹了詳解在vue-cli中使用路由,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

西乌珠穆沁旗| 新巴尔虎右旗| 鄯善县| 顺昌县| 招远市| 孟津县| 福贡县| 襄城县| 安溪县| 启东市| 台南市| 水富县| 荣成市| 嘉祥县| 高碑店市| 河东区| 察隅县| 武冈市| 锡林浩特市| 九江市| 南涧| 南皮县| 驻马店市| 英超| 南阳市| 任丘市| 桓台县| 称多县| 思南县| 迁安市| 东台市| 大渡口区| 阿巴嘎旗| 潢川县| 杭锦后旗| 获嘉县| 蓬安县| 米泉市| 鄯善县| 二连浩特市| 利川市|