如何在for循环中设置react ref

Posted

技术标签:

【中文标题】如何在for循环中设置react ref【英文标题】:How to set react ref in a for loop 【发布时间】:2021-07-29 22:29:55 【问题描述】:

我有一个“fileUpload”组件,我将它传递到我的 React 应用程序中的表单中。

我希望能够为我的 for 循环中的每个输入元素设置一个唯一的 ref,然后将此 ref 传递给删除按钮以删除文件。

文件上传组件

const FileUpload = ( addFile, runClick ) => 
          const uploadButton = [];
          const myRefs = React.useRef([]);
        
          for (let i = 1; i < 6; i += 1) 
            uploadButton.push(
              <div key=i>
                <input
                  type="file"
                  id=`file$i`
                  ref=myRefs.current[i] ?? React.createRef()
                  name=`file$i`
                  onChange=addFile
                />
                <RemoveButton type="button" onClick=() => removeFile()>
                  X buttoni
                </RemoveButton>
              </div>
            );
          
    
      return uploadButton;
    ;
    
    export default FileUpload;

表单组件

//在不使用 FileUploadComponent 和手动设置/传递 ref 的情况下工作

<InputField className="col">
        <input
          type="file"
          id="file3"
          name="file3"
          ref=ref3
          onChange=addFile
        />
        <RemoveButton type="button" onClick=() => removeFile(ref3)>
          X
        </RemoveButton>
      </InputField>

// 尝试自动分配 ref 并传递给删除按钮

<InputField className="col">
    <FileUpload addFile=addFile runClick=() => removeFile() />
  </InputField>

【问题讨论】:

这能回答你的问题吗? How to deal with a ref within a loop? 【参考方案1】:

你可以在循环之前创建一个引用数组,使用Array.fill()

const myRefs = useRef(new Array(6).fill(createRef()));

并在循环中使用它:

<input type="file" ref=myRefs[i]/>

【讨论】:

我可以看到正在创建的 refs,但不确定这是否允许我将相同的值传递给 removeFile 点击事件 runClick( myRefs[i])> 然后传递给 runClick=i => runClick(i) 我在函数中看不到它们 const runClick = i => console.log('run click', i); ;

以上是关于如何在for循环中设置react ref的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 的地图中使用 for 循环 [重复]

如何在react.js 中利用for循环之类的输出html

如何使用 for 循环在 React 中的地图上渲染标记?

在React native 如何写if判断和for循环

[react] 写例子说明React如何在JSX中实现for循环

如何在 React Native 中的循环中查找