vue中标签的ref和id的用法和区别优缺点

Vue 3 中 refid 的用法详解:区别、优缺点及使用场景

在 Vue 3 开发中,我们经常需要获取 DOM 元素或组件实例来进行交互。Vue 提供了 ref 和原生 HTML 属性 id 来实现这种操作。虽然 refid 都能标识并操作元素,但它们的使用方式、优缺点以及适用场景各不相同。本文将详细解析 Vue 3 中 refid 的用法,帮助您根据需求选择最合适的方案。


ref 的用法与特点

ref 是 Vue 3 提供的响应式引用,用来绑定 DOM 元素或子组件实例。它通过 Vue 的响应式系统确保引用的变化自动同步,是在组件中获取和操作元素的推荐方式。

基础用法示例:使用 ref 操作 DOM 元素

在下面的示例中,ref 被用于引用输入框,使其在组件挂载后自动聚焦。

<template>
  <div>
    <input ref="inputElement" placeholder="输入内容" />
    <button @click="focusInput">聚焦输入框</button>
  </div>
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const inputElement = ref(null);

    onMounted(() => {
      inputElement.value.focus();
    });

    const focusInput = () => {
      inputElement.value.focus();
    };

    return {
      inputElement,
      focusInput,
    };
  },
};
</script>
  • 说明inputElement 是一个通过 ref 函数创建的引用,Vue 会在组件挂载后自动将输入框与 inputElement 关联。onMounted 钩子确保在页面渲染完成后访问到该元素。
使用 ref 访问子组件实例

在 Vue 3 中,ref 不仅限于操作 DOM 元素,还可以引用子组件实例。在父组件中,可以通过 ref 获取子组件并调用其公开方法。

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>子组件内容</p>
  </div>
</template>

<script>
export default {
  methods: {
    sayHello() {
      console.log('Hello from Child Component!');
    }
  }
};
</script>
<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent ref="childRef" />
    <button @click="callChildMethod">调用子组件方法</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  setup() {
    const childRef = ref(null);

    const callChildMethod = () => {
      if (childRef.value) {
        childRef.value.sayHello();
      }
    };

    return {
      childRef,
      callChildMethod
    };
  }
};
</script>
  • 说明:在父组件 ParentComponent 中,通过 ref 将子组件实例 ChildComponent 引用为 childRef,并在按钮点击时调用 sayHello 方法。这种方式适合需要操作子组件的方法或数据的情况。

id 的用法与特点

id 是标准 HTML 属性,为元素提供全局唯一的标识符,适合标识不需要响应式更新的静态元素。与 ref 不同,id 不具备 Vue 的响应式特性,因此无法自动追踪元素的变化。它适用于简单的静态标识场景,例如通过 JavaScript 原生方法 document.getElementById 获取 DOM 元素。

基础用法示例:使用 id 静态标识元素

在以下示例中,id 用于标识一个静态元素,并在按钮点击时修改其样式。

<template>
  <div>
    <div id="staticElement">这是一个静态元素</div>
    <button @click="changeColor">更改元素颜色</button>
  </div>
</template>

<script>
export default {
  methods: {
    changeColor() {
      const element = document.getElementById('staticElement');
      if (element) {
        element.style.color = 'blue';
      }
    }
  }
};
</script>
  • 说明:通过 id="staticElement" 标识该元素,使用 document.getElementById 获取元素对象并改变其样式。这种用法不具备响应式绑定,因此适合对 DOM 的简单、全局唯一标识。

refid 的详细对比

特性refid
响应性响应式,自动追踪绑定的元素变化非响应式,DOM 变化不会自动同步
使用范围Vue 组件内部全局
获取方式this.$refs 或绑定在 ref 函数上的变量document.getElementById 或选择器 API
适用对象DOM 元素、Vue 子组件实例DOM 元素
推荐场景需要动态控制的组件或元素静态、不需要动态控制的元素
生命周期集成Vue 自动管理,确保 ref 在组件挂载后可访问无生命周期管理,需手动管理

优缺点对比

特性优点缺点
ref- 响应式,支持 Vue 生命周期管理;
- 支持 DOM 元素和 Vue 子组件实例访问
- 仅限于 Vue 组件内部使用
id- 全局唯一标识,适合第三方库和无需响应式的场景;
- 跨组件访问方便
- 非响应式,无法动态追踪变化

使用场景总结:refid 的选择

  • 优先使用 ref:如果需要响应式更新、操作 Vue 子组件或频繁动态交互,ref 更加合适。它与 Vue 响应式系统深度集成,可以直接在组件中对 DOM 元素和组件实例进行访问和操作。

  • 使用 id 的场景:当需要全局唯一标识符或与第三方库集成(如一些全局配置)时,id 是一个简单且有效的选择。它适合用于标识少量静态、无需频繁更新的元素。
     

总结而言,Vue 3 推荐使用 ref 进行组件内部的 DOM 元素或子组件操作,因为它的响应式特性和生命周期管理更适合现代前端开发的需求。而 id 则适用于静态、不需要动态响应的 DOM 元素,全局唯一标识的特点使其适合少数场景。
特别注意:当使用id的时候容易出现不同组件中id命名相同,在页面使用的时候很容易就获取不到自己想要的那个id对象,只能获取到第一个出现的id。比如A组件定义了一个id='person',B组件也定义了一个'person',在他们的共同父组件C中获取id得到的将会是第一个id对应的dom

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Idea基于JRbel实现项目热部署修改Java、Xml文件无需重启项目

Idea基于JRbel实现项目热部署修改Java、Xml文件无需重启项目 1.JRbel服务安装2.JRbel插件安装3.JRbel配置 1.JRbel服务安装 直接装插件的话&#xff0c;需要用到一个服务地址&#xff0c;服务下载链接&#xff1a;&#xff08;现在没时间搞&#xff0c;会尽快加上&#xff09;…

合合信息亮相PRCV大会,探讨生成式AI时代的内容安全与系统构建加速

一、前言 在人工智能技术的飞速发展下&#xff0c;生成式AI已经成为推动社会进步的重要力量。然而&#xff0c;随着技术的不断进步&#xff0c;内容安全问题也日益凸显。如何确保在享受AI带来的便利的同时&#xff0c;保障信息的真实性和安全性&#xff0c;已经成为整个行业待解…

Jmeter自动化实战

前言 由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据 创建录制模板 录制模板参考 首先创建一个录制模板 因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制粘贴的的全面导致接…

Flutter TextField和Button组件开发登录页面案例

In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中&#xff0c;我们…

NVIDIA发布Nemotron-70B-Instruct,超越GPT-4o和Claude 3.5的AI模型

一、Nemotron-70B-Instruct 是什么 Nemotron-70B-Instruct 是由 NVIDIA 基于 Meta 的 Llama 3.1-70B 模型开发的先进大语言模型&#xff08;LLM&#xff09;。该模型采用了新颖的神经架构搜索&#xff08;Neural Architecture Search&#xff0c;NAS&#xff09;方法和知识蒸馏…

【华为HCIP实战课程二十】OSPF特殊区域NSSA配置详解,网络工程师

一、NSSA&#xff08;Not So Stubby Area&#xff09;区域 在NSSA区域内可以拥有ASBR&#xff0c;并且重分发进入OSPF的路由是以7类LSA形式存在&#xff0c;该类型的LSA只能存在于NSSA区域内不接收5类LSA&#xff0c;ABR过滤外部进入该区域的4 5类LSA&#xff0c;可以引入外部…

题解 力扣 LeetCode 739 每日温度 C++

题目传送门&#xff1a; 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/daily-temperatures/description/ 思路&#xff1a; 就是单调栈的思路&#xff0c;具体见代码 不知道单调栈的&#xff0c;可以看我的这篇文章&#xff1a; 数…

web3对象如何连接以太网络节点

实例化web3对象 当我们实例化web3对象&#xff0c;我们一般开始用本地址&#xff0c;如下 import Web3 from web3 var web3 new Web3(Web3.givenProvider || ws://localhost:5173)我们要和以太网进行交互&#xff0c;所以我们要将’ws://localhost:5173’的本地地址换成以太…

【Linux学习】(6)编译器gcc/g++

前言 本节重点&#xff1a;掌握gcc/g编译器的使用&#xff0c;并了解其过程&#xff0c;原理 一、Linux编译器-gcc/g使用 1. gcc/g的基本使用 在前面我们学习了vim&#xff0c;知道如何在Linux中编写代码。但又是如何编译代码的&#xff1f;——在Linux中我们编译代码使用的是…

UDP(用户数据报协议)端口监控

随着网络的扩展&#xff0c;确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中&#xff0c;端口发挥着重要作用&#xff0c;它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互&#xff0c;端口为网络基础设施的顺畅运行提供了保障。端口使数据通…

Linux中安装配置SQLite3,并实现C语言与SQLite3的交互。

前言 SQLite 是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。本次实验介绍在Linux上实现C语言和SQLite3的交互&#xff0c;利用C语言编写相关语句&#xff0c;连接数据库、操作数…

【数据结构初阶】二叉树---堆

二叉树-堆的实现 一、树的概念&#xff08;什么是树&#xff09;二、二叉树的概念及结构2.1 二叉树的概念2.2 二叉树的性质2.3 二叉树存储结构 三、二叉树的顺序结构3.1 堆的概念及结构3.2 堆的向下调整算法3.3堆的创建 四、堆的代码实现4.1 堆的初始化4.2 堆的销毁4.3 堆的插入…

如何从iconfont中获取字体图标并应用到微信小程序中去?

下面我们一一个微信小程序的登录界面的制作为例来说明&#xff0c;如何从iconfont中获取字体图标是如何应用到微信小程序中去的。首先我们看效果。 这里所有的图标&#xff0c;都是从iconfont中以字体的形式来加载的&#xff0c;也就是说&#xff0c;我们自始至终没有使用一张…

jenkins 自动化部署Springboot 项目

一、安装docker 1.更新yum命令 yum -y update2.查看机器有残留的docker服务&#xff0c;有就卸载干净 查看docker 服务 rpm -qa |grep docker卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/contai…

linux下的进程等待(wait、waitpid)

目录 引言 进程等待的必要性 见见猪跑&#xff1a;是什么 怎么办 多个子进程时 阻塞等待 非阻塞轮询 参数一&#xff1a; 参数二 进程等待的原理 进程退出相关的宏 第三个参数option&#xff08;设置等待的方式&#xff09; 引言 在Linux操作系统中&#xff0c;进程…

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点&#xff0c;不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码&#xff0c;是要在jmeter中用的 keytool -import -ali…

Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

基于SSM+小程序的垃圾分类管理系统(垃圾2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的垃圾分类管理系统实现了管理员及用户。 1、管理员功能结构图&#xff0c;管理员功能有个人中心&#xff0c;管理员管理&#xff0c;基础数据管理、论坛管理、垃圾信息管理…

钰泰ETA4553电压电平转换器IC

描述 ETA4553 是两位同相转换器&#xff0c;是一种双向电压电平转换器&#xff0c;可用于建立混合电压系统之间的数字开关兼容性。它使用两个独立的可配置电源轨&#xff0c;A 端口支持 1.65V 至 5.5V 的工作电压&#xff0c;同时跟踪 VCCA 电源&#xff0c;B 端口支持 2.3V 至…

QT QDialog::exec()调用时清除部件所有焦点

最近在做项目时&#xff0c;遇到一个问题&#xff1a;在统信UOS系统编写的QT程序&#xff0c;其中进入某些页面时&#xff0c;或者显示模态窗时&#xff0c;按钮都会有一个焦点框&#xff0c;这个是不允许的&#xff0c;于是乎&#xff0c;开始了清理焦点的旅途。 一、清理QDia…