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

Vue3 動態(tài)ref問題及解決

 更新時間:2025年07月23日 15:32:09   作者:linab112  
Vue3動態(tài)ref在組件卸載后保留key,值置為null,需手動檢查null以避免錯誤,不可刪除key,此為設(shè)計行為,旨在維護(hù)響應(yīng)式結(jié)構(gòu)完整性及性能優(yōu)化

1.問題描述

在Vue 3項目中,當(dāng)使用動態(tài)ref來引用組件時,刪除組件后發(fā)現(xiàn)ref對象中對應(yīng)的key仍然存在,只是值變?yōu)閌null`,而不是完全刪除該key。

在一個可拖拽的卡片列表組件中:

  • 使用動態(tài)ref來引用每個卡片中的數(shù)據(jù)列表組件
  • 當(dāng)刪除卡片時,需要同時清理對應(yīng)的ref引用
  • 發(fā)現(xiàn)刪除后ref對象中key仍存在,值為`null`

2.示例代碼

<template>
  <div>
    <a-card v-for="item in dragList" :key="item.id">
      <!-- 動態(tài)ref的使用 -->
      <data-list 
        :ref="el => { dataListRef[item.id] = el }" 
        :doc-id="item.id"
        :open-type="item.openType"
      />
    </a-card>
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';

const dragList = ref<any[]>([]);
const dataListRef = ref<Record<string, any>>({});

// 刪除卡片方法
function remove(index: number) {
  const current = dragList.value[index];

  // 處理編輯狀態(tài)
  if (current.openType === OPEN_WRITE) {
    const docIds = [current.id];
    closeDocEntry(docIds);
  }

  // 從列表中移除
  dragList.value.splice(index, 1);

  // 更新其他項目的源列表
  for (let ele of dragList.value) {
    const oldSourceList = ele.sourceList;
    ele.sourceList = oldSourceList.filter((item: any) => item.sourceId !== current.id);
  }

  // Vue 會自動處理動態(tài) ref 的清理,無需手動刪除,即使執(zhí)行了刪除方法,也不會刪除key
  // dataListRef.value[current.id] 會自動變?yōu)?null
}

// 刷新所有數(shù)據(jù)列表
function reflushAllDragList() {
  Object.keys(dataListRef.value).forEach((key: string) => {
    // 過濾掉已經(jīng)被刪除的組件(值為null的情況)
    if (dataListRef.value[key]) {
      dataListRef.value[key].refresh();
    }
  });
}
</script>

說明:

①可以使用數(shù)組或者對象存儲組件的ref對象實例,因為組件是循環(huán)生成的,所以每個組件的ref對象需要通過這種方式進(jìn)行存儲。

② 循環(huán)生成的多個組件可以通過點(diǎn)擊刪除按鈕進(jìn)行刪除,當(dāng)組件刪除時原本想刪除ref對象中的組件對應(yīng)的ref對象,但發(fā)現(xiàn)無法刪除,最后的結(jié)果是key存在,value為null

3.原因分析

Vue 3中的動態(tài)ref機(jī)制有以下特點(diǎn):

  • 組件掛載時:動態(tài)ref會自動將組件實例賦值給指定的key
  • 組件卸載時:Vue會自動將對應(yīng)的ref值設(shè)置為`null`,但**不會刪除key**
  • 響應(yīng)式處理:Vue的響應(yīng)式系統(tǒng)會在組件生命周期中自動管理ref的狀態(tài)

為什么key不會被刪除

這是Vue 3的設(shè)計行為,不是bug:

  • Vue需要保持ref對象的響應(yīng)式結(jié)構(gòu)完整性
  • 避免在組件頻繁掛載/卸載時產(chǎn)生不必要的響應(yīng)式觸發(fā)
  • 提供了更好的性能優(yōu)化

4.解決方案

因為無法刪除,所以在后續(xù)使用ref對象時,需要進(jìn)行判斷是否為null,如果不為null,則執(zhí)行相關(guān)方法。

function reflushAllDragList() {
  Object.keys(dataListRef.value).forEach((key: string) => {
    // 過濾掉已經(jīng)被刪除的組件(值為null的情況)
    // 當(dāng)刪除card時,Vue會自動把dataListRef的對應(yīng)key的值設(shè)置為null
    // 不用進(jìn)行手動刪除,即使手動刪除,key也存在
    if (dataListRef.value[key]) {
      dataListRef.value[key].refresh();
    }
  });
}

5.總結(jié)

Vue 3的動態(tài)ref在組件卸載時會自動將值設(shè)置為`null`但保留key,這是正常的設(shè)計行為。

正確的處理方式是:

  • 不要嘗試手動刪除ref中的key
  • 在使用ref時進(jìn)行null檢查
  • 信任Vue的自動管理機(jī)制

這樣可以確保代碼的穩(wěn)定性和可維護(hù)性。

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

相關(guān)文章

最新評論

特克斯县| 海宁市| 常州市| 贵州省| 甘肃省| 岳阳县| 洞口县| 大新县| 潮安县| 汶上县| 张家港市| 无为县| 项城市| 济南市| 蕲春县| 肥东县| 黄大仙区| 手游| 吉木萨尔县| 丹寨县| 新乐市| 桦川县| 齐河县| 乌拉特后旗| 吉林省| 剑河县| 邹平县| 繁昌县| 绥德县| 石柱| 黑龙江省| 永宁县| 无棣县| 绵阳市| 通山县| 新丰县| 施秉县| 岑溪市| 定边县| 手游| 金坛市|