当前位置: 首页 > java >正文

Vue 3 ~ 3.5 版本useTemplateRef使用

注意,useTemplateRef版本要在 3.5 以后才可使用,版本低的 ref 替代问题也不大~

2024 年 9 月 1 日发布的 组合式 API:辅助 | Vue.js,引入一个小小的新 API useTemplateRef(),它用于访问实际的 DOM 节点。

组合式 API:辅助 | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/api/composition-api-helpers.html#usetemplateref

图片

在 Vue 3.5 之前,访问 DOM 节点需要使用 ref() 函数。Vue 把这种访问 DOM 节点的机制叫做模板引用(Template Refs)。

使用 ref() 函数有两个限制。首先,HTML 标签的 ref 属性必须和 <script> 中的 ref 变量名同名。这虽然不算什么大问题,但是用起来有点儿奇怪。

<template><!-- ref 属性名为 myInput --><input ref="myInput" type="text" />
</template><script setup>
import { ref, onMounted } from 'vue'// 变量名也必须为 myInput,和 HTML ref 属性保持一致
const myInput = ref(null)onMounted(() => {myInput.value.focus()
})
</script>

其次,ref() 变量的类型推断不足。比如,我在 VS Code 中,把鼠标悬浮于 myInput.value 之上,看不到它对应 DOM 的实际类型。

image

当类型不明确时,VS Code 的智能补全提示就会比较混乱,基本不会返回需要的属性;

image

useTemplateRef() 是对模板引用机制的一次小优化。它是如何解决上述两个问题的?

首先,useTemplateRef() 的用法更像原生的 document.getElementById()。变量名可以随便起,只要保证函数参数名和 ref 属性名一致即可,这种语法更符合常理。

<template><input ref="myInput" type="text" />
</template><script setup>
import { useTemplateRef, onMounted } from 'vue'// 变量名不必和 ref 属性保持一致,两者通过参数名进行关联
const inputRef = useTemplateRef('myInput')
onMounted(() => {inputRef.value.focus()
})
</script>// 官网示例:
<script setup>
import { useTemplateRef, onMounted } from 'vue'// 变量名不必和 ref 属性保持一致,两者通过参数名进行关联
const inputRef = useTemplateRef('input')onMounted(() => {inputRef.value.focus()
})
</script><template><input ref="input" />
</template>

其次,useTemplateRef() 的返回值类型会进行自动类型推断,智能提示更有保证。

image

image

建议在 Vue 3.5 及以上版本中优先使用 useTemplateRef() 函数,而 ref() 仅适用于 Vue 3.5 之前的版本

http://www.xdnf.cn/news/7512.html

相关文章:

  • Vue3.0教程005:watch监视ref定义的【基本类型】数据和【对象类型】数据
  • Vortex GPGPU的github流程跑通与功能模块波形探索(三)
  • 系统设计——项目设计经验总结1
  • arcgispro双击打开没反应怎么办
  • 基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战
  • ubuntu设置conda虚拟环境
  • es疑惑解读
  • 基于HTML的Word风格编辑器实现:从零打造功能完备的富文本编辑器
  • 【c# 类型转换中 as 和()】
  • 题解:AT_abc244_e [ABC244E] King Bombee
  • 如何使用AI辅助开发CSS3 - 通义灵码功能全解析
  • 杰发科技AC7840——如何把结构体数据写到Dflash中
  • 科技赋能,开启现代健康养生新潮流
  • 聊一聊接口的安全测试如何进行的?
  • 【JavaEE】多线程
  • Java转Go日记(四十一):Gorm删除
  • Java大师成长计划之第28天:处理多线程的Web应用
  • 嵌入式学习笔记 - CAN总线
  • 房贷利率计算前端小程序
  • 图论学习笔记 3
  • 电磁感应在量子计算中如何应用
  • Adv. Sci.|南医大倪春辉团队破局肺纤维化:锁定脂肪酸氧化与糖酵解 “失衡点”,挖掘关键治疗靶点
  • python宠物用品商城系统
  • 深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧
  • 【Java的批量操作】
  • 【leetcode】59. 斐波那契数
  • RK3568 OH5.1 源码编译及问题
  • 海康威视摄像头C#开发指南:从SDK对接到安全增强与高并发优化
  • React+TypeScript多步骤表单:告别表单地狱的现代解决方案
  • 请问交换机和路由器的区别?vlan 和 VPN 是什么?