最新国产好看的视频,伊人天堂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)生成的多個組件可以通過點擊刪除按鈕進(jìn)行刪除,當(dāng)組件刪除時原本想刪除ref對象中的組件對應(yīng)的ref對象,但發(fā)現(xiàn)無法刪除,最后的結(jié)果是key存在,value為null

3.原因分析

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

  • 組件掛載時:動態(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)文章

最新評論

普兰县| 宣化县| 无极县| 菏泽市| 鞍山市| 安徽省| 津市市| 洪湖市| 义乌市| 民和| 建德市| 呼和浩特市| 平泉县| 平顺县| 绥德县| 刚察县| 临朐县| 永丰县| 泰宁县| 全椒县| 梅河口市| 通城县| 秭归县| 民勤县| 大姚县| 揭西县| 灌阳县| 昌平区| 胶南市| 名山县| 关岭| 水富县| 衡南县| 石阡县| 得荣县| 修水县| 华宁县| 横峰县| 黄冈市| 江安县| 湟中县|