资讯专栏INFORMATION COLUMN

React高阶组件中使用React.forwardRef的技巧

tomlingtm / 2113人阅读

摘要:之前使用始终无法应用于高阶组件中,最近终于捣鼓出来了,于是记录下来。纯粹的高阶组件中并不是组件,只是一个组件为参数的函数,调用以后才成为组件。在的组件中,的周期调用指向的就是中对应的元素。

之前使用React.forwardRef始终无法应用于React高阶组件中,最近终于捣鼓出来了,于是记录下来。
关键点就是React.forwardRef的API中ref必须指向dom元素而不是React组件。codepen实例请划到底部。

一、React.forwardRef使用示例

下面就是应用到React组件的错误示例:

const  A=React.forwardRef((props,ref)=>)

这就是我之前经常犯的错误, 这里的ref是无法生效的。

前面提到ref必须指向dom元素,那么正确方法就应用而生:

const  A=React.forwardRef((props,ref)=>(
))

二、React.forwardRef应用到高阶组件中
2.1. withComponent类型的高阶组件【1】

import React from "react"
import A from "./a.jsx"
import PropTypes from "prop-types";

function withA(Component){
    const ForWardedComponent = React.forwardRef((props, ref) => 
); class MidComponent extends React.Component { render() { const props = this.props return ( ) } } //对MidComponent组件属性进行类型经查 MidComponent.propTypes = { forwardedRef: PropTypes.object, } return MidComponent } exports.withA=withA

这样,在上述示例的组件A中,A的周期componentDidMount() 调用 this.props.forwardedRef.current ,指向的就是上述示例中ForWardedComponent对应的dom元素。
是B组件对应的dom的父元素,而不是该dom
在a.jsx中某处:

    componentDidMount(){
     console.log(this.props.forwardedRef.current)
    }

最后应用实例:

import React from "react"
import ReactDOM from  "react-dom"
//假设withA存储于withA.js文件。
import {withA}   from  "./withA.js"  
 const B=()=>

hello world

const B2=withA(B) class App extends React.Component { constructor(props) { super(props) this.forwardedRef=React.creactRef() } render() { return
} } ReactDOM.render(,document.getElementById("app"))

2.2 纯粹的高阶组件(Parent-Child)
【1】中并不是React组件,只是一个React组件为参数的函数,调用以后才成为React组件。那么直接写入一个Parent组件又该如何呢?

import React from "react"
import A from "./a.jsx"
import PropTypes from "prop-types";

function AasParent(props){
    const ForWardedComponent = React.forwardRef((props, ref) => 
{props.children}
); return ( ) } AasParent.propTypes = { forwardedRef: PropTypes.object, } module.exports=AasParent

最后应用实例:

import React from "react"
import ReactDOM from  "react-dom"
//假设AasParent存储于AasParent.jsx文件。注意与【1】中的区别
import AasParent   from  "./AasParent.jsx"  
 const B=(props)=>

{props.greetings}

class App extends React.Component { constructor(props) { super(props) this.forwardedRef=React.creactRef() } render() { return } } ReactDOM.render(,document.getElementById("app"))

三、总结
1.React.forwardRef的API中ref必须指向dom元素而不是React组件。
2.在【1】的组件A中,A的周期componentDidMount() 调用 this.props.forwardedRef.current ,指向的就是【1】中ForWardedComponent对应的dom元素。是【1】中B组件对应的dom的父dom元素,而不是该dom。
3.codepen实例

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103779.html

相关文章

  • 如何在 React 组件正确使用 Refs指南

    摘要:通常在组件的构造函数内创建,使其在整个组件中可用。例如纯文本查看复制代码如上所示一个实例在构造函数中创建,并赋值给在方法内部,将构造函数中创建的传递给接下来,让我们看一个在组件中使用的示例。回调回调是在中使用的另一种方式。 使用 React 时,我们的默认思维方式应该是 不会强制修改 DOM ,而是通过传入 props 重新渲染组件。但是,有些情况却无法避免修改 DOM 。React ...

    Backache 评论0 收藏0
  • 02.react进阶指南

    摘要:指定读取当前的。它为其后代元素触发额外的检查和警告。严格模式检查仅在开发模式下运行它们不会影响生产构建。作用识别不安全的生命周期关于使用过时字符串的警告关于使用废弃的方法的警告检测意外的副作用检测过时的为高阶组件。 react 进阶 懒加载 React.lazy函数能让你像渲染常规组件一样处理动态引入(的组件)。Suspense加载指示器为组件做优雅降级。fallback属性接受任何在...

    zzbo 评论0 收藏0
  • React源码解析之React.createRef()/forwardRef()

    摘要:一作用获取目标的实例使用源码可修改的不可变的对象没见过这种写法初始化对象,属性初始值为解析源码比较简单,就是返回了带有属性的二作用从父组件中获取子组件是的实例使用是没有实例的,因为它是,所以没有,所以不能通过来拿到实例将的传给子组件,并绑定 showImg(https://segmentfault.com/img/remote/1460000019877636); 一、React.cr...

    aisuhua 评论0 收藏0
  • 写给自己React HOC(高阶组件)手册

    前言 HOC(高阶组件)是React中的一种组织代码的手段,而不是一个API. 这种设计模式可以复用在React组件中的代码与逻辑,因为一般来讲React组件比较容易复用渲染函数, 也就是主要负责HTML的输出. 高阶组件实际上是经过一个包装函数返回的组件,这类函数接收React组件处理传入的组件,然后返回一个新的组件. 注意:前提是建立在不修改原有组件的基础上. 文字描述太模糊,借助于官方...

    W4n9Hu1 评论0 收藏0
  • React v16.3.0: New lifecycles and context API

    摘要:为管理提供了一个新的方案,它为字符串提供了方便,并且没有任何缺点司徒正美注意除了新的外,回调将继续得到支持。例如司徒正美通常会将传递给它们包装的组件。 几天前,我们写了一篇关于即将到来的对我们的传统生命周期方法的变更的文章,包括逐步迁移策略。在React 16.3.0中,我们添加了一些新的生命周期方法来帮助迁移。我们还引入了新的API,用于长时间请求的特性:一个官方的上下文API、一个...

    zombieda 评论0 收藏0

发表评论

0条评论

tomlingtm

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<