一 在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:跳转引用的更多相关文章

  1. React + TypeScript:元素引用的传递

    React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...

  2. React路由 + 绝对路径引用

    路由: 哈希路由(在url地址后加   #name) // 实现页面监听 window.onhashchange = function(){ console.log(‘hash:’,window.lo ...

  3. React Ref 和 React forwardRef

    Ref 和Dom,Ref是reference(引用)的简写. 能力:大多数情况下,props前递可以解决一切问题,但是依然有需要触达React实例或者Dom节点的情况,这时候应该使用React Ref ...

  4. react之本地图片引用

    react之本地图片引用 <img src="../images/photo.png"/> 这种写法在react中是不支持的,所以引用本地图片需要用import或者re ...

  5. refs转发 React.forwardRef

    2020-04-01 refs转发 前几天刚总结完ref&DOM之间的关系,并且想通了3种ref的绑定方式 今天总结一下refs转发 这是react中一直困扰我的一个点 示例: 输入: wor ...

  6. React Hooks & react forwardRef hooks & useReducer

    React Hooks & react forwardref hooks & useReducer react how to call child component method i ...

  7. react界面跳转,滚动到顶部

    在使用react-router-dom时,我们经常会遇到路由切换时滚动到浏览器顶部的问题. 滚动到顶部 Scroll to top 很多时候我们需要的是滚动到顶部“Scroll to top”,因为发 ...

  8. react 或 vue 中引用 jQuery 插件

    前言 今天与遇到一个令人抓狂的事情, 因为项目中有个交互太过于复杂而且冷门, 没有人封装类似react-swiper那种的移植过来的插件 只有现成的jQuery插件. 而时间并不宽裕,自己重写成rea ...

  9. vue 和 react 路由跳转和传参

                      react  1 .跳转方式加传参 this.props.history.push({ //地址 pathname: '/film/Details', //路由传参 ...

随机推荐

  1. 面向对象版Tab栏切换

    <div class="wrapper" id="wrapper"> <ul class="tab" id="t ...

  2. Java Lambda expression

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...

  3. Django基础模板层(75-76)

    Django框架之模板层(d75)一 模版语法之变量: ** locals() 会把*该*视图函数内的变量,传到模板    ** return render(request, 'index.html' ...

  4. spring入门 依赖入注的三种方式(1)

    第一种:构造器参数注入 第二种:setter方法属性注入(setter方法的规范-JavaBean规范) 第三种:接口注入 Bean 属性的注入:对一个对象的属性的赋值 1.构造器参数注入: publ ...

  5. SOD框架的Model、连接数据库及增删改查

    using PWMIS.DataMap.Entity; using System; using System.Collections.Generic; using System.Linq; using ...

  6. 同一台PC,配置多个同一存储平台下的Git账号【两个码云账号,配置在同一台PC上】

    问题:配置完 SSH Key, 使用[http地址]拉取代码异常.报一些没有权限的问题. 原因:配置多个gitee账号(码云)后.拉取代码时,应使用~.ssh/config中Host地址,而不是码云给 ...

  7. Oracle数据库中OVER()函数的了解

    1.over函数介绍:      开窗函数,Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. ...

  8. scrapy爬去京东书籍信息

    # -*- coding: utf-8 -*- import scrapy import urllib import json from copy import deepcopy class JdSp ...

  9. (error) LOADING Redis is loading the dataset in memory

    redis读取/重启之后读取报错:(error) LOADING Redis is loading the dataset in memory 1.redis将之持久化的数据重新写入,等待数据写入完成 ...

  10. supergridcontrol记录,分页

    sqlserver分页记录 select top 50 DengJiBH,sSuoYouQuanShenQingRen,sZuoLuo,sQiuHao,sQuanHao,ChaXun_BianHao, ...