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

news2024/11/19 13:40:46

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.coloradmin.cn/o/2243415.html

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

相关文章

项目2:简易随机数生成器 --- 《跟着小王学Python·新手》

项目2&#xff1a;简易随机数生成器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握P…

数字资产与大健康领域的知识宝藏:高效知识库搭建策略

在数字化时代&#xff0c;大健康领域的企业积累了丰富的数字资产&#xff0c;这些资产如同一座待挖掘的金矿&#xff0c;蕴含着巨大的价值。高效搭建知识库&#xff0c;能够将这些数字资产转化为企业竞争力。 数字资产与大健康领域知识宝藏 数字资产在大健康领域包括患者数据…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)事件推荐开发者测试

意图框架向开发者提供真机测试能力&#xff0c;即开发者可连接设备进行调测。开发者完成代码开发之后&#xff0c;功能正式上架应用市场前&#xff0c;可以在HarmonyOS NEXT设备上面进行自验证&#xff0c;打磨体验。真机测试分为三个步骤&#xff1a;基础信息提供&#xff0c;…

MySQL —— MySQL基础概念与常用功能介绍

文章目录 基本概念数据类型数据类型分类 约束主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;使用非空约束&#xff08;not null&#xff09;使用唯一性约束&#xff08;UNIQUE&#xff09;使用默认约束&#xff08;DEFAULT&#xff…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

商业物联网详细指南:优势与挑战

物联网是信息技术行业最具前景的领域之一。为什么它如此热门呢&#xff1f;原因在于全球连接性。设备可以像人群一样相互协作。正如我们所知&#xff0c;协作能显著提高生产力。 物联网对普通用户和企业都有益处。许多日常流程可以通过传感器、扫描仪、摄像头和其他设备实现自…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件&#xff1a;USBToSerialPort.apk 链接&#xff1a;https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码&#xff1a;8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…

在云服务器搭建 Docker

操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统&#xff0c;刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息&#xff0c;请参见 Docker 官方。 说明&#xff1a; Windows Subsystem for Linux&#xff…

缓存及其不一致

在实际开发过程中&#xff0c;一般都会遇到缓存&#xff0c;像本地缓存&#xff08;直接在程序里搞个map也可以&#xff0c;但是可能会随着数据的增长出现OOM&#xff0c;建议使用正经的本地缓存框架&#xff0c;因为自己实现淘汰策略啥的挺费劲的&#xff09;、分布式缓存&…

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

神经网络11-TFT模型的简单示例

Temporal Fusion Transformer (TFT) 是一种用于时间序列预测的深度学习模型&#xff0c;它结合了Transformer架构的优点和专门为时间序列设计的一些优化技术。TFT尤其擅长处理多变量时间序列数据&#xff0c;并且能够捕捉到长期依赖关系&#xff0c;同时通过自注意力机制有效地…

汽车资讯新动力:Spring Boot技术革新

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1&#xff0c;创建证书和密钥 需要openssl环境&#xff0c;如果是Window下&#xff0c;下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境&#xff0c;此环境是在jdk环境下 本案例所使用的账号密码均为&#xff1a; ka…

【进阶系列】python简单爬虫实例

python有一个很强大的功能就是爬取网页的信息&#xff0c;这里是CNBlogs 网站&#xff0c;我们将以此网站为实例&#xff0c;爬取指定个页面的大标题内容。代码如下&#xff1a; 首先是导入库&#xff1a; # 导入所需的库 import requests # 用于发送HTTP请求 from bs4 impor…

基于Java和Vue实现的上门做饭系统上门做饭软件厨师上门app

市场前景 生活节奏加快&#xff1a;在当今快节奏的社会中&#xff0c;越来越多的人因工作忙碌、时间紧张而无法亲自下厨&#xff0c;上门做饭服务恰好满足了这部分人群的需求&#xff0c;为他们提供了便捷、高效的餐饮解决方案。个性化需求增加&#xff1a;随着人们生活水平的…

CentOS 7中查找已安装JDK路径的方法

使用yum安装了jdk8&#xff0c;但是其他中间件需要配置路径的时候&#xff0c;却没办法找到&#xff0c;如何获取jdk路径&#xff1a; 一、确认服务器是否存在jdk java -version 二、查找jdk的 java 命令在哪里 which java 三、找到软链指向的地址 ls -lrt /usr/bin/java l…