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

React第七节 组件三大属性之 refs 的用法注意事项

1、定义

React 中refs 是允许我们操作DOM 访问组件实例的一种方案。开发人员可以直接使用 refs 访问操作DOM,而不用自身的数据状态,这种方案在实际开发过程中是有必要的,但是不建议通篇使用refs操作DOM,如果是这样,那么我们应该考虑一下,自己设计的组件是否合理,React设计的原理是利用状态和数据驱动UI视图;

2、用途

a、我们想要保存一些数据,但是不想随时更新在视图中;
b、输入框自动聚焦、滚动到某个节点、视频自动播放、图表库(ecahrts)等

3、用法

创建 refs 的方法:
3.1、类式组件中:使用 React.createRefs()
3.2、函数式组件中的 使用 useRefs() Hook
3.3、回调函数形式 在函数式组件、类式组件中均可使用
3.4、字符串形式

a、类式组件通过createRef() 创建 【推荐】

通过createRef() 创建 ref实例,得到的ref实例中会有一个 current 属性,通过current 获取对应的数据;这种方式只适用于类式组件

export default class MyRefs extends Component{// 创建 refmyTextRef = React.createRef()getText = () => {console.log('===myTextRef==', this.myTextRef)// 获取 input 中的值console.log(this.myTextRef.current.value)// 获取焦点// this.myTextRef.current.focus()}render() {return(<><div><input type="text" ref={this.myTextRef}></input><button onClick={this.getText}>按钮</button></div></>)}
}

b、函数式组件通过 useRef() 创建 【推荐】

这种方式只适合在函数式组件中使用
通过 .current 获取相应的值

import { useRef } from 'react'export default function MyRefs() {// 使用 useRef  Hook 创建refconst myTextRef = useRef()const getText = () => {console.log('===myTextRef==', myTextRef)console.log(myTextRef.current.value)// 获取焦点// myTextRef.current.focus()// // 截取文本// console.log(myTextRef.current.value.substr(0, 5))}return (<div><input type="text" ref={myTextRef} /><button onClick={getText}>测试</button></div>)
}

c、回调函数的形式 创建 ref 【推荐】

这种创建的方式,在类式组件以及函数式组件中都可以使用
回调形式 通过 .value 获取相应的值

import { useRef, useEffect } from 'react'
export default function MyRefs() {let myRef2 = ''const setRef = (e) => {myRef2 = e}const getText2 = () => {console.log('===myRef2==', myRef2)console.log(myRef2.value)}return (<div><hr />{/* 第一种直接将回调写在 jsx 中 */}{/* <input type="text" ref={e => myRef2 = e} /> */}{/* 第二种 传入一个回调函数 setRef */}<input type="text" ref={setRef} /><button onClick={getText2}>测试myRef2</button></div>)
}

d、字符串形式 ref 【废弃不推荐

通过 this.refs.value 获取相应的值

export default class MyRefs extends Component{constructor() {super()this.state = {refSt: 'zifc'}}getText = () => {console.log('====', this.refs.zifc.value)}render() {return (<><div><input type="text" ref={this.state.refSt}></input><button onClick={this.getText}>按钮</button></div></>)}
}

4、注意事项:推荐使用函数式组件useRef() 创建 ref

4.1、ref 变化时候,不会自动更新视图;
4.2、不能在渲染期间 对 ref 进行读写 current 的值,否则报错;如果需要在渲染期间 进行读写,需要修改为 state 属性,使用 其 set 方法进行更新;
4.3、可以在渲染 过程之外 对 ref 的值进行修改;

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

相关文章:

  • 工程企业需要什么样的物资管理系统?为什么需要物资管理系统?
  • 基于网页的大语言模型聊天机器人
  • 深入理解索引(一)
  • 动态规划子数组系列一>最长湍流子数组
  • MATLAB矩阵元素的修改及删除
  • 对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
  • ubuntu搭建k8s环境详细教程
  • ubuntu安装Eclipse
  • C#里怎么样使用线程暂停?
  • 畅听FM 3.0.0 | 很有果味的电台软件,超多FM电台,支持播放本地音乐
  • 力扣面试经典 150(上)
  • 鸿蒙开发-音视频
  • 第一个autogen与docker项目
  • 第三十四篇 MobileNetV1、V2、V3模型解析
  • Python学习——字符串操作方法
  • 力扣—15.三数之和
  • 容器安全检测和渗透测试工具
  • sqlite3自动删除数据的两种设置方式记录
  • Hive分桶超详细!!!
  • 【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)
  • Android mk/bp构建工具介绍
  • 数据源及分层开发
  • 气膜场馆照明设计:科技与环保的完美结合—轻空间
  • 并行IO接口8255
  • Level DB --- SkipList
  • 第二十二周机器学习笔记:动手深度学习之——线性代数
  • leetcode 50个简单和中等难度的题
  • 多模态大模型(5)--LLaVA
  • Vue实训---3-element plus的使用与布局
  • TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型