Vue 3 模板引用(Template Refs)详解与实战示例

Vue 3 模板引用(Template Refs)详解与实战示例

引言

在 Vue 开发中,通常推荐使用 响应式数据 (refreactive) 进行数据绑定,而不是直接操作 DOM。但是,在某些情况下,我们确实需要访问某个组件或 DOM 元素,这时候就可以使用 模板引用(Template Refs)

本篇文章将详细介绍 Vue 3 的 ref 模板引用的用法、适用场景,并通过多个示例展示如何在 Vue 组件中高效操作 DOM 和组件实例。


1. 什么是 Vue 模板引用?

模板引用(Template Refs) 允许我们在 Vue 组件的模板中标记一个 DOM 元素或子组件,并在 setup 选项中访问它。

基本语法

<template><div ref="myDiv">Hello Vue!</div>
</template><script setup>
import { ref, onMounted } from 'vue';const myDiv = ref(null); // 定义模板引用onMounted(() => {console.log(myDiv.value); // 获取 DOM 元素
});
</script>

说明

  • ref="myDiv" 绑定到 myDiv 变量
  • onMounted 钩子确保 myDiv.value 在 DOM 渲染完成后可用

2. 模板引用的使用场景

✅ 操作原生 DOM

当我们需要手动操作 DOM 时,如获取元素的宽高、设置焦点等:

<template><input ref="inputRef" type="text" placeholder="输入内容"><button @click="focusInput">聚焦输入框</button>
</template><script setup>
import { ref } from 'vue';const inputRef = ref(null);const focusInput = () => {inputRef.value.focus(); // 手动聚焦输入框
};
</script>

✅ 获取子组件实例

可以使用 ref 访问子组件的方法和数据:

<!-- 子组件 (Child.vue) -->
<template><div>子组件</div>
</template><script setup>
import { ref } from 'vue';const message = ref("Hello from Child Component!");const sayHello = () => {console.log(message.value);
};defineExpose({ sayHello }); // 允许父组件访问 `sayHello`
</script>
<!-- 父组件 -->
<template><Child ref="childRef" /><button @click="callChildMethod">调用子组件方法</button>
</template><script setup>
import { ref, onMounted } from 'vue';
import Child from './Child.vue';const childRef = ref(null);onMounted(() => {console.log(childRef.value); // 获取子组件实例
});const callChildMethod = () => {childRef.value.sayHello(); // 调用子组件方法
};
</script>

defineExpose:Vue 3 需要使用 defineExpose 公开组件方法,否则父组件无法访问。


3. 使用 ref 访问多个元素

当我们需要访问 多个 DOM 元素时,可以使用 ref 结合 v-for

<template><div v-for="(item, index) in list" :key="index" ref="itemRefs">{{ item }}</div><button @click="logElements">查看所有元素</button>
</template><script setup>
import { ref, onMounted } from 'vue';const list = ref(["Vue", "React", "Angular"]);
const itemRefs = ref([]); // 存储多个 DOM 元素onMounted(() => {console.log(itemRefs.value); // 所有 div 的 DOM 元素
});const logElements = () => {itemRefs.value.forEach(el => console.log(el.textContent));
};
</script>

注意ref 数组会在 onMounted 之后才填充值。


4. 访问 setup() 之外的数据

如果你在 setup() 之外使用 ref,可以通过 getCurrentInstance() 获取 Vue 实例:

<script setup>
import { getCurrentInstance, onMounted } from 'vue';onMounted(() => {const instance = getCurrentInstance();console.log(instance.refs); // 访问 ref
});
</script>

5. 结论

Vue 3 的 模板引用(Template Refs) 让我们可以更方便地访问 DOM 和子组件实例,适用于:

  • 操作原生 DOM(如获取焦点、测量元素尺寸)
  • 调用子组件方法(通过 refdefineExpose
  • 获取多个元素(使用 ref 数组)

但是,如果能用 Vue 的 响应式数据 来实现同样的效果,最好避免直接操作 DOM,以保持 Vue 响应式系统的优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Operating System Concepts》阅读笔记:p495-p511

《Operating System Concepts》学习第 44 天&#xff0c;p495-p511 总结&#xff0c;总计 17 页。 一、技术总结 1.cache (1)定义 A cache is a region of fast memory that holds copies of data. (2)cache 和 buffer 的区别 The difference between a buffer and a cac…

通过Spring Boot集成WebSocket进行消息通信

文章目录 通过Spring Boot集成WebSocket进行消息通信1. 创建 Spring Boot 项目2. 添加 WebSocket 依赖3. 配置 WebSocket4. 创建 WebSocket 处理器5. 创建控制器&#xff08;可选&#xff09;6. 前端页面测试7. 运行项目注意事项 通过Spring Boot集成WebSocket进行消息通信 1.…

rust服务应用开发框架

原文链接:https://i68.ltd/notes/posts/20250313-rust-wasm-fw/ spin 开源开发工具&#xff0c;用于构建和运行由 WebAssembly 提供支持的无服务器应用程序Spin 是一个框架&#xff0c;用于使用 WebAssembly 构建&#xff0c;部署和运行快速&#xff0c;安全和可组合的云端微…

迷茫的一周 2025/3/28

Java篇 在Java中&#xff0c;以下数据类型中,需要内存最多的是(long) - A选项byte&#xff1a;占用1个字节&#xff08;8位&#xff09; - B选项long&#xff1a;占用8个字节&#xff08;64位&#xff09; - C选项Object&#xff1a;Object本身是一个引用&#xff0c;在32位JVM…

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索&#xff08;本文&#xff09;Elasticsearch 搜索高级Elasticsearch 高级 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能&#xff0c;现在先将文档添加到索引中&#xff0c…

docker镜像拉取失败

hub.docker.com中提供的docker pull命令在服务器拉取镜像时报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这个错误通常表明Docker客户…

EFISH-SBC-RK3576 + 5G模组:无线工业相机与分布式AI质检‌

在智能制造与仓储物流场景中&#xff0c;传统有线工业相机存在部署成本高、灵活性差等痛点。‌eFish-SBC-RK3576‌ 通过 ‌5G无线传输 分布式NPU协同‌&#xff0c;实现跨产线、跨工厂的AI质检系统&#xff0c;检测效率提升300%&#xff0c;布线复杂度降低90%。 ‌1. 系统架构…

AI提示词编写方法全解析

在人工智能日益融入生活的当下&#xff0c;如何巧妙编写提示词&#xff0c;成为充分发挥AI效能的关键。以下为您详细介绍几种实用的AI提示词编写方法。 角色扮演法&#xff1a;赋予AI独特身份 角色扮演法旨在让AI模拟特定角色。当我们渴望AI以历史人物、虚拟角色的视角进行表…

【docker】docker应用举例

# Docker创建python项目 ## 1. 准备 Dockerfile 首先,在项目根目录下创建一个 Dockerfile,用于定义 Docker 镜像的构建步骤。 # 使用官方 Python 镜像作为基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制项目文件到容器中 COPY . /app # 安装项目依赖…

【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解

目录 一、前言 二、LangChain4j 介绍 2.1 什么是LangChain4j 2.2 LangChain4j 主要特点 2.3 Langchain4j 核心组件 三、RAG介绍 3.1 什么是RAG 3.2 RAG工作流程 3.2.1 补充说明 3.3 Embedding模型 3.3.1 RAG实际使用步骤 3.3.2 什么是Embedding 3.3.3 Embedding 技…

基于 Trae 的超轻量级前端架构设计与性能优化实践

一、技术背景与选型动因 在单页应用(SPA)复杂度指数级增长的今天&#xff0c;传统框架在千级列表渲染场景下普遍存在首屏延迟(>1.5s)、内存占用过高(>200MB)等问题。基于对 Webpack Bundle Analyzer 的长期观察&#xff0c;我们发现核心问题集中在&#xff1a; • 类组件…

dotnet core web api linux主机公网发布

效果: 发布流程: 创建一个ASP.NET Core Web API 工程 输入工程名 选择框架版本为.net 9.0及选择配置HTTPS和启用OPENAPI 启动调试 确认证书

WPS宏开发手册——JSA语法练习

目录 系列文章3、JSA语法练习3.1、运算练习3.2、比较练习3.3、if else练习3.4、for 练习3.5、字符串、数组方法练习3.6、语义转编程练习题 系列文章 使用、工程、模块介绍 JSA语法 JSA语法练习题 Excel常用Api 后续EXCEL实战、常见问题、颜色附录&#xff0c;持…

计算机网络面经(一)

以下为个人总结&#xff0c;图源大部分会来自网络和JavaGuide 网络分层模型 OSI七层模型 各层的常见协议 应用层 用户接口 HTTP, FTP, SMTP, DNS表示层 数据格式转换 SSL/TLS, JSON, JPEG会话层 会话管理 NetBIOS, RPC, SSH传输层 端到端通信 TCP, UDP, QUIC网络层 路由寻址…

《JVM考古现场(十四):混沌重启——从量子永生到宇宙热寂的终极编译》

开篇&#xff1a;熵火燎原量子递归的终极突围 "当《诛仙剑阵》的时空冻结算法遭遇量子递归暴走&#xff0c;当Project Omega的热寂代码在JVM的十三维堆内存中坍缩&#xff0c;此刻我们即将撕开归墟晶壁&#xff0c;直面从玻尔兹曼大脑到冯诺依曼架构的终极对决&#xff0…

【django】2-2 (django配置) 数据库配置、缓存配置

文章目录 5 数据库配置5.1 常用配置项5.2 数据库配置示例5.3 其它数据库配置选项 6 缓存6.1 常用配置项6.2 内置的缓存后端6.3 缓存配置示例6.4 缓存中间件的配置 创建django项目后&#xff0c;会自动生成初始的项目文件如下&#xff1a; manage.py # 管理django项目…

【博客】使用GithubAction自动同步obisidian和hexo仓库

使用Github Action自动同步obisidian和hexo仓库&#xff0c;避免手动操作。 本文首发于❄慕雪的寒舍 1. 烦恼 先来说说慕雪现在的笔记和博客是怎么管理的吧&#xff0c;我正在使用两套笔记软件 思源笔记&#xff1a;私密性高一些&#xff0c;不是博客的笔记都在这里面。由于思…

scala简介和基础语法

Scala简介 Scala 是一门多范式&#xff08;multi-paradigm&#xff09;的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上&#xff0c;并兼容现有的 Java 程序。Scala 源代码被编译成 Java 字节码&#xff0c;所以它可…

7.4考研408数据结构B树与B+树专题深度解析

考研408数据结构B树与B+树专题深度解析 一、B树(B-Tree) 1.1 定义与性质 定义: B树是一种平衡多路查找树,满足以下条件: 阶数:每个结点最多有 m m m个子树( m ≥

WEB安全--RCE--RCE的危险函数

一、命令执行 1.1、命令执行原理 <?php $cmd $_GET[cmd]; // 直接获取用户输入 system($cmd); // 不安全 ?>#payload: http://example.com/vuln.php?cmdwhoami#结果: www-data 1.2、危险函数 1.2.1、system() 介绍&#xff1a; 执行外部命令&#xff0c;将命令…