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

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. [转帖]使用SkyWalking监控nginx (以openresty为例)

    https://www.cnblogs.com/hahaha111122222/p/15829737.html 安装使用SkyWalking先看这篇文章,地址:https://www.cnblogs. ...

  2. [转帖]【JVM】Java内存区域与OOM

    引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有 ...

  3. sed 反斜线换成正斜线

    命令为: sed -i "s:\\\:\/:g" yourfiles

  4. 使用systemd管理多nginx服务以及单nginx服务实现多vhost访问的操作步骤

    背景 nginx是开源的web服务器, 性能与可配置性和插件做的非常完善. 可以使用简单的命令拉起来nginx进行服务提供,但是有时候需要使用keepalive等软件实现保活,以及实现开启启动等,比较 ...

  5. Centos7把home目录下多余的空间转移到/根目录下

    通过df-h发现,根目录只有32G,而home目录可用的,居然有142G.我现在想分出70G给根目录 把你需要挂载的机器的逻辑卷记住(上面的图,左边是逻辑卷,右边是虚拟磁盘) /dev/mapper/ ...

  6. 我为什么从Windows转到Linux?

    本文来自读者投稿! 大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 如果文章有任何需要改善和完善的地方,欢迎在评论区指出,共同进步! 喔,看到这个标题千万不要以 ...

  7. 突破性的多语言代码大模型基CodeShell:引领AI编程新时代

    突破性的多语言代码大模型基CodeShell:北京大学与四川天府银行联合打造,引领AI编程新时代 1.CodeShell简介 CodeShell是北京大学知识计算实验室联合四川天府银行AI团队研发的多 ...

  8. Flask 框架:运用Axios库实现前后端交互

    Axios 是一个基于promise的HTTP库,该库是一个更好的替代ajax向后端发送数据或请求数据的前端组件库,其本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规 ...

  9. SpringBoot接入阿里云oss

    1.pom中添加阿里云oss坐标 <?xml version="1.0" encoding="utf-8"?> <dependencies&g ...

  10. 使用Visual studio code 进行.NET 开发

    Visual studio code 作为一款强大的编辑器,相信很多开发者都用过.vs code 的强大源自开源生态丰富,编辑器本身简单,但是加上各式的插件,就变得无比牛逼,基本可以替代现有的大部分工 ...