Vue 3 動態ref問題

目錄

1.問題描述

2.示例代碼

3.原因分析

4.解決方案

5.總結


1.問題描述

在Vue 3項目中,當使用動態ref來引用組件時,刪除組件后發現ref對象中對應的key仍然存在,只是值變為`null`,而不是完全刪除該key。

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

* 使用動態ref來引用每個卡片中的數據列表組件
* 當刪除卡片時,需要同時清理對應的ref引用
* 發現刪除后ref對象中key仍存在,值為`null`

2.示例代碼

<template><div><a-card v-for="item in dragList" :key="item.id"><!-- 動態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];// 處理編輯狀態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 會自動處理動態 ref 的清理,無需手動刪除,即使執行了刪除方法,也不會刪除key// dataListRef.value[current.id] 會自動變為 null
}// 刷新所有數據列表
function reflushAllDragList() {Object.keys(dataListRef.value).forEach((key: string) => {// 過濾掉已經被刪除的組件(值為null的情況)if (dataListRef.value[key]) {dataListRef.value[key].refresh();}});
}
</script>

說明:

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

② 循環生成的多個組件可以通過點擊刪除按鈕進行刪除,當組件刪除時原本想刪除ref對象中的組件對應的ref對象,但發現無法刪除,最后的結果是key存在,value為null

3.原因分析

Vue 3中的動態ref機制有以下特點:

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

為什么key不會被刪除

這是Vue 3的設計行為,不是bug:

* Vue需要保持ref對象的響應式結構完整性
* 避免在組件頻繁掛載/卸載時產生不必要的響應式觸發
* 提供了更好的性能優化

4.解決方案

因為無法刪除,所以在后續使用ref對象時,需要進行判斷是否為null,如果不為null,則執行相關方法。

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

5.總結

Vue 3的動態ref在組件卸載時會自動將值設置為`null`但保留key,這是正常的設計行為。正確的處理方式是:

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

這樣可以確保代碼的穩定性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91380.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91380.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lazyvim恢復gt鍵

好的&#xff01;下面是一個完整的 LazyVim 鍵位配置 patch&#xff0c;將 gt / gT 恢復為 “切換標簽頁&#xff08;tab page&#xff09;” 的原始行為&#xff0c;同時保留原本 buffer 切換功能在其他鍵位上&#xff08;比如 / &#xff09;。 ? ? 恢復 gt 為 Tab 切換&a…

React Native 在 Web 前端跨平臺開發中的優勢與實踐

React Native 在 Web 前端跨平臺開發中的優勢與實踐 對于廣大 Web 前端開發者而言&#xff0c;移動端開發似乎總隔著一層“原生”的壁壘。學習 Swift/Kotlin、熟悉 Xcode/Android Studio 的高昂成本&#xff0c;讓許多人望而卻步。然而&#xff0c;“一次編寫&#xff0c;多端運…

QT控件 使用QtServer系統服務實現搭建Aria2下載后臺服務,并使用Http請求訪問Json-RPC接口調用下載退出

前言 最近了解到qt-solutions這個開源項目,仔細研究一番&#xff0c;發現其中的QtServer項目能在Windows系統中創建系統服務&#xff0c;Linux/Unix系統中能作為守護進程使用&#xff0c;之前一直以為編寫服務需要使用Windows api來實現&#xff0c;沒想到這么簡單。 本來之前就…

Python中關于數組的常見操作

Python中關于數組的常見操作 1.創建數組 array []2.添加元素 array.append()3.訪問元素 print(array[2])通過索引進行數組元素的訪問 4.修改元素 array[2] 3直接對想修改的元素位置進行賦值 5.刪除元素 array.remove(2) #刪除元素2del array[2] #刪除索引為2的元素6…

Image 和 IMU 時間戳同步

1 目錄 時間戳同步介紹 時間戳同步初探 時間戳獲取方式 時間戳延遲估計方法 姿態補償 勻速模型在 Bundle Adjustment 中的應用 重投影殘差 視覺特征勻速運動補償特征坐標 重投影殘差 基于特征勻速模型算法的實驗結果 軌跡勻速模型 vs 特征勻速模型 時間戳同步算法擴…

創建linux端口映射連接小網

&#x1f680; 方法 1&#xff1a;在執行機上配置 SSH 服務端轉發 這個做法是在 執行機上配置一個常駐 SSH 隧道&#xff0c;把大網的某個端口長期轉發到小網單板的 22 端口。 &#x1f468;?&#x1f4bb; 操作步驟 1?? 在執行機上創建一個 systemd 服務 假設&#xff1a; …

了解Java21

目前還沒有實操過從java8/java11直接到java17,java21。 先儲備下知識點&#xff0c;寫一些簡單例子&#xff0c;以便后續的實操。 一些新特性&#xff08;java8之后的&#xff09; var變量 和前端js定義變量一樣了&#xff0c;var搞定public static void main(String[] args) {…

【代碼】基于CUDA優化的RANSAC實時激光雷達點云地面分割

基于CUDA優化的RANSAC實時激光雷達點云地面分割 摘要&#xff1a; 本文介紹了一個高性能的激光雷達&#xff08;LiDAR&#xff09;地面分割項目。該項目基于RANSAC平面估計算法&#xff0c;并通過深度CUDA并行優化&#xff0c;將核心處理時間從近100ms縮短至10ms以內&#xff…

vuex原理以及實現

vuex官方文檔 Vuex是什么&#xff1f; Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化 每一個 Vuex 應用的核心就是 store&#xff08;倉庫&#xff09;。“stor…

APIs案例及知識點串講(上)

一.輪播圖專題CSS代碼<style>* {box-sizing: border-box;}.slider {width: 560px;height: 400px;overflow: hidden;}.slider-wrapper {width: 100%;height: 320px;}.slider-wrapper img {width: 100%;height: 100%;display: block;}.slider-footer {height: 80px;backgro…

華大單片機HC32L110燒錄程序方法

1&#xff0c;安裝J-flash工具 從SEGGER官網下載J-flash工具&#xff0c;地址&#xff1a;SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace。按向導安裝完成。 2&#xff0c;使用如下圖JLINK工具SWD模式連接單片機的燒錄接口&#xff08;SWDIO,SWCLK,GND&#…

LeetCode|Day15|125. 驗證回文串|Python刷題筆記

LeetCode&#xff5c;Day15&#xff5c;125. 驗證回文串&#xff5c;Python刷題筆記 &#x1f5d3;? 本文屬于【LeetCode 簡單題百日計劃】系列 &#x1f449; 點擊查看系列總目錄 >> &#x1f4cc; 題目簡介 題號&#xff1a;125. 驗證回文串 難度&#xff1a;簡單 題…

項目學習筆記 display從none切換成block

跟著視頻學做項目的時候&#xff0c;碰到一個多級聯動列表&#xff0c;列表元素的display會從none切換成block&#xff0c;切換過程中可能導致資源渲染過多&#xff0c;從而導致卡頓問題。<div class"all-sort-list2"><div class"item" v-for&quo…

從 “洗澡難” 到 “洗得爽”:便攜智能洗浴機如何重塑生活?

洗澡本應是日常生活的簡單需求&#xff0c;但對于失能老人、行動不便者而言&#xff0c;卻可能成為一項充滿挑戰甚至危險的“艱巨任務”。中國失能、半失能老年人口超過4200萬&#xff0c;傳統助浴方式存在搬運風險高、隱私難以保障、效率低下等問題&#xff0c;使得“洗澡難”…

鷓鴣云重構光伏發電量預測的精度標準

在當今全球能源轉型的大背景下&#xff0c;光伏發電作為一種清潔、可再生的能源形式&#xff0c;正受到越來越多的關注與應用。然而&#xff0c;光伏發電量的精準預測&#xff0c;一直是行業內亟待攻克的關鍵難題。尤其是在面對復雜多變的氣象條件、不同區域的地理環境以及設備…

每日一題(沉淀中)

文章目錄 1、 實現string類的接口&#xff0c;并完成測試&#xff0c;要求利用深拷貝和深賦值實現 MyString.h #pragma once #include<iostream> class MyString { private:char* data;//儲存字符串內容 public://默認構造函數MyString(const char* str nullptr);////拷…

深入淺出Kafka Producer源碼解析:架構設計與編碼藝術

一、Kafka Producer全景架構 1.1 核心組件交互圖 #mermaid-svg-L9jc09hRQCHb0ftl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-L9jc09hRQCHb0ftl .error-icon{fill:#552222;}#mermaid-svg-L9jc09hRQCHb0ftl .erro…

微軟AutoGen:多智能體協作的工業級解決方案

微軟AutoGen&#xff1a;多智能體協作的工業級解決方案 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&#xf…

終端安全管理系統為什么需要使用,企業需要的桌面管理軟件

在當今數字化高度發展的時代&#xff0c;企業和組織的運營計算機等&#xff0c;是企業業務流程的重要節點。終端安全管理系統正揮著至關重要的作用。保障數據安全終端設備往往存儲著企業的核心數據&#xff0c;終端安全管理系統可以保障安&#xff0c;未經授權的人員也無法獲取…

補環境基礎(一) 原型與原型鏈

1.創建對象的幾種方式 1.對象字面量模式 直接使用{}定義鍵值對&#xff1a; const obj { key: value }; 2.Object()構造函數模式 使用內置構造函數&#xff08;較少使用&#xff09;&#xff1a; const person new Object(); console.log(person)//輸出 {}3.構造函數模…