如何使用 React.createRef() 在 React 中访问多个 Dom 元素

Posted

技术标签:

【中文标题】如何使用 React.createRef() 在 React 中访问多个 Dom 元素【英文标题】:How to access more than one element of Dom in react using React.createRef() 【发布时间】:2020-08-24 23:31:57 【问题描述】:

我知道如何使用 React.createRef() 访问 dom 的单个元素。但我想使用 createRef 访问两个不同的元素。我在***上看到了一些用于动态访问多个元素但无法理解的示例。我在这里附上了我想要更改按钮的span标签onClick的背景颜色的简单代码。 我跟着这个反应文档。有人可以指导我,我在这里做错了什么。

class TodoApp extends React.Component 
  constructor(props) 
    super(props)
    // this.myRef = React.createRef();
    this.textInput = null;

    this.state = 
      fname:""
    
  

  setTextInputRef = element => 
    console.log("element",element);
    this.textInput = element;
  ;

green = () =>
  console.log("green ",this.textInput);
  /*   this.textInput.current.style.backgroundColor = "green"; */
  this.textInput.style.backgroundColor = "green";


red = () =>
  console.log("red ",this.textInput);
  /*   this.textInput.current.style.backgroundColor = "red"; */
  this.textInput.style.backgroundColor = "red";


  render() 
    return (
      <div>
      /* 
      <span id="green" ref=input =>  this.setTextInputRef = input; >Green</span><br/>
      <span id="red" ref=input =>  this.setTextInputRef = input; >Red</span><br/> 
      */
      <span id="green" ref=this.setTextInputRef>Green</span><br/>
      <span id="red" ref=this.setTextInputRef>Red</span><br/>
      <button onClick=this.green>For Green</button><br/>
      <button onClick=this.red>For Red</button><br/>
      </div>
    )
  


ReactDOM.render(<TodoApp />, document.querySelector("#app"))

在上面的代码中,如果用户点击 btn,那么相应的跨度颜色应该会改变。

我们将不胜感激。

here is jsfiddle for more info

【问题讨论】:

为什么不设置按钮点击状态,并将样式作为道具传递给&lt;span&gt;s? DOM 引用是反应式编程的最后手段。 实际上我正在寻找如何使用 creareRef 访问多个元素。 【参考方案1】:

如果渲染的元素是静态的,您可以在构造函数中创建多个引用并使用 this.myRef.current 访问元素

您的 createRef 代码如下所示

import React from "react";
import "./styles.css";

export default class TodoApp extends React.Component 
  constructor(props) 
    super(props);
    this.greenInputRef = React.createRef();
    this.redInputRef = React.createRef();
    this.state = 
      fname: ""
    ;
  

  green = () => 
    console.log("green ", this.textInput);
    /*   this.textInput.current.style.backgroundColor = "green"; */
    this.greenInputRef.current.style.backgroundColor = "green";
  ;

  red = () => 
    console.log("red ", this.textInput);
    /*   this.textInput.current.style.backgroundColor = "red"; */
    this.redInputRef.current.style.backgroundColor = "red";
  ;

  render() 
    return (
      <div>
        /* 
      <span id="green" ref=input =>  this.setTextInputRef = input; >Green</span><br/>
      <span id="red" ref=input =>  this.setTextInputRef = input; >Red</span><br/> 
      */
        <span id="green" ref=this.greenInputRef>
          Green
        </span>
        <br />
        <span id="red" ref=this.redInputRef>
          Red
        </span>
        <br />
        <button onClick=this.green>For Green</button>
        <br />
        <button onClick=this.red>For Red</button>
        <br />
      </div>
    );
  

Working Demo

如果你通过循环来动态渲染代码sn-p,你可以通过以下方式创建ref

constructor(props) 
   super(props);

   props.data.forEach(item => 
      this[`dataRef$item.id] = React.createRef();
   )
  

...
render() 
   return (
       <div>
        
           data.map(item => 
              <p ref=this[`dataRefitem.id]>item.name</p>
           )
         
       </div>
   )

【讨论】:

感谢@Shubham 非常感谢您的时间。我怀疑如果我想要两个或三个以上的静态元素,为每个 dom 元素创建多个 React.createRef() 实例是否正确?或者这是静态元素渲染的唯一方法。 您确实需要创建与要访问的组件一样多的引用。牢记虚拟 DOM,没有其他替代方法可以访问元素。但是,您必须尽可能避免使用 refs

以上是关于如何使用 React.createRef() 在 React 中访问多个 Dom 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Flow 与 React.createRef() 一起使用?

在带有 typescript 的 react-native 中使用 createRef?

React 中ref的 React.createRef() 方法

React createRef 不可分配给 React Native Actions Sheet ref prop 中的 MutableRefObject 类型

[OHIF-Viewers]医疗数字阅片-医学影像-REACT-React.createRef()-Refs and the DOM关于回调 refs 的说明

[react ] TextArea 光标定位到最后