vue中ref的详解以及react的ref对比

news2025/6/9 20:33:31

文章目录

  • 1. ref是什么
  • 2. ref的使用
  • 3. ref的特性
  • 4. 使用场景
  • 5. 注意事项
  • 6. 与 React 的对比
  • 7. 动态 ref
  • 8. 函数式组件中的 ref
  • 9. 组合式 API 中的 ref
  • 10. 总结

1. ref是什么

ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。可以通过实例对象获取到后进行一些操作。

  • 如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素
<div ref="divRef">hello</div>
  • 如果用在子组件上,引用就指向组件实例
<list-component ref="listRef"></list-component>
  • 如果在v-for循环中使用了ref,引用指向的就是数组类型。
<div v-for="item in list" :ref="item.xxx"></div>

2. ref的使用

在给组件绑定ref=xxx的属性后,通过this.$refs.xxx,就可以获取到组件的实例,进而可以操作组件的方法,获取到属性,如下例子,通过获取到list组件的实例,得到了组件内部的xxx属性。

  • 普通ref
<list-component ref="listRef"></list-component>

console.log(this.$refs.listRef.xxx)
  • 循环里的ref

如果在v-for循环中使用了ref,引用指向的就是数组类型,为了确保唯一性,可以使用id拼接的方式。

<div v-for="item in list" :ref="`ref${item.id}`"></div>

console.log(this.$refs[`ref${item.id}`])

3. ref的特性

  • 非响应式$refs 对象不会触发视图更新,即便引用的元素或者组件有了变化。
  • 延迟更新$refs 是在 DOM 更新结束之后才会进行更新的,所以在初始化阶段或者数据变更时,直接访问 $refs 可能无法获取到最新的引用。
  • 生命周期钩子:在 mounted 钩子函数里访问 $refs 是比较稳妥的,因为这时 DOM 已经完成了首次渲染。

4. 使用场景

  • DOM 操作
  // 聚焦输入框
  this.$refs.inputRef.focus()
  
  // 滚动到特定元素
  this.$refs.scrollContainer.scrollTop = 100
  • 调用子组件方法
  // 调用子组件的刷新方法
  this.$refs.childComponent.refreshData()
  • 访问子组件属性
  // 获取子组件的内部状态
  const count = this.$refs.counterComponent.count

5. 注意事项

  • 避免滥用:应当优先考虑使用数据绑定或者事件机制来实现组件间的通信,只有在确实需要直接操作 DOM 或者组件实例时才使用 ref
  • 异步更新:由于 Vue 的 DOM 更新是异步进行的,所以在修改数据之后立即访问 $refs 可能无法获取到更新后的 DOM。这种情况下,可以使用 this.$nextTick() 来确保 DOM 已经更新完毕。
    this.list = [...newList]
    this.$nextTick(() => {
      // 此时可以获取到更新后的 ref 列表
      console.log(this.$refs.itemRefs)
    })
    

6. 与 React 的对比

在 React 中,ref 的使用方式和 Vue 既有相似之处,也存在差异:

  • 创建方式

    // Vue
    <div ref="myDiv"></div>
    
    // React
    <div ref={this.myRef}></div>
    
  • 类型区别

    • 在 Vue 里,ref 可以直接指向 DOM 元素或者组件实例。
    • 在 React 中,ref 可以是一个回调函数,也可以是通过 createRef() 创建的对象。
  • 访问方法

    // Vue
    this.$refs.myDiv
    
    // React
    this.myRef.current
    

7. 动态 ref

借助动态绑定的方式,可以实现 ref 的动态管理:

<component :ref="dynamicRefName"></component>

// 在不同条件下使用不同的 ref
this.dynamicRefName = condition ? 'refA' : 'refB'

8. 函数式组件中的 ref

函数式组件没有自己的实例,所以在使用 ref 时会指向其渲染的根节点:

// 函数式组件
const FunctionalComp = {
  functional: true,
  render(h, context) {
    return <div>Functional Component</div>
  }
}

// 使用 ref 获取根 DOM
<FunctionalComp ref="funcRef" />
this.$refs.funcRef // 指向 <div> 元素

9. 组合式 API 中的 ref

在组合式 API 里,可以通过 defineExpose 来暴露组件的属性和方法:

<template>
  <button ref="btnRef" @click="handleClick">Click</button>
</template>

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

const btnRef = ref(null)

const handleClick = () => {
  console.log('Button clicked')
}

// 暴露给父组件
defineExpose({
  handleClick
})

onMounted(() => {
  btnRef.value.focus()
})
</script>

10. 总结

  • ref 是 Vue 提供的一种直接操作 DOM 或者组件实例的方式。
  • 要注意 ref 的非响应式特性以及延迟更新的特点。
  • 建议在必要的场景下使用 ref,并优先采用声明式的数据绑定。
  • 在组合式 API 中,可以使用 defineExpose 有选择性地暴露组件的方法和属性。

本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端页面开发阿拉伯语种适配指南
  • flutter-使用extended_image操作图片的加载和状态处理以及缓存和下载
  • flutter-制作可缩放底部弹出抽屉评论区效果
  • flutter-实现Tabs吸顶的PageView效果
  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • 助你上手Vue3全家桶之Vue3教程
  • 超详细!vue组件通信的10种方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

个人主页

  • CSDN
  • GitHub
  • 掘金

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

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

相关文章

【笔记】解决MSYS2安装后cargo-install-update.exe-System Error

#工作记录 cargo-install-update.exe-System Error The code execution cannot proceed because libgit2-1.9.dll wasnot found. Reinstalling the program may fix this problem. …

银行卡二三四要素实名接口如何用PHP实现调用?

一、什么是银行卡二三四要素实名接口 输入银行卡卡号、姓名、身份证号码、手机号&#xff0c;验证此二三四要素是否一致。 二、核心价值 1. 提升风控效率 通过实时拦截冒用身份开户&#xff0c;银行卡二三四要素实名接口显著降低了人工审核成本&#xff0c;效率提升50%以上…

itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程

我们先来看看今天的主题&#xff0c;tvbox手机版&#xff0c;然后再看看如何搭建&#xff1a; 很多爱好者都希望搭建自己的影视平台&#xff0c;那该如何搭建呢&#xff1f; 后端开发环境&#xff1a; 1.易如意后台管理优化版源码&#xff1b; 2.宝塔面板&#xff1b; 3.ph…

网页抓取混淆与嵌套数据处理流程

当我们在网页抓取中&#xff0c;遇到混淆和多层嵌套的情况是比较常见的挑战。混淆大部分都是为了防止爬虫而设计的&#xff0c;例如使用JavaScript动态加载、数据加密、字符替换、CSS偏移等。多层嵌套则可能是指HTML结构复杂&#xff0c;数据隐藏在多层标签或者多个iframe中。 …

高性能MYSQL:复制同步的问题和解决方案

一、复制的问题和解决方案 中断MySQL的复制并不是件难事。因为实现简单&#xff0c;配置相当容易&#xff0c;但也意味着有很多方式会导致复制停止&#xff0c;陷入混乱并中断。 &#xff08;一&#xff09;数据损坏或丢失的错误 由于各种各样的原因&#xff0c;MySQL 的复制…

大话软工笔记—架构模型

1. 架构模型1—拓扑图 &#xff08;1&#xff09;拓扑图概念 拓扑图&#xff0c;将多个软件系统用网络图连接起来的表达方式。 &#xff08;2&#xff09;拓扑图分类 总线型结构 比较普遍采用的方式&#xff0c;将所有的系统接到一条总线上。 星状结构 各个系统通过点到…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

spring task定时任务快速入门

spring task它基于注解和配置&#xff0c;可以轻松实现任务的周期性调度、延迟执行或固定频率触发。按照我们约定的时间自动执行某段代码。例如闹钟 使用场景 每月还款提醒&#xff0c;未支付的订单自动过期&#xff0c;收到快递后自动收货&#xff0c;系统自动祝你生日快乐等…

搭建nginx的负载均衡

1、编写一个configMap的配置文件 events {worker_connections 1024; # 定义每个worker进程的最大连接数 }http {# 定义通用代理参数&#xff08;替代proxy_params文件&#xff09;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-F…

Appium+python自动化(八)- 认识Appium- 下章

1、界面认识 在之前安装appium的时候说过我们有两种方法安装&#xff0c;也就有两种结果&#xff0c;一种是有界面的&#xff08;客户端安装&#xff09;&#xff0c;一种是没有界面的&#xff08;终端安装&#xff09;&#xff0c;首先我们先讲一下有界面的&#xff0c;以及界…

LabVIEW的MathScript Node 绘图功能

该VI 借助 LabVIEW 的 MathScript Node&#xff0c;结合事件监听机制&#xff0c;实现基于 MathScript 的绘图功能&#xff0c;并支持通过交互控件自定义绘图属性。利用 MathScript 编写脚本完成图形初始化&#xff0c;再通过LabVIEW 事件结构响应用户操作&#xff0c;动态修改…

每日Prompt:治愈动漫插画

提示词 现代都市治愈动漫插画风格&#xff0c;现代女子&#xff0c;漂亮&#xff0c;长直发&#xff0c;20岁&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;气质&#xff0c;清纯现代都市背景下&#xff0c;夕阳西下&#xff0c;一位穿着白色露脐短袖&#xff0c;粉色工装裤…

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制&#xff1a; 准备阶段 - 提议者向所有接受者发送准备请求&#xff0c;请求中包含一个唯一的编号。 - 接受者收到请求后&#xff0c;会检查编号&#xff0c;如果编号比它之前见过的都大&#xff0c;就会承…

面试心得 --- 车载诊断测试常见的一些面试问题

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

跟进一下目前最新的大数据技术

搭建最新平台 40C64G服务器&#xff0c;搭建3节点kvm&#xff0c;8C12G。 apache-hive-4.0.1-bin apache-tez-0.10.4-bin flink-1.20.1 hadoop-3.4.1 hbase-2.6.2 jdk-11.0.276 jdk8u452-b09 jdk8终于可以不用了 spark-3.5.5-bin-hadoop3 zookeeper-3.9.3 trino…

系统模块与功能设计框架

系统模块与功能设计框架&#xff0c;严格遵循专业架构设计原则&#xff0c;基于行业标准&#xff08;如微服务架构、DDD领域驱动设计&#xff09;构建。设计采用分层解耦模式&#xff0c;确保可扩展性和可维护性&#xff0c;适用于电商、企业服务、数字平台等中大型系统。 系统…

我爱学算法之—— 前缀和(中)

一、724. 寻找数组的中心下标 题目解析 这道题&#xff0c;给定数组nums&#xff0c;要求我们找出这个数组的中心下标。 **中心下标&#xff1a;**指左侧所有元素的和等于右侧所有元素的和。 如果存在多个中心数组下标&#xff0c;就返回最左侧的中心数组下标。 算法思路 暴…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址&#xff1a; DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0…

React Hooks 指南:何时使用 useEffect ?

在 React 的函数组件中&#xff0c;useEffect Hook 是一个强大且不可或缺的工具。它允许我们处理副作用 (side effects)——那些在组件渲染之外发生的操作。但是&#xff0c;什么时候才是使用 useEffect 的正确时机呢&#xff1f;让我们深入探讨一下&#xff01; 什么是副作用…

API标准的本质与演进:从 REST 架构到 AI 服务集成

在当今数字化浪潮中&#xff0c;API 已成为系统之间沟通与协作的“语言”&#xff0c;REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;是一种基于 HTTP 协议的 Web 架构风格。它不仅改变了 Web 应用开发的方式&#xff0c;也成为构建现…