You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3中如何对所有textarea标签批量执行高度设置函数实现自适应?

直接修改现有代码的方案

你通过document.getElementsByTagName拿到的每一项就是textarea的原生DOM实例,和你之前通过ref.value获取的对象完全一致,直接遍历操作即可:

function autosizeTextarea() {
    // 先把HTMLCollection转成数组,避免活DOM集合遍历出现异常
    const AllTextareas = Array.from(document.getElementsByTagName('TEXTAREA'));
    AllTextareas.forEach(textarea => {
        textarea.style.height = "35px"; // 默认高度
        textarea.style.height = `${textarea.scrollHeight}px`;
    })
}

如果你的页面中存在不需要自动调整高度的其他textarea,可以给需要调整的textarea加个专属类名比如auto-size-area,改用类选择器过滤:

const AllTextareas = Array.from(document.querySelectorAll('textarea.auto-size-area'));

更符合Vue规范的实现方案

直接全局查询DOM有概率拿到组件外的无关textarea,更稳妥的方式是用动态ref数组收集目标元素:

  1. 模板部分:所有需要自动高度的textarea绑定同一个ref注册方法
<li v-if="Form.Type === 1">
  <textarea v-model="Form.Title" :ref="registerTextarea"></textarea>
</li>
<li v-if="Form.Type === 2">
  <textarea v-model="Form.Desc" :ref="registerTextarea"></textarea>
</li>
  1. 逻辑部分:
setup() {
    const textareaRefs = ref([])
    // 注册ref,仅保留当前渲染的有效DOM
    const registerTextarea = (el) => {
        el && textareaRefs.value.push(el)
    }

    function autosizeTextarea() {
        // 每次执行前清空旧的ref缓存
        textareaRefs.value = []
        // 等待DOM更新完成后再遍历调整高度
        nextTick(() => {
            textareaRefs.value.forEach(textarea => {
                textarea.style.height = "35px";
                textarea.style.height = `${textarea.scrollHeight}px`;
            })
        })
    }

    onMounted(() => autosizeTextarea())
    onUpdated(() => autosizeTextarea())

    return {
        registerTextarea
    }
}

内容的提问来源于stack exchange,提问作者volume one

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:45:02