首页 > 其他分享 >React 中 Ref 引用

React 中 Ref 引用

时间:2023-11-29 16:22:17浏览次数:32  
标签:Ref Component mytext React forwardRef 引用 组件 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:

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>
    );
})

标签:Ref,Component,mytext,React,forwardRef,引用,组件,ref
From: https://www.cnblogs.com/hubert-style/p/17865169.html

相关文章

  • LLM面面观之Prefix LM vs Causal LM
    1.背景关于PrefixLM和CausalLM的区别,本qiang在网上逛了一翻,发现多数客官只给出了结论,但对于懵懵的本qiang,结果仍是懵懵...因此,消遣了多半天,从原理及出处,交出了PrefixLM和CausalLM两者区别的更为清楚的说明。2.PrefixLMPrefixLM,即前缀语言模型,该结构是Google的T5模型论......
  • vue3 reactive对象的watch
    代码<scriptsetup>import{ref,reactive,watch}from'vue'constobj=reactive({count:0})constyourKnow0=ref('')constyourKnow1=ref('')letcnt=0watch(obj,(newValue,oldValue)=>{//在嵌套的属性变更时触发......
  • react native FlatList 下拉加载更多分页数据
    一.官方文档flatlist文档onendreached方法二、相关代码importReact,{useState,useEffect}from'react';import{View,FlatList,Text,ActivityIndicator}from'react-native';constMyFlatListWithLoadMore=()=>{const[data,setData]=u......
  • C#中的ref关键字
    值参数(ValueParameters)1、传递的是参数的值(数据的副本)而不是原始数据本身。2、函数内部对值参数的修改不会影响到原始数据。3、通常用于传递基本数据类型(如整数、浮点数、布尔值)或不可变对象(如字符串、元组)。4、值参数的传递是一种传值调用(CallbyValue)。示例代码  in......
  • 使用React+SpringBoot开发一个协同编辑的表格文档
    本文由葡萄城技术团队发布。转载请注明出处:[葡萄城官网],葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求。通过协同编辑,多个用户可以同时对同一个文档进行编辑和更新,从而提高工作效......
  • 使用React+SpringBoot开发一个协同编辑的表格文档
    本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言随着云计算和团队协作的兴起,协同编辑成为了许多企业和组织中必不可少的需求。通过协同编辑,多个用户可以同时对同一个文档进行编辑和更新,从而提高工作效......
  • Day20.模块的介绍_导入发生三件事_引用强调一_引用强调二_导入多个模块和规范_导入模
    1.模块的介绍:2.首次导入发生的三件事:3.引用强调一:4.引用强调二:5.导入多个模块和导入规范:6.导入模块的其他知识点: ......
  • emscripten 中c 代码引用外部js 函数
    主要是一个简单的学习,webassebly支持通过import调用环境的函数(比如调用浏览器或者nodejs中的一些方法)简单说明方法很多,包含了emscripten提供的调用js的宏,但是以下使用了一个emscripten提供的--js-library功能--js-library简单说明--js-library主要是实现emcc在编......
  • 字段初始化无法引用非静态字段,原因
    原文链接:https://blog.csdn.net/lishimin1012/article/details/828010941》C#语法规则:在 C# 中不允许使用未初始化的变量。2》属性内存和变量内存的分配的时间不一样。 属性是用的时候分配,而变量是在类初始化时候分配。3》在实例一个类时,因为静态字段赋值动作已经在静态构造......
  • React学习三:Redux和ReactRouter
    Reduxredux是一个仓库,用来存储数据。当react中多个组件需要用到同一个数据时,如果我们一次次地请求会比较麻烦,也会加大服务器的压力。这种多组件用到的数据就可以存放到redux仓库中。redux仓库使用原生的依赖创建比较繁琐,为了更快创建使用"@reduxjs/toolkit"这个依赖包。创建好的......