Vue 3 中 ref 属性详解:操作 DOM 元素的利器

Vue 3 中 ref 属性详解:操作 DOM 元素的利器

在 Vue 3 中,ref 属性不仅可以用于声明响应式数据,还可以直接绑定到模板中的 DOM 元素。通过这种方式,开发者可以在组合式 API 中高效、直接地操作 DOM 元素。本文将详细讲解 Vue 3 中标签元素中的 ref 属性及其相关知识点,并结合语法糖提供丰富的代码示例。


什么是 ref 属性?

在 Vue 3 中,ref 属性是一种将模板中的 DOM 元素或组件实例绑定到 JavaScript 变量的方法。通过 ref 属性,可以轻松访问和操作这些绑定的元素或组件。

ref 被绑定到模板中的某个元素时,Vue 会在组件实例的 setup 函数中提供对该元素的直接引用。


如何使用 ref 属性?

  1. 在模板中使用 ref 属性绑定元素:
    使用 ref 属性为 DOM 元素或组件指定一个引用名。

    <template><div ref="myDiv">这是一个绑定了 ref 的元素</div>
    </template>
    
  2. setup 函数中通过 ref 访问:
    在组合式 API 中,导入 Vue 的 ref,即可获取绑定的 DOM 元素。

    <script setup>
    import { ref, onMounted } from 'vue';const myDiv = ref(null); // 用于绑定 DOM 元素onMounted(() => {console.log('DOM 元素:', myDiv.value);
    });
    </script>
    

绑定 DOM 元素:基础用法

ref 属性最常见的用途是绑定原生 DOM 元素,获取并操作 DOM 节点。

示例:获取元素并修改样式
<script setup>
import { ref, onMounted } from 'vue';const myDiv = ref(null); // 绑定 DOM 元素onMounted(() => {// 修改 DOM 样式if (myDiv.value) {myDiv.value.style.color = 'blue';myDiv.value.style.fontSize = '20px';}
});
</script><template><div ref="myDiv">Hello Vue 3!</div>
</template>

在上面的例子中,myDiv.value 是对应的 DOM 元素引用,我们可以直接使用原生 DOM API 操作它。


绑定子组件实例

除了绑定原生 DOM 元素,ref 还可以绑定到子组件实例,从而调用组件的公共方法或访问其内部数据。

示例:访问子组件实例方法
<!-- Parent.vue -->
<script setup>
import { ref } from 'vue';
import Child from './Child.vue';const childRef = ref(null);const callChildMethod = () => {if (childRef.value) {childRef.value.sayHello();}
};
</script><template><Child ref="childRef" /><button @click="callChildMethod">调用子组件方法</button>
</template>
<!-- Child.vue -->
<script setup>
import { ref } from 'vue';const sayHello = () => {console.log('Hello from Child Component!');
};
</script><template><div>我是子组件</div>
</template>

v-for 中使用 ref

ref 用在 v-for 中时,返回的 ref 是一个包含所有绑定元素的数组或对象。

示例:获取多个元素
<script setup>
import { ref, onMounted } from 'vue';const items = ['Item 1', 'Item 2', 'Item 3'];
const itemRefs = ref([]);onMounted(() => {console.log('所有绑定的元素:', itemRefs.value);
});
</script><template><ul><li v-for="(item, index) in items" :key="index" :ref="el => itemRefs.value[index] = el">{{ item }}</li></ul>
</template>

动态绑定 ref

如果需要动态为不同的元素绑定 ref,可以使用回调函数形式的 ref

示例:动态设置 ref
<script setup>
import { ref } from 'vue';const dynamicRef = ref(null);const setRef = (el) => {dynamicRef.value = el;
};const logElement = () => {console.log('绑定的元素:', dynamicRef.value);
};
</script><template><div><div ref="setRef">动态绑定的元素</div><button @click="logElement">查看绑定的元素</button></div>
</template>

销毁阶段清理 ref

绑定的 ref 在组件销毁时会被自动清理,无需手动处理。不过,如果涉及到全局事件监听等操作,还是需要在 onUnmounted 中手动清理。

示例:清理全局事件监听
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';const myDiv = ref(null);const handleClick = () => {console.log('全局点击事件触发');
};onMounted(() => {if (myDiv.value) {window.addEventListener('click', handleClick);}
});onUnmounted(() => {if (myDiv.value) {window.removeEventListener('click', handleClick);}
});
</script><template><div ref="myDiv">清理全局事件的示例</div>
</template>

注意事项

  1. 访问时机

    • ref 的绑定只有在 DOM 元素或组件实例挂载后(即 onMounted 钩子中)才可访问。
    • setup() 中直接访问时,ref.valuenull
  2. 兼容性

    • Vue 3 的 ref 属性在组合式 API 中表现优越,但在使用选项式 API 时需要额外注意访问方式的差异。
  3. 避免过度依赖

    • 使用 ref 直接操作 DOM 应仅限于必要场景。对于大多数交互,优先使用 Vue 的响应式特性和指令(如 v-modelv-bind)。

总结

Vue 3 中的 ref 属性是操作 DOM 元素和组件实例的重要工具,具有高效、简洁的特点。在组合式 API 的帮助下,开发者可以更灵活地操作 DOM,处理复杂的交互需求。通过本文的讲解,你可以轻松掌握 ref 属性的各种用法,并应用到实际项目中。

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

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

相关文章

FromData格式提交接口时入参被转成JSON格式问题

本地上传文件后通过事件提交文件&#xff0c;一般先通过前端组件生成文本流&#xff0c;在通过接口提交文本流&#xff0c;提交文本流一般使用FormData的入参形式传入&#xff0c;接口请求头也默认"Content-Type": “multipart/form-data”&#xff0c;但是某些场景统…

【插件】重复执行 pytest-repeat

安装 pip3 install pytest-repeat 用法 1.命令行 pytest --count num pytest --count 32.装饰器 pytest.mark.repeat(num) #num运行次数 pytest.mark.repeat(5)#执行结果如下&#xff1a;

【Spring】循环引用 解决流程,只用一二级缓存?

文章目录 循环引用循环引用循环引用解决流程为什么不只用一二级缓存&#xff1f;:red_circle: 循环引用 循环引用 循环依赖&#xff1a;循环依赖其实就是循环引用&#xff0c;也就是bean互相持有对方&#xff0c;最终形成闭环。比如A依赖于B&#xff0c;B依赖于A 循环依赖在…

【青牛科技】视频监控器应用

1、简介&#xff1a; 我司安防产品广泛应用在视频监控器上&#xff0c;产品具有性能优良&#xff0c;可 靠性高等特点。 2、图示&#xff1a; 实物图如下&#xff1a; 3、具体应用&#xff1a; 标题&#xff1a;视频监控器应用 简介&#xff1a;视频监控器工作原理是光&#x…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

5G与4G互通的桥梁:N26接口

5G的商用部署进程将是一个基于4G系统进行的长期的替换、升级、迭代的过程&#xff0c;4G系统是在过渡到5G全覆盖过程中&#xff0c;作为保障用户业务连续性体验这一目的的最好补充。 因此4G/5G融合组网&#xff0c;以及互操作技术将是各大运营商在网络演进中需要重点考虑的问题…

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践

案例背景 某保险机构客户的数据中台&#xff0c;自系统上线后不久&#xff0c;会定期的用 obload 工具从上游业务系统导入数据至OceanBase数据库。但&#xff0c;不久便遇到了应用服务器的 Memory 与 CPU 资源占用持续攀升&#xff0c;最终导致系统夯住而不可用的异常。 memo…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角&#xff1a;人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么&#xff1f;和App的关系&#xff1f; 元服务是是一种HarmonyOS轻量应用形态&#xff0c;用户无需安装即可使用&#xff0c;具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体&#xff0c;独立于应用&#xff0c;不依赖应用可独立…

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…

智慧环保平台_大数据平台_综合管理平台_信息化云平台

系统原理   智慧环保是新一代信息技术变革的产物&#xff0c;是信息资源日益成为重要生产要素和信息化向更高阶段发展的表现&#xff0c;是经济社会发展的新引擎。   现今&#xff0c;环保信息化建设进入高速发展阶段。在此轮由物联网掀起的信息浪潮下&#xff0c;环境信息…

《通往人工智能深度学习专家之路:全面解析学习路线图》

《通往人工智能深度学习专家之路&#xff1a;全面解析学习路线图》 一、人工智能深度学习简介1.1 人工智能与深度学习的关系1.2 深度学习的应用领域1.3 深度学习的重要性 二、深度学习路线图总览2.1 学习路线图的结构2.2 各阶段学习目标与重点 三、深度学习基础阶段3.1 数学基础…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

任务管理功能拆解——如何高效管理项目任务?

在项目管理中&#xff0c;任务管理功能不仅仅是一个操作工具&#xff0c;它是确保项目按时、高效完成的核心所在。无论是小团队还是跨部门合作&#xff0c;任务管理能够帮助项目经理和团队成员清晰地看到每一项任务的执行情况和进度&#xff0c;从而合理调配资源、优化工作流程…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的&#xff0c;当然&#xff0c;我肯定是很多年的计算机基础的&#xff0c;万变不离其宗。 现在web网站都流行所谓的前后端结构&#xff0c;不知不觉我也开始受到这个影响&#xff0c;以前都是前端直接操作…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…