news 2026/8/13 20:00:27

Vue3利用ResizeObserver监听Textarea的尺寸动态调整表格tbody的maxHeight

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3利用ResizeObserver监听Textarea的尺寸动态调整表格tbody的maxHeight

调整表格tbody的maxHeight推荐方式是直接修改css,本文主要描述的是不推荐但使用ResizeObserver再进一步修改dom的maxHeight(之所以选择ResizeObserver这个API是因为Textarea默认没有resize事件),从而达到不溢出可视窗口,表格内容区域自适应并纵向滚动

一、直接修改行内样式

<template> <div ref="contentRef"> <my-content class="content"> <top-info class="top-info" v-model:loading="topLoading" v-model:isEdit="isEdit" /> <my-list /> </my-content> </div> </template> <script lang="ts" setup> import { CSSProperties } from 'vue'; import { nextTick, watch, onUnmounted } from 'vue'; import { debounce } from 'lodash-es'; import MyList from './MyList.vue'; import TopInfo from './TopInfo.vue'; const contentRef = ref(); const topLoading = ref(false); const isEdit = ref(false); const getContentDom = () => contentRef.value.querySelector('.content'); const getTbodyDom = () => getContentDom().querySelector('.my-table-body'); const getTopDom = () => getContentDom().querySelector('.top-info'); const getTopTextarea = () => getTopDom().querySelector('textarea'); const handleTableMaxHeight = debounce(() => { const contentDom = getContentDom(); const tbodyDom = getTbodyDom(); if (tbodyDom) { const topDom = getTopDom(); const tableMaxHeight1 = contentDom.clientHeight - topDom.scrollHeight - 180; // 为了展示逻辑下方直接修改样式,可以传值,有的table插件有maxHeight参数有此类效果,如果maxHeight参数没有响应式效果再考虑直接操作dom样式 tbodyDom.style.maxHeight = tableMaxHeight1 + 'px'; tbodyDom.style.overflowY = 'auto'; } }, 200); const watchTextarea = debounce(() => { const textarea = getTopTextarea(); const resizeObserver = new ResizeObserver((entries) => { for (let entry of entries) { const { width, height } = entry.contentRect; console.log('New dimensions:', width, height); // 处理尺寸变化,例如更新数据或执行其他操作 } nextTick(() => { handleTableMaxHeight(); }); }); resizeObserver.observe(textarea); textarea.__resizeObserver__ = resizeObserver; // 保存引用以便之后可以访问或清理(可选) }, 200); onUnmounted(() => { const textarea = getTopTextarea(); if (textarea.__resizeObserver__) { textarea.__resizeObserver__.disconnect(); } }); watch( () => [isEdit.value, topLoading.value], () => { nextTick(() => { handleTableMaxHeight(); const textarea = getTopTextarea(); if (textarea) { watchTextarea(); } }); }, { deep: true, immediate: true } ); </script>

二、利用组件style对象传参修改css的important样式

比style行内样式优先级高的是css的important样式,使用scss或者less的var函数,可以传递获取tbody的maxHeight

<template> <div ref="contentRef"> <my-content class="content"> <top-info class="top-info" v-model:loading="topLoading" v-model:isEdit="isEdit" /> <my-list :style="tbodyStyle"/> </my-content> </div> </template> <script lang="ts" setup> import { CSSProperties } from 'vue'; import { nextTick, watch, onUnmounted } from 'vue'; import { debounce } from 'lodash-es'; import MyList from './MyList.vue'; import TopInfo from './TopInfo.vue'; const contentRef = ref(); const topLoading = ref(false); const isEdit = ref(false); const tbodyStyle = ref<any>({ padding: 0 }); const getContentDom = () => contentRef.value.querySelector('.content'); const getTbodyDom = () => contentRef.value.querySelector('.my-table-body'); const getTopTextarea = () => getTopDom().querySelector('textarea'); const handleTableMaxHeight = debounce(() => { const contentDom = getContentDom(); const topDom = getTopDom(); const tableMaxHeight1 = contentDom.clientHeight - topDom.scrollHeight - 180; tbodyStyle.value['--tbody-max-height'] = tableMaxHeight1 + 'px'; }, 200); const watchTextarea = debounce(() => { const textarea = getTopTextarea(); const resizeObserver = new ResizeObserver((entries) => { for (let entry of entries) { const { width, height } = entry.contentRect; console.log('New dimensions:', width, height); // 处理尺寸变化,例如更新数据或执行其他操作 } nextTick(() => { handleTableMaxHeight(); }); }); resizeObserver.observe(textarea); textarea.__resizeObserver__ = resizeObserver; // 保存引用以便之后可以访问或清理(可选) }, 200); onUnmounted(() => { const textarea = getTopTextarea(); if (textarea.__resizeObserver__) { textarea.__resizeObserver__.disconnect(); } }); watch( () => [isEdit.value, topLoading.value], () => { nextTick(() => { handleTableMaxHeight(); const textarea = getTopTextarea(); if (textarea) { watchTextarea(); } }); }, { deep: true, immediate: true } ); </script> <style lang="less" scoped> :deep(.my-table-body) { max-height: var(--tbody-max-height) !important; overflowY: auto; } </style>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 15:26:06

使用格子玻尔兹曼方法(LBM)模拟热扩散的Matlab代码

使用格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟热扩散&#xff0c;Matlab代码格子玻尔兹曼方法&#xff08;LBM&#xff09;搞热扩散模拟其实挺有意思的&#xff0c;今天咱们用Matlab整一个简单的二维版本。先上核心思路&#xff1a;把温度场当作被动标量&#xff0c;用…

作者头像 李华
网站建设 2026/8/14 12:16:53

ORACLE学习笔记总结(数据库参数文件)

Oracle数据库参数文件详解与操作指令 一、参数文件类型概述 Oracle数据库使用两种参数文件来存储实例配置&#xff1a; 1. PFILE&#xff08;Parameter File&#xff09; 文件类型&#xff1a;文本文件&#xff0c;可直接编辑 默认名称&#xff1a;init<SID>.ora&…

作者头像 李华
网站建设 2026/8/14 12:56:11

浅谈:算法中的斐波那契数(六)

方法五&#xff1a;矩阵求幂斐波那契数列矩阵方程&#xff1a;算法&#xff1a;若 N 小于等于 1&#xff0c;则返回 N。使用递归函数matrixPower 计算给定矩阵 A 的幂。幂为 N-1&#xff0c;其中 N 是第 N 个 斐波那契数。matrixPower 函数将对 N/2 个斐波那契数进行操作。在 m…

作者头像 李华
网站建设 2026/8/13 16:18:23

BioSIM抗人TGFB1抗体SIM0367:适用广泛,功能多样

在生命科学领域&#xff0c;抗体作为研究和治疗的核心工具&#xff0c;其质量与性能直接影响实验结果的准确性和可靠性。随着生物技术的不断进步&#xff0c;越来越多的高质量生物类似药产品进入市场&#xff0c;为科研工作者提供了更加经济、高效的解决方案。其中&#xff0c;…

作者头像 李华
网站建设 2026/8/12 12:50:06

软件测试环境搭建全流程指南

在软件开发的生命周期中&#xff0c;测试环境是保证产品质量的关键基础设施。一个稳定、可靠的测试环境能够准确模拟生产环境&#xff0c;帮助测试人员及时发现缺陷&#xff0c;降低线上风险。本文将从环境规划、搭建步骤、维护管理三个维度&#xff0c;为测试从业者提供一套完…

作者头像 李华