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

vue的異步數(shù)據(jù)更新機(jī)制與$nextTick用法解讀

 更新時(shí)間:2023年03月28日 08:37:33   作者:liguoyuan819  
這篇文章主要介紹了vue的異步數(shù)據(jù)更新機(jī)制與$nextTick用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue異步數(shù)據(jù)更新機(jī)制與$nextTick

vue異步更新dom

vue的響應(yīng)式更新dom是異步執(zhí)行的,不是數(shù)據(jù)發(fā)生變化之后dom立即發(fā)生變化,而是按照一定的邏輯更新dom。

具體是vue在檢測(cè)到數(shù)據(jù)變化時(shí),vue將開(kāi)啟一個(gè)隊(duì)列,,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更。如果同一個(gè) watcher 被多次觸發(fā),只會(huì)被推入到隊(duì)列中一次。這在緩沖中去除重復(fù)數(shù)據(jù)造成的額外的dom操作和計(jì)算是非常必要的。在下一個(gè)nextTick中,vue執(zhí)行的是已經(jīng)去重的實(shí)際工作。

理解:vue執(zhí)行dom更新時(shí)異步的,這個(gè)異步任務(wù)可以當(dāng)成是一個(gè)promise的微任務(wù),對(duì)同一個(gè)屬性值進(jìn)行多次賦值時(shí),只有最后一次賦值會(huì)作為一個(gè)promise微任務(wù)放到更新隊(duì)列里面。

$nextTick執(zhí)行機(jī)制

Vue會(huì)異步更新DOM,會(huì)在當(dāng)前執(zhí)行棧的最后更新DOM,這個(gè)與JavaScript的原生操作dom有很大區(qū)別。vue中的$nextTick再JavaScript中相當(dāng)于微任務(wù),會(huì)在當(dāng)前所有同步任務(wù)執(zhí)行完之后再執(zhí)行,$nextTick會(huì)得到dom更新后的結(jié)果。最后頁(yè)面渲染是在始終是在微任務(wù)執(zhí)行之后在執(zhí)行的,所以$nextTick回調(diào)執(zhí)行時(shí)還沒(méi)有渲染,頁(yè)面上看不到更新后的結(jié)果。

vue執(zhí)行異步更新的目的

vue更新dom的流程:觸發(fā)setter --> 監(jiān)聽(tīng)watcher --> 重新渲染 render --> 生成虛擬dom (vdom)--> 更新dom 。如果每一次都執(zhí)行該流程會(huì)非常消耗性能,所以使用異步更新DOM的機(jī)制,先對(duì)數(shù)據(jù)修改進(jìn)行整合去重,再使用最終的結(jié)果一次性對(duì)DOM進(jìn)行更新。

vue異步數(shù)據(jù)更新問(wèn)題

記錄一下出現(xiàn)的問(wèn)題, 數(shù)據(jù)翻倍

這是復(fù)現(xiàn)問(wèn)題的代碼

 data() {
    return {
      space: "",
      allresult: []
    };
  },
  methods: {
    getmessage() {
      this.allresult = [];
      axios
        .get(
          "https://gist.githubusercontent.com/xiaolannuoyi/9b0defe4959e71fa97e6096cc4f82ba4/raw/4be939123d488cee7ecefc055fb5ecb2ed8d5c8d/test"
        )
        .then(data => {
          console.log(data);
          let result = data.data;
          for (let i = 0; i < result.length; i++) {
            //原因在于這里的this.Allresult
            this.allresult.push({
              id: result[i].id,
              name: result[i].name,
              age: result[i].age
            });
            
          }
            console.log('此時(shí)的this.allresult',this.allresult);
        });
    }
  },
  watch: {
    space() {
      console.log("watch");
      this.getmessage();
    }
  },
  mounted() {
    this.space = "123";
    console.log("mounted");
    this.getmessage();
  }

結(jié)果

在這里插入圖片描述

此時(shí)你可以看到第二次的數(shù)據(jù)時(shí) 是 第一次的 2倍

原因

mounted 和 watch 都執(zhí)行 getmessage 方法,雖然方法之前 對(duì)數(shù)據(jù)進(jìn)行了清空,但是 異步請(qǐng)求執(zhí)行的慢,

所以兩次調(diào)用getmessage相當(dāng)于 this.allresult = []; this.allresult = []; axios...;axios....: 這個(gè)順序

所以才會(huì)出現(xiàn)上述現(xiàn)象

解決

1.修改this.allresult = []的位置

在這里插入圖片描述

2.新建一個(gè)臨時(shí)空數(shù)組

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • vue中v-model失效原因以及解決方案

    vue中v-model失效原因以及解決方案

    這篇文章主要給大家介紹了關(guān)于vue中v-model失效原因以及解決方案的相關(guān)資料,vue的v-model是一個(gè)雙向綁定的數(shù)據(jù)流,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Vue.js處理API請(qǐng)求失敗的最佳實(shí)踐和策略

    Vue.js處理API請(qǐng)求失敗的最佳實(shí)踐和策略

    在現(xiàn)代Web開(kāi)發(fā)中,與后端API的交互是不可避免的,然而,網(wǎng)絡(luò)請(qǐng)求是不穩(wěn)定的,可能會(huì)因?yàn)楦鞣N原因失敗,因此,優(yōu)雅地處理API請(qǐng)求失敗的情況是提升用戶體驗(yàn)和應(yīng)用穩(wěn)定性的關(guān)鍵,本文將詳細(xì)介紹在Vue.js中處理API請(qǐng)求失敗的最佳實(shí)踐和策略,需要的朋友可以參考下
    2024-12-12
  • Vue組件設(shè)計(jì)-滾動(dòng)置頂設(shè)計(jì)案例

    Vue組件設(shè)計(jì)-滾動(dòng)置頂設(shè)計(jì)案例

    這篇文章主要介紹了Vue組件設(shè)計(jì)-滾動(dòng)置頂設(shè)計(jì)案例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決

    vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決

    這篇文章主要介紹了vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • element滾動(dòng)條組件el-scrollbar的使用詳解

    element滾動(dòng)條組件el-scrollbar的使用詳解

    本文主要介紹了element滾動(dòng)條組件el-scrollbar的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • vue-plugin-hiprint 詳細(xì)使用

    vue-plugin-hiprint 詳細(xì)使用

    這篇文章主要介紹了vue-plugin-hiprint 詳細(xì)使用說(shuō)明,使用Vue.Draggable庫(kù)構(gòu)建可拖拽元素的示例,你可以根據(jù)具體需求和技術(shù)選型選擇適合的庫(kù)或方法來(lái)實(shí)現(xiàn)可拖拽元素的功能,需要的朋友可以參考下
    2023-08-08
  • Vue.js中this如何取到data和method里的屬性詳解

    Vue.js中this如何取到data和method里的屬性詳解

    methods屬性是一個(gè)對(duì)象,通常我們會(huì)在這個(gè)對(duì)象中定義很多的方法,下面這篇文章主要給大家介紹了關(guān)于Vue.js中this如何取到data和method里的屬性,需要的朋友可以參考下
    2022-12-12
  • Vue中使用及封裝websocket示例詳解

    Vue中使用及封裝websocket示例詳解

    這篇文章主要為大家介紹了Vue中使用及封裝websocket示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • vue中$nexttick,$set,$forceupdate的區(qū)別

    vue中$nexttick,$set,$forceupdate的區(qū)別

    本文主要介紹了vue中$nexttick,$set,$forceupdate的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • element el-tree組件的動(dòng)態(tài)加載、新增、更新節(jié)點(diǎn)的實(shí)現(xiàn)

    element el-tree組件的動(dòng)態(tài)加載、新增、更新節(jié)點(diǎn)的實(shí)現(xiàn)

    這篇文章主要介紹了element el-tree組件的動(dòng)態(tài)加載、新增、更新節(jié)點(diǎn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論

屏南县| 南通市| 遂溪县| 苍南县| 克东县| 昌都县| 邵阳县| 砚山县| 昭通市| 青海省| 林口县| 科技| 葫芦岛市| 舞钢市| 东阳市| 千阳县| 乌兰察布市| 漠河县| 乳源| 仪陇县| 武鸣县| 北宁市| 房产| 长岛县| 五指山市| 广汉市| 海盐县| 新邵县| 察雅县| 措美县| 弥勒县| 遵义县| 都江堰市| 贵溪市| 荣成市| 平利县| 乐山市| 南溪县| 石首市| 汾阳市| 石嘴山市|