不要因为别人的评价而改变自己的想法,因为你的生活是你自己的。

1. React 中 Ref 的应用

1.1 给标签设置 ref

给标签设置 ref,ref="username", 通过 this.refs.username 可以获取引用的标签,ref 可以获取到应用的真实 Dom 节点。但是 this.refs 已被废弃。

import React, { Component } from "react";

class App extends Component {
render() {
return (
<div>
<input ref="oref"/>
<button onClick={ ()=>{ console.log("value:", this.refs.oref.value) } }>Add</button>
</div>
)
}
} export default App;

1.2 给组件设置 ref

同上标签设置 ref 给组件设置 ref 也保持一致,ref="username", 通过 this.refs.username 可以获取到组件对象。

1.3 新的语法设置 ref

通过定义一个引用属性 myRef = React.createRef(),通过 this.myRef.current 可以获取到标签的真实 Dom 节点以及对应的组件对象。

import React, { Component } from "react";

class App extends Component {

  myRef = React.createRef()

  render() {
return (
<div>
<div>
<input ref="oref"/>
<button onClick={ ()=>{ console.log("value:", this.refs.oref.value) } }>Add1</button>
</div>
<div>
<input ref={ this.myRef } />
<button onClick={ ()=>{ console.log("value:", this.myRef.current.value) } }>Add2</button>
</div>
</div>
)
}
} export default App;

2. 引用传送 forwardRef

引用传送(Ref forwarding)是一种通过组件向子组件自动传递引用 ref 并可以转发 ref 属性的技术。当父组件需要得到子组件的元素时,可以利用 forwardRef 来实现。

React.forwardRef 会创建一个 React 组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。

对于应用者的大多数组件来说没什么作用。但是对于有些重复使用的组件,可能有用。例如某些 input 组件,需要控制其 focus,本来是可以使用 ref 来控制,但是因为该 input 已被包裹在组件中,这时就需要使用 Ref forward 来透过组件获得input 的引用,可以透传多层。

应用场景:

ref 的作用是获取实例,可能是 DOM 实例,也可能是 ClassComponent 的实例。

为什么需要 forwardRef,我们看一个 React 报错:

Warning: Function components cannot be given refs.
Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

大致的意思是,函数组件不能直接通过 useRef 引用,应该使用 React.forwardRef 对函数组件进行包裹在进行引用。

一个 Function Component,是没有实例的(PureComponent),此时用 ref 去传递会报错。

React.forwardRef 会创建一个 React 组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见,但在以下两种场景中特别有用:

  • 转发 refs 到 DOM 组件;
  • 在高阶组件中转发 refs;

此时 React 会将外部 ref,当做参数进行传入,我们就可以将 ref 放入到我们要引用的对象上面。

注意: React 并没有将外部 ref 属性放入 props 中。

普通用法:

import React, { Component } from 'react'

export default class App extends Component {
mytext=null
render() {
return (
<div>
<button type="button" onClick={()=>{
console.log(this.mytext);
this.mytext.current.focus()
this.mytext.current.value="2222"
}}>获取焦点</button>
<Child callback={(el)=>{
console.log(el);、
//el是临时变量,用全局的去接这个值
this.mytext=el
//console.log(el.current);
}}/>
</div>
)
}
} class Child extends Component {
mytext = React.createRef();
//组件渲染完了执行
componentDidMount() {
this.props.callback(this.mytext);
}
render() {
return (
<div style={{background:"yellow"}}>
<input defaultValue="1111" ref={this.mytext}></input>
</div>
);
}
}

使用 forwardRef:

import React, { Component,forwardRef } from 'react'

export default class App_forwardRef extends Component {
mytext=React.createRef()
render() {
return (
<div>
<button type="button" onClick={()=>{
console.log(this.mytext);
this.mytext.current.value="2222"
}}>获取焦点</button>
<Child ref={this.mytext}/>
</div>
)
}
}
// 这里Child是函数式组件
// 1、当我们试图给函数式组件给予ref属性的时候,会发现并不支持;
// 2、此时需要将子组件用forwardRef进行包裹,它的第二个参数即为我们所需要的元素,当拿到子组件元素的时候,则父组件可以利用此元素对子组件进行操作;
const Child=forwardRef((props,ref)=>{
return (
<div>
<input defaultValue="11111" ref={ref}></input>
</div>
);
})

React 中 Ref 引用的更多相关文章

  1. React中Ref 的使用 React-踩坑记_05

    React中Ref 的使用 React v16.6.3 在典型的React数据流中,props是父组件与其子组件交互的唯一方式.要修改子项,请使用new props 重新呈现它.但是,在某些情况下,需 ...

  2. React中ref的使用方法

    React中ref的使用方法 在react典型的数据流中,props传递是父子组件交互的唯一方式:通过传递一个新的props值来使子组件重新re-render,从而达到父子组件通信.当然,就像reac ...

  3. React中ref的用法

    在React数据流中,父子组件唯一的通信方式是通过props属性:那么如果有些场景需要获取某一个真实的DOM元素来交互,这时候就要用到React的refs属性. 1.可以给DOM元素添加ref属性 c ...

  4. React中ref的三种用法 可以用来获取表单中的值 这一种类似document.getXXId的方式

    import React, { Component } from "react" export default class MyInput extends Component { ...

  5. React中ref的使用

    直接获取DOM元素时使用的,一般情况下尽量不要使用ref

  6. React中jquery引用

    安装jQuery npm i jquery -S 在那个地方使用jQuery就在什么地方引入jQuery import $ from 'jquery'

  7. react中的ref的3种方式

    2020-03-31 react中的ref的3种方式 react中ref的3种绑定方式 方式1: string类型绑定 类似于vue中的ref绑定方式,可以通过this.refs.绑定的ref的名字获 ...

  8. React Native中ref的用法(通过组件的ref属性,来获取真实的组件)

    ref是什么? ref是组件的特殊属性,组件被渲染后,指向组件的一个引用.可以通过组件的ref属性,来获取真实的组件.因为,组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,称为虚拟的DOM ...

  9. vue中:key 和react 中key={} 的作用,以及ref的特性?

    vue中:key 和react 中key={} 为了给 vue 或者react 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性 一句话概括就是 ...

  10. Fastjson-fastjson中$ref对象重复引用问题:二

    import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; import com.alib ...

随机推荐

  1. 人工智能GPT科普知识的简单总结

    人工智能GPT相关知识的简单总结 背景 工作已经很久, 工作十几年来有过好多波新的技术浪潮. 但是每次都离技术前沿比较远. 最近发现只低头拉车是一个没有前途的行为. 人生很短, 选择很重要, 不仅要低 ...

  2. CentOS8 安装 SQLSERVER2019的简单过程

    1. 获取rpm包直接从微软官方网站即可 -rw-r--r-- 1 root root 820984 Apr 5 22:23 msodbcsql17-17.5.2.1-1.x86_64.rpm -rw ...

  3. Typescript中存取器getters和setters的使用

    1.存取器 存取器可以让我们可以有效的控制对,对象中的中的成员的访问. 可以通过getters和setters来进行操作 在typescript中分别对应 get 和 set 2.如何解决报错 typ ...

  4. @RequestBody中使用@DateTimeFormat报错:JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

    原因分析 根据异常提示:不匹配输入异常,指输入的参数错误,说是只支持String类型和Array数组类型的. @PostMapping("/test") public Dto ge ...

  5. 【JVM】JDK7后intern方法总结

    JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈. 测试代码1如下: @Test public void t ...

  6. 大语言模型的预训练4:指示学习Instruction Learning详解以及和Prompt Learning,In-content Learning区别

    大语言模型的预训练[4]:指示学习Instruction Learning:Entailment-oriented.PLM oriented.human-oriented详解以及和Prompt Lea ...

  7. Redis安装及使用详解篇

    一.什么是Redis? Redis(Remote Dictionary Server ),即远程字典服务. Redis是是现在最受欢迎的NoSQL数据库之一,是一种支持key-value等多种数据结构 ...

  8. 在Spring Cloud 2020中使用Consul配置中心遇到的问题

    升级Spring Cloud 2020后发现Consul配置中心失效了,配置中心的配置和bootstrap.yml中的配置都没有生效. 话不多说,先看官方文档:https://docs.spring. ...

  9. 手撕B树 | 二三查找树,B+树B*树你都会了吗? | 超详细的数据结构保姆级别实现

    说在前面 今天给大家带来B树系列数据结构的讲解! 博主为了这篇博客,做了很多准备,试了很多画图软件,就是为了让大家看得明白!希望大家不要吝啬一键三连啊!! 前言 那么这里博主先安利一下一些干货满满的专 ...

  10. api接口调用

    api接口调用 CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 CURL 库.使用PHP的CURL 库可以简单和有效 ...