React forwardRef:跳转引用
一 在DOM组件中使用
import React, { Component } from 'react';
// 跳转引用对象本身并不关心ref,而是由渲染函数转发ref
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
class App extends Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
click() {
this.myRef.current.focus();
console.log(this.myRef.current.innerHTML)
}
render() {
return (
<div>
<FancyButton ref={this.myRef}>光彩夺目的按钮</FancyButton>
<div onClick={this.click.bind(this)}>点击我</div>
</div>
);
}
}
export default App;
二 在高阶组件中使用
1 app.js
import React, { Component } from 'react';
import FancyButton from './fancyButton.jsx';
class App extends Component {
constructor(props) {
super(props);
this.btnRef = React.createRef(); // 创建引用对象
}
click(){
this.btnRef.current.print();
}
render() {
return (
<div>
<FancyButton ref={this.btnRef} />
<div onClick={this.click.bind(this)}>点击</div>
</div>
);
}
}
export default App;
2 logProps.js
import React from 'react';
export default function logProps(Component) {
// 高阶组件
class LogProps extends React.Component {
componentDidUpdate(prevProps) {
console.log('old props:', prevProps);
console.log('new props:', this.props);
}
render() {
const { myForwardRef, ...rest } = this.props;
// 引用对象的current属性指向被包裹组件
return <Component ref={myForwardRef} {...rest} />;
}
}
// 将高阶组件包裹在跳转引用对象中。
return React.forwardRef((props, ref) => {
// 将ref属性转换成高阶组件的自定义属性,将引用对象转移到了高阶组件的props属性中。
// 防止React自动处理组件的ref属性。
return <LogProps {...props} myForwardRef={ref} />;
});
}
3 fancyButton.js
import React, { Component } from 'react';
import logProps from './logProps.jsx';
class FancyButton extends Component {
print(){
console.log('色彩夺目的按钮');
}
render() {
return <button>色彩夺目的按钮</button>
}
}
export default logProps(FancyButton);
三 原理
1 React.forwardRef函数,只是创建一个跳转引用对象。

2 跳转引用对象(对象)也可以用作JSX语法的标签名,作用与组件(类)类似。但主要作用是提供渲染函数,转发props和ref。
3 React会在合适的时机,自动调用跳转引用对象的render方法,获取ReactElement。
React forwardRef:跳转引用的更多相关文章
- React + TypeScript:元素引用的传递
React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...
- React路由 + 绝对路径引用
路由: 哈希路由(在url地址后加 #name) // 实现页面监听 window.onhashchange = function(){ console.log(‘hash:’,window.lo ...
- React Ref 和 React forwardRef
Ref 和Dom,Ref是reference(引用)的简写. 能力:大多数情况下,props前递可以解决一切问题,但是依然有需要触达React实例或者Dom节点的情况,这时候应该使用React Ref ...
- react之本地图片引用
react之本地图片引用 <img src="../images/photo.png"/> 这种写法在react中是不支持的,所以引用本地图片需要用import或者re ...
- refs转发 React.forwardRef
2020-04-01 refs转发 前几天刚总结完ref&DOM之间的关系,并且想通了3种ref的绑定方式 今天总结一下refs转发 这是react中一直困扰我的一个点 示例: 输入: wor ...
- React Hooks & react forwardRef hooks & useReducer
React Hooks & react forwardref hooks & useReducer react how to call child component method i ...
- react界面跳转,滚动到顶部
在使用react-router-dom时,我们经常会遇到路由切换时滚动到浏览器顶部的问题. 滚动到顶部 Scroll to top 很多时候我们需要的是滚动到顶部“Scroll to top”,因为发 ...
- react 或 vue 中引用 jQuery 插件
前言 今天与遇到一个令人抓狂的事情, 因为项目中有个交互太过于复杂而且冷门, 没有人封装类似react-swiper那种的移植过来的插件 只有现成的jQuery插件. 而时间并不宽裕,自己重写成rea ...
- vue 和 react 路由跳转和传参
react 1 .跳转方式加传参 this.props.history.push({ //地址 pathname: '/film/Details', //路由传参 ...
随机推荐
- Rhel6.5 相关操作
Rhel 将光盘挂载动作 操作部分1 挂载光盘 https://jingyan.baidu.com/article/e52e3615a9c19440c60c5121.html ls -l /dev | ...
- python SSH客户端的交互式和非交互方式
使用python中有一个paramiko模块来实现python SSH客户端,与SSH服务器交互时,需要注意有交互式和非交互式的区别. 只执行单条命令,之后就断开链接,可以使用非交互方式.执行多条命令 ...
- hdfs知识点《转》
HDFS知识点总结 学习完Hadoop权威指南有一段时间了,现在再回顾和总结一下HDFS的知识点. 1.HDFS的设计 HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Dist ...
- Python中随机森林的实现与解释
使用像Scikit-Learn这样的库,现在很容易在Python中实现数百种机器学习算法.这很容易,我们通常不需要任何关于模型如何工作的潜在知识来使用它.虽然不需要了解所有细节,但了解机器学习模型是如 ...
- gunicorn开启、关闭和重启
1.gunicorn开启 在项目的根目录下,输入下方的代码. gunicorn --bind unix:/tmp/域名.socket projectname.wsgi:application 2.查询 ...
- 分布式系统session同步解决方案
来源:架构师之路 session的概念 什么是session? 当浏览器端第一次访问web server时,server端会调用getSession()方法创建session对象,经过特殊算法计算出s ...
- idea 炫酷插件
1.插件的安装 打开setting文件选择Plugins选项 Ctrl + Alt + S File -> Setting 分别是安装JetBrains插件,第三方插件,本地已下载的插件包.详情 ...
- darknet训练yolov3时的一些注意事项
训练需要用到的文件: 1) .data文件.该文件包含一些配置信息,具体为训练的总类别数,训练数据和验证数据的路径,类别名称,模型存放路径等. 例如coco.data classes= 8 ...
- qt button clicked(bool) always false
今天用 qt 中的按键的时候,希望按键有两种状态,通过 clicked(bool) 发送信号给槽,结果一直发的是 false,不能为 true,后来终于找到问题了,有两种解决方法. 在 button ...
- Jmeter5.1.1构造https请求
1.打开浏览器,输入https的网址 2.点开浏览器前面的小锁 3.点开证书.详细信息.复制到文件 把证书保存到本地电脑 4.利用jdk中的keytool.exe工具,重新生成证书 C:\Java\j ...