Vue3 + TypeScript + Element Plus 表格實例null檢查方法

代碼分析:

// 表格實例對象
const tableRef = ref<ElTableExtendedInstance | null>(null);
// 表格列配置列表
const columnConfigs = ref<IColumnConfig[]>([{ prop: "index", label: "序號", width: 60 },{ prop: "batchNo", label: "批號", width: 120 },{ prop: "validityDate", label: "有效期至", width: 110 },{ prop: "amount", label: "庫存數量", width: 80 }
]);
const tableColumnWidth = useTableColumnWidth(tableRef.value, columnConfigs.value);

在 Vue 3 中,要確保?tableRef.value?不為 null 時再調用?useTableColumnWidth,可以通過以下幾種方式實現:

方法 1:使用?onMounted?+ 條件判斷(推薦)

typescript

復制

下載

import { ref, onMounted } from 'vue'// 表格實例對象
const tableRef = ref<ElTableExtendedInstance | null>(null);
// 表格列配置列表
const columnConfigs = ref<IColumnConfig[]>([...]);// 聲明響應式變量
const tableColumnWidth = ref<any>(null);onMounted(() => {// 確保 DOM 已掛載if (tableRef.value) {tableColumnWidth.value = useTableColumnWidth(tableRef.value, columnConfigs.value);} else {console.error("表格實例未掛載!");}
});

方法 2:使用?watch?監聽引用變化

typescript

復制

下載

import { ref, watch } from 'vue'const tableRef = ref<ElTableExtendedInstance | null>(null);
const columnConfigs = ref<IColumnConfig[]>([...]);
const tableColumnWidth = ref<any>(null);// 監聽 tableRef 變化
watch(tableRef, (newVal) => {if (newVal) {tableColumnWidth.value = useTableColumnWidth(newVal, columnConfigs.value);}
}, { immediate: true }); // immediate: true 確保初始值被檢查

方法 3:使用計算屬性 + 防御性檢查

typescript

復制

下載

import { ref, computed } from 'vue'const tableRef = ref<ElTableExtendedInstance | null>(null);
const columnConfigs = ref<IColumnConfig[]>([...]);// 計算屬性自動處理 null 情況
const tableColumnWidth = computed(() => {return tableRef.value ? useTableColumnWidth(tableRef.value, columnConfigs.value): null; // 或返回默認值
});

方法 4:在模板中使用 v-if 延遲渲染(結合方法1)

vue

復制

下載

<template><!-- 確保表格存在時才渲染依賴組件 --><el-table v-if="dataLoaded" ref="tableRef"></el-table><dependent-component v-else>加載中...</dependent-component>
</template><script setup>
import { ref, onMounted } from 'vue'const dataLoaded = ref(false);
const tableRef = ref(null);// 先獲取數據再設置表格引用
fetchData().then(() => {dataLoaded.value = true;onMounted(() => {if (tableRef.value) {useTableColumnWidth(tableRef.value, columnConfigs.value);}});
});
</script>

最佳實踐建議:

  1. 組合式函數優化:修改?useTableColumnWidth?使其內部處理 null 情況

typescript

復制

下載

// 修改后的組合式函數
export function useTableColumnWidth(table: Ref<ElTableExtendedInstance | null>,columns: Ref<IColumnConfig[]>
) {watchEffect(() => {if (table.value) {// 實際處理邏輯console.log('處理列寬', columns.value);}});
}// 使用方式
useTableColumnWidth(tableRef, columnConfigs); // 無需 .value
  1. 可選鏈操作符(Optional Chaining)

typescript

復制

下載

// 調用時安全訪問
tableRef.value?.doSomething();

錯誤處理建議:

typescript

復制

下載

// 在可能出錯的地方添加類型守衛
if (!tableRef.value) {throw new Error("表格實例未初始化!");
}// 或使用斷言函數
function assertTableInitialized(table: unknown): asserts table is ElTableExtendedInstance {if (!table) throw new Error("表格實例未初始化!");
}// 使用
assertTableInitialized(tableRef.value);
useTableColumnWidth(tableRef.value, columnConfigs.value);

核心原則

  1. 在組件掛載完成(onMounted)后再訪問 DOM 引用

  2. 使用響應式 API(watch,?computed)處理引用變化

  3. 通過防御性編程(null 檢查)避免運行時錯誤

  4. 修改工具函數使其支持響應式處理

注意:如果表格在?v-if?中,需要確保條件為真時引用才有效,此時推薦使用方法4結合條件渲染。

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

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

相關文章

Neo4j常見語法-unwind

unwind的用法&#xff08;UNWIND 是一個強大的操作符&#xff0c;用于將集合&#xff08;列表、數組&#xff09;展開為多行數據。它類似于關系型數據庫中的 UNNEST 或 LATERAL JOIN&#xff0c;是 Cypher 查詢中處理集合數據的核心工具&#xff09; &#xff08;1&#xff09;…

JavaEE-Spring-IoCDI

Spring是?個開源框架, 他讓我們的開發更加簡單. 他?持?泛的應?場 景, 有著活躍?龐?的社區, 這也是Spring能夠?久不衰的原因. 但是這個概念相對來說, 還是?較抽象. ??句更具體的話來概括Spring, 那就是: Spring 是包含了眾多?具?法的 IoC 容器 容器是?來容納…

CppCon 2017 學習:10 Core Guidelines You Need to Start Using Now

C.45: 不要定義一個僅僅初始化成員變量的默認構造函數&#xff0c;而是使用類內成員初始化器 如果你有一個默認構造函數&#xff0c;它的唯一作用是給成員變量賦默認值&#xff08;如 1、2、3&#xff09;&#xff0c;這更清晰、簡單的方法是直接在成員變量聲明時使用類內初始…

Java并發編程實戰 Day 28:虛擬線程與Project Loom

【Java并發編程實戰 Day 28】虛擬線程與Project Loom 文章內容 在“Java并發編程實戰”系列的第28天&#xff0c;我們將聚焦于**虛擬線程&#xff08;Virtual Threads&#xff09;**和 Project Loom&#xff0c;這是 Java 在高并發場景下的一次重大革新。隨著現代應用對性能和…

Linux系統移植⑦:uboot啟動流程詳解-board_init_r執行過程

Linux系統移植⑦&#xff1a;uboot啟動流程詳解-board_init_r執行過程 在uboot中&#xff0c;board_init_r 是啟動流程中的一個關鍵函數&#xff0c;負責完成板級&#xff08;board-specific&#xff09;的后期初始化工作。以下是關于該函數的詳細說明&#xff1a; 1. 函數作…

OpenStack入門體驗

1.1云計算概述 相信大家都聽到很多的阿里云、騰訊云、百度云等等這些詞,那到底什么是云計算?云 計算又能做什么? 1.1.1什么是云計算 云計算(cloud computing)是一種基于網絡的超級計算模式,基于用戶的不同需求,提供所需的資源,包括計算資源、存儲資源、網絡資源等。云計算…

RK 安卓10/11平臺 HDMI-IN 調試

這篇文章我們介紹一下在安卓9、10、11的版本上&#xff0c;rk平臺的hdmi-in功能是如何實現的&#xff0c;下篇文章我們再介紹安卓12之后的版本有了什么變化。希望對在rk平臺調試hdmi-in功能的朋友有一些幫助。 目錄 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;…

MongoDB學習記錄(快速入門)

MongoDB核心 基礎概念 數據庫 數據庫是按照數據結構來組織、存儲和管理數據的倉庫。在內存中運行的&#xff0c;一旦程序運行結束或者計算機斷電&#xff0c;程序運行中的數據都會丟失。我們需要將一些程序運行的數據持久化到硬盤之中&#xff0c;以確保數據的安全性。數據庫…

阿里一面:微服務拆分需要考慮什么因素?

要拆分微服務&#xff0c;首先我們要了解微服務拆了會有什么問題&#xff1f;怎么合理拆服務&#xff1f; 拆分服務會帶來什么問題&#xff1f; 舉個電商系統下單扣庫存的例子。 對于單體應用&#xff0c;通訊在進程內部進行&#xff0c;下單方法調用扣庫存方法&#xff0c;…

3D高斯潑濺和4D高斯

1.高斯函數 想象你往平靜的湖水里扔一塊石頭&#xff0c;水波會以石頭落點為中心向外擴散&#xff0c;形成一個逐漸衰減的圓形波紋。高斯函數的形狀就和這個波紋類似&#xff1a; 中心最高&#xff08;石頭落點&#xff0c;波峰最強&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安裝

mac comfyui安裝包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后續官方有迭代&#xff0c;可以直接通過git更新源碼升級 comfyui插件下載&#xff0c;解壓放到custom_nodes目錄下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;視頻插件&#xff09; 和…

面試題SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服務注冊與發現路由服務到服務的調用負載均衡斷路器領導選舉和集群狀態分布式消息傳遞 SpringCloud核心組件&#xff1f; Eureka 注冊中心Ribbon 客戶端負載均衡Hystrix&#xff1a; 服務容錯處理Feign:聲明式Rest客戶端Zu…

ASR-PRO語音識別可能出現的問題

ASR-PRO語音識別可能出現的問題 4月份有一天刷到牢大/愛麗絲語音自開關燈設備&#xff0c;心血來潮&#xff0c;博主也是淺嘗了一下&#xff0c;由此也總結一下&#xff0c;實現此項目會出現的問題。 在實現愛麗絲開關燈模塊時ASRPRO語音識別可能出現的問題如下&#xff1a; …

蒼穹外賣--緩存菜品Spring Cache

Spring Cache是一個框架&#xff0c;實現了基于注解的緩存功能&#xff0c;只需要簡單地加一個注解&#xff0c;就能實現緩存功能。 Spring Cache提供了一層抽象&#xff0c;底層可以切換不同的緩存實現&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

個人簡歷制作MarkDown模板

MarkDown制作個人簡歷的模板放在了github上&#xff0c;大家如有需求&#xff0c;請自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介紹一下此模板的特點&#xff1a; &#x1f338;個人面試期間使用的、整理的簡歷格式&#xff0c;現在分享給大家。 ?簡歷采…

【MySQL數據庫 | 第五篇】DDL操作2

文章目錄 當前數據庫student的數據數據表操作 - 修改&刪除&#x1f4d6;修改操作增加字段&#x1f44f;案例&#xff1a;向數據表student中添加字段 id修改字段的數據類型【只能修改字段的屬性】&#x1f44f;案例&#xff1a;將student表中字段age的屬性由tinyint unsigne…

【瀏覽器插件】如何開發一個Chrome瀏覽器插件

這篇文章來介紹一下,如何開發一個自己的Chrome瀏覽器插件程序。 Chrome瀏覽器插件,其實是讓瀏覽器替我們執行我們自己寫的代碼,既然要讓瀏覽器執行代碼,那么首先,就需要定義一個規范,也就是說,需要讓Chrome瀏覽器知道,你寫的程序是一個插件。 這就需要介紹一下插件中…

詳細講解Redis為什么被設計成單線程

Redis 被設計成單線程的原因主要有以下幾點&#xff0c;這些原因涉及性能優化、復雜性控制、數據一致性以及適用場景等多個方面&#xff1a; 1. 簡化設計與實現 避免鎖競爭&#xff1a;多線程環境下&#xff0c;多個線程訪問共享資源時需要加鎖來保證數據一致性。鎖的使用會增…

Hive 邏輯優化器

Optimizer PointLookupOptimizer 作用&#xff1a;把符合條件的 OR 表達式轉為 IN。 參數hive.optimize.point.lookup 設置是否開啟 PointLookupOptimizer&#xff0c;默認為 true. 參數 hive.optimize.point.lookup.min 控制多少個 OR 表達式轉為 IN&#xff0c;默認 31。 例…

ZYNQ Petalinux實戰:PCIe直通NVMe固態硬盤,解鎖存儲性能新極限!

突破SD卡和SATA的速度枷鎖!本文將手把手教你如何在ZYNQ平臺上通過PCIe接口驅動NVMe固態硬盤。從硬件設計、Linux內核配置到創新性的DMA零拷貝優化,實現2000MB/s+ 的存儲性能飛躍,附完整代碼解析和性能實測對比。 一、為什么選擇PCIe NVMe?存儲性能革命 ZYNQ傳統存儲方案面…