代码分析:

// 表格实例对象
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(watchcomputed)处理引用变化

  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传统存储方案面…