Vue 3.5中useTemplateRef和ref的区别详解

 更新时间:2026年02月13日 10:19:02   作者:Hone  
在Vue3中ref是一个非常实用的函数,用于创建响应式数据,这篇文章主要介绍了Vue3.5中useTemplateRef和ref区别的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

useTemplateRefref 都是用来创建响应式引用(Reactive References)的,但在 Vue 3.5+ 中,useTemplateRef 是一个专门为模板引用(Template Refs)设计的组合式 API (Composable) 。让我们详细对比一下它们:

ref

  • 核心功能: ref 是 Vue 最基础的响应式系统 API 之一。它可以包装任何值(原始类型、对象、DOM 元素、组件实例等),使其成为响应式的。

  • 用途广泛:

    • 存储和响应式地更新本地组件状态(如 count = ref(0))。
    • 作为模板引用(虽然在 3.5+ 之前常用)。
    • 在任何需要响应式引用的地方。
  • 在模板引用中的用法 (旧方式) :

    <template>
      <div ref="divRef">Hello World</div>
    </template>
    
    <script setup>
    import { ref, onMounted } from 'vue';
    
    const divRef = ref(null); // 创建一个 ref
    
    onMounted(() => {
      // divRef.value 现在是 DOM 元素
      console.log(divRef.value); // <div>Hello World</div>
      divRef.value.focus(); // 例如,聚焦到元素上
    });
    </script>
    
    • 问题: 在 <script setup> 中,divRef 会暴露给模板,即使你只想在脚本内部使用它。这可能会污染模板的上下文。

useTemplateRef(Vue 3.5+)

  • 核心功能: 专门用于获取对模板中元素或组件的引用。它返回一个getter 函数,而不是一个 ref 对象。

  • 目的: 解决 ref 作为模板引用时暴露到模板上下文的问题,提供更清晰、更符合直觉的 API。

  • 用途: 用于模板引用。

  • 返回值: 一个 getter 函数,调用它会返回最新的模板引用值。这个函数本身是响应式的,但其返回值(即引用的元素或组件实例)不是。

  • 优势:

    • 不污染模板上下文: useTemplateRef 返回的 getter 不会被自动暴露到模板中,保持了模板上下文的整洁。
    • 意图明确: 使用 useTemplateRef 明确表示你正在创建一个模板引用,提高了代码的可读性。
    • 类型推断: 在 TypeScript 中,useTemplateRef 能提供更精确的类型推断。
  • 在模板引用中的用法 (新方式) :

    <template>
      <div ref="divRef">Hello World</div>
    </template>
    
    <script setup>
    import { useTemplateRef, onMounted } from 'vue';
    
    // useTemplateRef 返回一个 getter 函数
    const getDivRef = useTemplateRef('divRef');
    
    onMounted(() => {
      // 调用 getter 函数获取 DOM 元素
      console.log(getDivRef()); // <div>Hello World</div>
      getDivRef()?.focus(); // 例如,聚焦到元素上
    });
    </script>
    
    • 注意:在 ref 指令中使用的字符串(如 'divRef')必须与 useTemplateRef 的参数完全匹配。
    • getDivRef() 返回的是实际的 DOM 元素或组件实例,如果元素未挂载,则可能返回 nullundefined

对比总结

特性refuseTemplateRef
主要目的创建通用的响应式引用专门用于模板引用
返回值一个包含 .value 属性的 ref 对象一个 getter 函数
模板暴露会暴露到模板上下文(如果在 <script setup> 中定义)不会暴露到模板上下文
类型推断一般更好(尤其是在 TS 中)
意图表达通用,需看上下文明确
Vue 版本要求3.0+3.5+
何时使用通用响应式状态、旧项目中的模板引用Vue 3.5+ 项目中的模板引用 (推荐)

结论

  • 对于模板引用(获取 DOM 元素或子组件实例),强烈推荐在 Vue 3.5+ 项目中使用 useTemplateRef。它更清晰、更安全、类型更友好。
  • 对于通用的响应式状态管理(如计数器、布尔标志等),继续使用 ref
  • 在你的项目中,如果已经升级到了 Vue 3.5 或更高版本,并且需要获取模板引用,请优先考虑 useTemplateRef

到此这篇关于Vue 3.5中useTemplateRef和ref区别的文章就介绍到这了,更多相关Vue 3.5中useTemplateRef和ref区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3使用vue-count-to组件的实现

    vue3使用vue-count-to组件的实现

    这篇文章主要介绍了vue3使用vue-count-to组件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vue如何给数组添加新对象并赋值

    vue如何给数组添加新对象并赋值

    这篇文章主要介绍了vue如何给数组添加新对象并赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue3之Mixin的使用方式(全局,局部,setup内部使用)

    Vue3之Mixin的使用方式(全局,局部,setup内部使用)

    这篇文章主要介绍了Vue3之Mixin的使用方式(全局,局部,setup内部使用),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue3+elementPlus中 树形控件封装的实现

    Vue3+elementPlus中 树形控件封装的实现

    本文主要介绍了Vue3+elementPlus中 树形控件封装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 详解Vuex的属性和作用

    详解Vuex的属性和作用

    这篇文章主要为大家介绍了Vuex的属性和作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • vue3获取子组件的DOM元素的方法总结

    vue3获取子组件的DOM元素的方法总结

    在 Vue 3 中,访问子组件的 DOM 元素是一个常见的需求,本文将介绍如何在 Vue 3 中使用不同的方法来获取子组件的 DOM 元素,需要的朋友可以参考下
    2023-08-08
  • vue实现多栏布局拖拽

    vue实现多栏布局拖拽

    这篇文章主要为大家详细介绍了vue实现多栏布局拖拽,改变盒子的宽度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Vue 自定义指令功能完整实例

    Vue 自定义指令功能完整实例

    这篇文章主要介绍了Vue 自定义指令功能,结合完整实例形式分析了vue.js自定义指令相关实现与使用操作技巧,需要的朋友可以参考下
    2019-09-09
  • vue项目适配大屏端的方法示例

    vue项目适配大屏端的方法示例

    众所周知在vue移动端h5页面当中,适配是经常会遇到的问题,这篇文章主要给大家介绍了关于vue项目适配大屏端的相关资料,需要的朋友可以参考下
    2021-08-08
  • vue excel上传预览和table内容下载到excel文件中

    vue excel上传预览和table内容下载到excel文件中

    这篇文章主要介绍了vue excel上传预览和table内容下载到excel文件中,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12

最新评论