24 React.createRef()用法细节分析

  • 通过React.createRef → ref对象
  • 通过元素的ref属性可以附加到React元素上
  • 一般通过构造器中给this的属性赋值一个ref,方便整个组件使用
  • ref只要传递到react元素中,就可以利用ref的current属性访问到该真实DOM节点
  • ref在componentDidMount和componentDidUpdate触发前更新

current里是null的现象

  • 由于打印时,this.modalRef才刚刚声明,current是null,但是current是个引用值,展开时访问的是最后的结果
class Modal extends React.Component {constructor(props) {super(props)this.modalRef = React.createRef()console.log('刚创建时', this.modalRef)}componentDidMount() {console.log('componentDidMount', this.modalRef)}componentDidUpdate() {console.log('componentDidUpdate', this.modalRef)}render() {return (<divref={this.modalRef}style={{width: '300px',border: '1px solid #000',display: this.props.toOpen ? 'block' : 'none'}}><h1>This is a Modal</h1><p>This is a super Modal</p></div>)}
}

在这里插入图片描述

ref有不同的使用方式

  • ref放在html元素上 → current: 真实DOM
  • ref放在class组价上 → current: 组件实例
  • ref放在函数组件(没有实例)→ 无法附加到组件上
class App extends React.Component {constructor(props) {super(props)this.refInApp = React.createRef()}state = {toOpen: false,}componentDidMount() {console.log('【APP】componentDidMount', this.refInApp)}changeStatus = (toOpen) => {this.setState({toOpen})}render() {return (<><Modal toOpen={this.state.toOpen} ref={this.refInApp} /><button onClick={() => this.changeStatus(true)}>打开</button><button onClick={() => this.changeStatus(false)}>关闭</button></>)}
}

在这里插入图片描述

函数组件使用hooks获取dom实例

function Test() {const divRef = React.useRef(null)React.useEffect(() => {console.log('函数组件使用hooks获取ref', divRef)}, [])return (<div ref={divRef}>Test函数组件</div>)
}

在这里插入图片描述

  • 若试图在函数组价上传ref属性会告警
<Test ref={this.refInApp} />

在这里插入图片描述

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

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

相关文章

dart --- 环境配置

1.进入官网下载SDK http://www.gekorm.com/dart-windows/ 2.运行下载的EXE文件.下一步下一步… 3.打开小黑框,输入: dart --version VSCode关于Dart的插件: DartCode Runner 插件安装好后,需重启VSCode. 新建 index.dart,输入以下代码 main () {print("Hello Dart…

25 Refs转发机制与在高阶组件中的使用

将子节点的ref暴露给父节点 16.3以上 Refs转发&#xff0c;将ref自动通过组件传递给子组件 1. 在父组件创建ref对象 2. 给子组件赋值ref 3. 通过React.forward向子组件转发ref属性 4. 父组件的ref对象指向子组件dom 5. ref参数只有在 React.forwardRef 组件内定义时可接受con…

26 JSX深度剖析与使用技巧

React对JSX的处理 React.createElement有三个参数&#xff1a;标签类型&#xff0c;属性集合&#xff0c;子元素 JSX其实是React.createElement函数调用的语法糖 JSX → 编译 → React.createElement调用形式 class App extends React.Component {render() {return (<div cl…

javascript --- 数组实用小技巧

一个数组:[a,b,c,d,e],希望满足以下2个条件: 1.当索引在第0个位置的时候,数组为[b,c,d,e],在第1个位置的时候,数组为[a,c,d,e] … 2.若索引i 和 索引 j 的值相等,则只执行1次. 效果如下: nums [1,2,3,4] nums [1,1,1,2,2,3,4] 实现如下: let nums [1,1,1,2,2,3,4]; let le…

Http的持久连接和管线化

【要点】 1. 什么是持久连接&#xff1f; 2. 什么是管线化&#xff1f; 【总结】 1.什么是持久连接&#xff1f; (keep alive模式) HTTP1.1规定了默认保持长连接&#xff08;HTTP persistent connection &#xff0c;也有翻译为持久连接&#xff09;;数据传输完成了保持TCP连接…

dart --- 简单的闭包

首先得明白下面2点: 全局变量的特点:常驻内存,污染全局变量局部变量的特点:会被垃圾回收机制回收,不会污染作用域… // 闭包.dart void main(){myClosure(){var a 0; // a是一个局部变量.函数执行完毕后将被清理return (){a;print(a);};}var fn myClosure();fn();fn();fn()…

27 JSX函数子元素的应用与思考

JSX的props.children和props本身有部分一致的特性 props.children可以传递任何类型的子元素 // 调用子元素回调 num 次&#xff0c;来重复生成组件 function Repeat(props) {// 返回一组JSXlet items [];for (let i 0; i < props.num; i) {items.push(props.children(i));…

Cascader 级联选择器

当一个数据集合有清晰的层级结构时&#xff0c;可通过级联选择器逐级查看并选择。 基础用法 有两种触发子菜单的方式 只需为 Cascader 的options属性指定选项数组即可渲染出一个级联选择器。 通过expand-trigger可以定义展开子级菜单的触发方式。 本例还展示了change事件&#…

es6 --- String.prototype.padStart

从实际出发理解. 首先看下面代码 // js var dt new Date(); console.log(dt);下面想把时间格式化,写一个dateFormat函数 // js function dateFormat(data){var dt new Date(data);var y dt.getFullYear();var m dt. getMonth() 1;var d dt.getDate();var hh dt.getHo…

Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)

Python学习笔记_1_基础_2&#xff1a;数据运算、bytes数据类型、.pyc文件&#xff08;什么鬼&#xff09; 一、数据运算 Python数据运算感觉和C&#xff0c;Java没有太大的差异&#xff0c;百度一大堆&#xff0c;这里就不想写了。比较有意思的是三元运算&#xff0c;记得C和Ja…

javascript --- 实战中体会jsonp

准备:1.需要node环境,node环境配置 -> 百度搜索 “node环境配置” (网上太多了) node是否安装成功指令如下: 创建如下页面结构: html结构如下: // jsonp.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

2 中间件的使用、异步action的创建

react-redux是react插件 将所有组件分成两大类&#xff1a;UI组件和容器组件 安装npm install react-redux -S UI组件&#xff1a; 只负责UI的呈现&#xff0c;不带有任何业务逻辑不使用this.state所有数据都由this.props提供不使用任何Redux的API&#xff0c;不需要使用store …

1 State Hook

Hook&#xff0c;使用在函数组件中不要在循环&#xff0c;条件或嵌套函数中(if、switch、for)调用 Hook 1. 函数指向相同的引用 更新方式&#xff1a;函数组件中state变化时才重新渲染&#xff08;React使用Object.is比较算法来比较state&#xff09;&#xff1b;而类组件每次…

⊰第五篇⊱ 队列

队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIFO。允许插入的一端为队尾&#xff0c;允许删除的一端为队头。队列不…

node --- 实践中理解跨域

经常可以见到.说解决跨域只要返回加上"Access-Control-Allow-Origin"头部就行… 下面从实践中一步一步的理解. 1.环境准备: 1. node.js (http://nodejs.cn/) 自行下载配置, 完毕后(cmd)输入 node --version 若显示版本号则代表成功// ps: node(中的npm)方便下载资源…

2 Effect Hook

副作用&#xff1a;和外部有交互 引用外部变量调用外部函数修改dom、全局变量ajax计时器&#xff08;依赖window.setTimeout&#xff09;存储相关 纯函数&#xff1a;相同的输入一定会得到相同的输出 Effect Hook可以让你在函数组件中执行副作用操作 类组件中处理副作用 在com…

【JUC】CountDownLatch

因为在调用端的异步中&#xff0c;需要调用其他多个服务获取数据再汇总结果返回&#xff0c;所以用到了CountDownLatch CountDownLatch的概念 CountDownLatch是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;或者说起到线程之间的通信&#xff08;而不是用…

node --- Missing write access to 解决

今天在使用npm安装animate.css时报错… 大体原因是没有对node_modules没有写的权限. 百度查到是要删除对应的node_modules然后在安装… 但是我并不想这样做…想起前面我为了加快下载速度,好像使用的是cnpm… 于是我使用了nrm ls 查看当前使用的源 更换npm的源可以参考 https:…

vue踩坑- 报错npm ERR! cb() never called!

在vue项目中引入饿了么elementUI组件的步骤之中&#xff0c;出现以下的错误&#xff1a; D:\my-project-first>npm i element-ui -S Unhandled rejection RangeError: Maximum call stack size exceededill install loadIdealTreeat RegExp.test (<anonymous>)at D:\n…

maven之阿里云Maven镜像的使用

Maven中央仓库在国外&#xff0c;速度比较慢&#xff0c;所以我们采用国内的镜像&#xff0c;速度回有质的提升。 配置下setting.xml <mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/ne…