React 中 Ref 引用

这篇具有很好参考价值的文章主要介绍了React 中 Ref 引用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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:文章来源地址https://www.toymoban.com/news/detail-747470.html

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 引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React:高阶组件|ref转发

            参考文档:高阶组件 – React (reactjs.org)         高阶组件(Higher-Order Components,简称  HOC )是React中用于复用组件逻辑的一种高级技巧。具体而言: 高阶组件是参数为组件,返回值为新组件的函数 。         组件是将 props 转换为 UI,而高阶组件是将组件转换

    2024年02月21日
    浏览(44)
  • 【实战】React 实战项目常见报错 —— 直接使用 ref, 报错:react can not set ref string for ...

    react 中直接使用 ref, 报错: Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。 Refs 是一种非常特殊的属性,你可以用来绑定到 render() 输出的任何组件上去。这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以

    2024年02月09日
    浏览(38)
  • React V6的ref操作

    功能介绍 实现类似vue的ref,使用ref拿到dom,然后做一些事情。react的ref和vue3.x的ref使用方式十分相似,准确的说是vue3.x像react。。ref等号后面命名需要和const 定义的变量名一致。 代码实现 比如我有一个图表组件,想要通过一个按钮去重置他重置

    2024年02月11日
    浏览(50)
  • React 18 使用 ref 操作 DOM

    参考文章 由于 React 会自动处理更新 DOM 以匹配渲染输出,因此在组件中通常不需要操作 DOM。但是,有时可能需要访问由 React 管理的 DOM 元素 —— 例如,让一个节点获得焦点、滚动它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情,所以需要一个指向 DOM 节点

    2024年02月10日
    浏览(41)
  • 浅谈React中的ref和useRef

    目录 什么是useRef? 使用 ref 访问 DOM 元素 Ref和useRef之间的区别 Ref和useRef的使用案例 善用工具 结论 在各种  JavaScript  库和框架中, React  因其开发人员友好性和支持性而得到认可。 大多数开发人员发现  React  非常舒适且可扩展,因为它提供了钩子。钩子是  React  附带的

    2024年02月14日
    浏览(30)
  • 因为懒得百度,我选择自己写篇博文教自己配置JAVA环境

    1.首先是准备施法材料 JDK的下载地址:https://www.oracle.com/java/technologies/downloads/ 然后选择自己的想要的版本和英雄(系统) 选择x64 Compressed Archive免安装版本进行下载(解压就用,免除疯狂确认的烦恼) 解压到某个位置就好,这里我创建了一个JDK文件夹,为了以后切换版本时,

    2024年02月05日
    浏览(35)
  • react通过ref获取函数子组件实例方法

    在react16之后带来了hooks之后,确实方便了很多组件开发,也加快了函数式编程的速度,但是当你通过useRef获取子组件的时候,又恰好子组件是一个函数组件,那么将会报一个错误:报这个错误的主要原因是函数组件没有实例对象,所以你没办法通过ref获取子组件实例  Warnin

    2024年02月11日
    浏览(39)
  • React 事件处理 ( this问题 参数传递 ref)

    React事件的命名采用小驼峰方式(cameCase),而不是小写 使用JSX语法时你需要传入一个函数作为事件处理函数,而不是一个字符串 你不能通过返回false 的方式阻止默认行为。你必须显示式的使用preventDefault 需要谨慎对待JSX回调函数中的this可以使用: ● 公共属性(剪头函数)

    2024年02月22日
    浏览(43)
  • 【设计模式】以国足的例子来解释代理模式,希望自己不要被退钱

    通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真是对象的一个替身,这种机制被称为代理模式。通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。 代理模式 :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模

    2024年02月21日
    浏览(31)
  • 程序员痛心流涕自述:“因为把自己代码给了别人,我亲手断送了自己的前程”

    在求职的过程中,一般都会有投递简历、笔试、面试以及背调的环节,而在这几个环节中折戟沉沙的人也着实不少。 不少人觉得,在求职时简历需要优化,背调不能有瞒报、捏造的情况,而笔试面试则是纯纯的要靠硬实力。 虽然说笔面试靠的是实力, 但还是有不少人还是存

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包