Vue 3.5 useTemplateRef彻底改变DOM引用方式
命名解耦:变量名与ref值零绑定
传统ref要求变量名必须与模板ref值完全一致,而useTemplateRef通过key关联——模板里写ref="username",脚本里可以叫inputEl、el甚至foo,彻底摆脱命名枷锁。
类型自动推断:IDE提示秒出
无需手动声明类型,useTemplateRef会根据DOM元素自动推断类型。鼠标悬停变量,IDE立刻显示HTMLInputElement | null,focus()、value等方法属性一目了然,告别"盲写"时代。
动态ref支持:一行代码搞定v-for场景
在v-for中动态生成ref时,只需通过模板字符串拼接key(如input-${index}),再用useTemplateRef传入对应key即可直接获取元素,省去手动维护映射表的繁琐步骤。
逻辑可复用:组合式函数封装DOM操作
useTemplateRef支持在组合式函数中通过ref key获取元素,轻松将"聚焦"、"滚动"等DOM操作逻辑抽离成hooks,复用率提升50%以上。
传统ref方式:
<template>
<input ref="username" />
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
// 变量名必须与模板ref值完全一致
const username = ref<HTMLInputElement | null>(null)
onMounted(() => {
username.value?.focus() // 类型需手动声明,否则为any
})
</script>
useTemplateRef方式:
<template>
<input ref="username" />
</template>
<script setup lang="ts">
import { useTemplateRef, onMounted } from 'vue'
// 变量名随意,类型自动推断为HTMLInputElement | null
const inputEl = useTemplateRef('username')
onMounted(() => {
inputEl.value?.focus() // IDE直接提示focus()方法
})
</script>
差异一目了然:变量名从"被迫一致"变为"完全自由",类型声明从"S"变为"自动推断",代码量减少20%。






