当前位置: 首页 > news >正文

React 组件三大核心之 ref

文章目录

  • 用法
    • React.createRef()
    • useRef Hook
  • 注意

ref 是 React 中的一个重要概念,它用于访问和操作 DOM 元素或者类组件实例。

在React中,ref 提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素。这对于执行DOM操作、读取值、动画、集成第三方DOM库等场景非常有用。

ref 是一种特殊的属性,你可以将它附加到React元素上。当元素被挂载到DOM或卸载时,React会将ref对象上的特定方法作为回调传递给它。这使得可以在生命周期方法或其他React组件的方法中直接访问DOM元素。

  • 直接访问DOM:通过ref,你可以直接访问和操作DOM元素。
  • 访问组件实例:对于类组件,ref也可以用来访问组件的实例。
  • 灵活性:ref可以附加到任何React元素上,包括类组件、函数组件、DOM元素等。

用法

React.createRef()

React提供了 React.createRef() 方法来创建ref,你可以通过函数的形式来访问DOM元素。

class MyComponent extends React.Component {constructor(props) {super(props);this.myInput = React.createRef();}focusInput = () => {this.myInput.current.focus(); // 使input获得焦点console.log(this.myInput.current.value); // 获取input值};render() {return (<div><input ref={this.myInput} type="text" /><button onClick={this.focusInput}>Focus Input</button></div>);}
}

useRef Hook

在函数组件中,还可以使用 useRef Hook 来创建ref。

import React, { useRef } from 'react';const MyComponent = () => {const myInput = useRef(null);const focusInput = () => {myInput.current.focus(); // 使input获得焦点console.log(myInput.current.value); // 获取input值};return (<div><input ref={myInput} type="text" /><button onClick={focusInput}>Focus Input</button></div>);
};export default MyComponent;

注意

  • 尽量避免过度使用ref,React的设计哲学是尽可能地避免直接操作DOM。

  • 当ref被附加到一个元素上时,React会在组件挂载时将该元素作为current属性传递给ref。同样地,当元素被卸载时,current值将被设为null。

  • 不要在render方法或任何应该具有纯函数性质的地方使用ref,因为这可能会导致意外的副作用。

  • 对于函数组件,使用React.forwardRef或useRef来创建和使用ref。

http://www.lryc.cn/news/351369.html

相关文章:

  • json 读写 python
  • Docker快速部署Seata的TC服务以及微服务引入Seata教程
  • 我的第一个JAVA程序IDEA版
  • 轻量SEO分析报告程序网站已开心去授权
  • 本机与华为云ping不通的问题
  • FastJSON2 > FastJSON 好在何处
  • 7个常见的SQL慢查询问题及其解决方法
  • 《Rust奇幻之旅:从Java和C++开启》第1章Hello world 1/5
  • 将富文本编辑器中的H标签处理成树形结构,支持无限层级
  • 探索移动云:我的ES与Kibana之旅
  • java 线程执行原理,java线程在jvm中执行流程
  • [Redis]基本全局命令
  • 【Linux】- HBase集群部署 [19]
  • js如何遍历FormData的值
  • 【C语言】明析部分C语言内存函数
  • 一阶数字高通滤波器
  • Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点
  • VUE3-form表单保存附件与基本信息
  • 无线网络安全技术基础
  • sheng的学习笔记-docker部署Greenplum
  • 【投稿资讯】区块链会议CCF A -- SP 2025 截止6.6、11.14 附录用率
  • C++哪些函数不能被声明为虚函数
  • vue中数据已经改变了,但是table里面内容没更新渲染!
  • 头歌实践教学平台:Junit实训入门篇
  • matlab使用教程(80)—修改图形对象的透明度
  • mysql bin 日志转成sql
  • 河南道路与桥梁乙级资质申请:注册证书与职称证书准备
  • 3D工业视觉
  • 使用auth_basic模块进行基础认证
  • 深度解析物联网平台:优化数据点位管理的实战策略