react中ref、createRef、React.forwardRef分别是什么?如何使用?

一、react中ref、createRef、React.forwardRef

(1)Ref 转发是一项将 ref 自动地通过组件传递到其一子组件的技巧。对于大多数应用中的组件来说,这通常不是必需的。但其对某些组件,尤其是可重用的组件库是很有用的。
(2)React.forwardRef(render)的返回值是react组件,接收的参数是一个 render函数,函数签名为render(props, ref),第二个参数将其接受的 ref 属性转发到render返回的组件中。
这项技术并不常见,但在以下两种场景中特别有用:
1)转发 ref 到组件内部的DOM 节点上
2)在高阶组件中转发ref
现在有这样一个场景,我需要得到一个dom元素的值(不使用useState),需要使用一个类组件的方法,需要操作一个函数组件中的dom元素,那么应该怎么做呢?

1. 通过ref操作dom元素或者获取dom元素的值

思路流程及代码如下(示例):(当然,一般操作dom经常用useRef来初始化)

import React from 'react'
import { ReactDOM } from 'react-dom'
//  一、通过ref操作dom元素或者获取dom元素的值
class Form extends React.Component {
  constructor(props) {
    super(props)
    //1.声明ref方法,实际上是得到{current:null}
    this.firstInputRef = React.createRef(null)
    this.secondInputRef = React.createRef(null)
    this.resultInputRef = React.createRef(null)
  }
  onClickAdd = () => {//3.此时InputRef下的current就是dom元素了,
                      //调current可以直接使用dom元素的value了
    this.resultInputRef.current.value = this.firstInputRef.current.value + this.secondInputRef.current.value
  }
  render () {
    return (
      <div>
        {/* 2.渲染时,把current.null(inputRef)给这个ref,ref挂载到dom元素上,
         //此时null替换成了对应的dom元素 */}
        <input type="text" ref={this.firstInputRef} />
        <span> + </span>
        <input type="text" ref={this.secondInputRef} />
        <button onClick={this.onClickAdd}> = </button>
        <input type="text" ref={this.resultInputRef} />
      </div>
    )
  }
}

2. 通过ref操作类组件实例来获取类组件的方法或者操作类组件

思路流程及代码如下(示例):

import React from 'react'
import { ReactDOM } from 'react-dom'
//  二、通过ref操作类组件实例来获取类组件的方法或者操作类组件
class Form extends React.Component {
  constructor(props) {
    super(props)
    //1.声明ref方法,实际上是得到{current:null}
    this.inputRef = React.createRef(null)

  }
  //3.此时inputRef下的current就是Input类组件实例,因为是Input类实例,
  //所以可以使用实例下的方法(onFocus1,此方法有可以聚焦focus())
  onFocus = () => {
    this.inputRef.current.focus()
  }
  render () {
    return (
      <div>
        {/* 2.渲染时,把current.null(inputRef)给这个ref,
        ref挂载到Input类组件实例ref属性上,此时null替换成了类的实例 */}
        <Input type="text" ref={this.inputRef} />
        <button onClick={this.onFocus}>聚焦</button>
      </div>
    )
  }
}
//类组件Input
class Input extends React.Component {
  constructor(props) {
    super(props)
    //4.声明ref方法,实际上是得到{current:null}
    this.InputRef = React.createRef(null)

  }
  onFocus1 = () => {//6.此时InputRef下的current就是dom元素了,可以直接使用dom元素的聚焦方法了
      this.InputRef.current.focus();
  }
  render () {
    return (
      <div>
        {/* 5.渲染时,把current.null(InputRef)给这个ref,
        ref挂载到dom元素上,此时null替换成了对应的dom元素 */}
        <input type="text" ref={this.InputRef} />
      </div>
    )
  }
}

3. 通过ref操作函数式组件

思路流程及代码如下(示例):

import React from 'react'
import { ReactDOM } from 'react-dom'
//  三、通过ref操作函数式组件
class Form extends React.Component {
  constructor(props) {
    super(props)
    //1.声明ref方法,实际上是得到{current:null}
    this.inputRef = React.createRef(null)

  }
  //4.此时inputRef下的current就是Input函数式组件,
  //Input函数式组件可以通过ref拿到dom元素,然后就可以调用真实dom元素聚焦方法
  onFocus = () => {
    this.inputRef.current.focus()
  }
  render () {
    return (
      <div>
        {/* 2.渲染时,把current.null(inputRef)给这个ref,
        ref挂载到Iput函数式组件上,此时null替换成了函数式组件 */}
        <Input type="text" ref={this.inputRef} />
        <button onClick={this.onFocus}>聚焦</button>
      </div>
    )
  }
}
//函数式组件,必须使用React.forwardRef()包裹
const Iuput =React.forwardRef((props,ref)=>{
  return (
    <div>
      {/* 3.渲染时,React.forwardRef()将ref向下传递,传递到函数式组件ref上,
      此时null替换成了对应的dom元素 */}
      <input type="text" ref={ref} />
    </div>
  )
})

父组件操作子组件的ref,操作子组件的dom
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

定位算法工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值