在 React 中添加和删除 N 个文件输入

悲伤的骨头马龙

我正在构建允许用户上传 N 个数据文件的东西。为此,我添加了一个按钮,用于创建额外的文件上传选项。这是通过渲染函数中的一个简单的 for 循环完成的(有一个选择选项,只有在满足某些条件时才会出现,这是“mergeColumnSelection”变量,您可以忽略它,但我将其包括在内,以防它以某种方式结束相关):

let renderedEnrichedDataFields = [];
for(let i = 0; i < this.state.enrichedData.length; i++) {
  let mergeColumnSelection = ""
  if(this.state.enrichedData[i] !== null) {
      mergeColumnSelection = <div className="form-item__select form-item">
        <label className="form-label" htmlFor="add-target-owner">Merging Column</label>
        <div className="form-item__container">
          <select onChange={(e) => {this.setEnrichedMergeColumn(e, i)}} defaultValue={this.state.csvColumns[0]}>
            {mainDataColumns}
          </select>
        </div>
      </div>
  }

  renderedEnrichedDataFields.push(
    <div className="form-group">
      <button onClick={() => {this.removeEnrichmentData(i)}} type="button" className="modal-close">
        <Icon name="close" />
      </button>
      <div className="form-item">
      <label className="form-label" htmlFor="add-target-csv">Enrichment Dataset</label>
        <input 
          className="csv-input" 
          type="file" 
          accept="text/csv" 
          onChange={(e) => {this.acceptNewEnrichedDataFile(e, i)}} 
        />
      </div>
      {mergeColumnSelection}

    </div>
  )
}

基本上,每次按下按钮时,都会将一个新元素推送到状态中的丰富数据数组中。这会导致应用程序呈现额外的文件输入。当用户上传文件时,数组中的占位符元素将替换为文件。当用户最终提交表单时,将提交一组文件,这很好。

然而!我在获得一个干净的实现来移除这些输入字段的能力时遇到了很多麻烦。功能

removeEnrichmentData(index) {
  let enrichmentData = this.state.enrichedData
  let enrichedMergeColumns = this.state.enrichedMergeColumns;

  enrichmentData.splice(index, 1);
  enrichedMergeColumns.splice(index, 1)

  this.setState({enrichedData: enrichmentData, enrichedMergeColumns: enrichedMergeColumns});
}

正如您所看到的,这将获取所选输入的索引,然后将其从生成 for 循环的数组中拼接起来。从数组中拼接出合适的文件,文件输入个数正确。但是,显示的文件名存在问题。图片会有所帮助:

在这里您可以看到一个示例,其中有人准备上传三个文件,health、cluster 和 starbucks

在这里您可以看到一个示例,其中有人准备上传三个文件,health、cluster 和 starbucks

现在我选择从列表中删除集群项(项 2)。 它从 state 的文件列表中删除,只留下 health 和 starbucks。 然而,for 循环简单地运行两次并删除最后一个项目——这意味着健康和集群似乎是剩下的两个文件,尽管实际上它们是健康和星巴克

现在我选择从列表中删除集群项(项 2)。它从 state 的文件列表中删除,只留下 health 和 starbucks。然而,for 循环简单地运行两次并删除最后一个项目——这意味着健康和集群似乎是剩下的两个文件,尽管实际上它们是健康和星巴克

我想过将 JSX 块本身移动到 state 中,这样我就可以专门针对我想要删除的 JSX 输入元素 - 但是这种方法的成功有限,并且读到将 JSX 放入 state 是不可取的。React 并没有真正内置的方法可以轻松删除特定输入,而且我无法在文件输入中设置默认值,因此我无法轻松地将各个输入与其对应的状态联系起来。

感觉应该是这么简单的问题,我很卡。任何帮助表示赞赏!

马克森

@Miloš Rašić 是正确的 - 您最初的问题是您可能正在使用数组索引作为输入的键。因此,如果您有 10 个编号为 0...9 的输入,并且您删除了索引为 5 的输入,那么您仍在渲染键为 0..8 的项目,并且 React 认为最后一个已被删除。

根据您关于使用 UUID 的评论,听起来您正在render()方法本身中生成唯一 ID 不要那样做! 永远不要为 中的键生成随机值render()当你这样做时,你每次都告诉 React “这个项目与我们上次渲染的不同,请销毁这里现有的项目并用新项目替换它”。

相反,您应该在将新条目添加到 state 时生成这些唯一 ID 例如:

class FileInputList extends Component {
    state = { inputs : [] }

    addNewFileInput = () => {
        const inputID = uuid();
        const newInputs = this.state.inputs.concat({id : inputID});
        this.setState({inputs : newInputs});
    }

    render() {
        const {inputs} = this.state;

        const inputList = inputs.map(inputEntry) => {
            return <input type="file" key={inputEntry.id} />
        });

        return inputList;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从n个输入文件中获取最大向量MATLAB

来自分类Dev

删除文件中的n个重复行

来自分类Dev

在React中可以动态添加和删除元素吗?

来自分类Dev

向表中添加和删除数据 - React

来自分类Dev

使用 React 添加/删除输入字段

来自分类Dev

作为最后一个元素在div中添加(克隆)和删除列(输入元素)

来自分类Dev

如何忽略输入中的n个整数

来自分类Dev

如何从iOS和Android的React Native中删除文本输入中的下划线

来自分类Dev

添加和删除输入字段

来自分类Dev

如何从输入类型=文件中删除一个对象?

来自分类Dev

在ubuntu终端的目录中删除n个最大的文件

来自分类Dev

如何从目录中删除随机n个文件?

来自分类Dev

如何使用python删除目录中的n个文件

来自分类Dev

用React添加和删除分数

来自分类Dev

无法从输入React JS的搜索中删除第一个字符

来自分类Dev

当用户使用React Native otp输入从otp文本输入中删除文本时,如何添加重置状态?

来自分类Dev

在 React 渲染输入中动态添加属性

来自分类Dev

当输入被声明为空时,在React中添加一个复选框

来自分类Dev

如何在react-native中在一个屏幕中同时添加“登录”和“注册”?

来自分类Dev

从产生的文件中删除\ n

来自分类Dev

React.js:单击按钮添加/删除输入字段

来自分类Dev

同时动态添加n个div删除n个div

来自分类Dev

动态同时添加n个div删除n个div

来自分类Dev

在React中链接两个输入字段

来自分类Dev

单击表单对象中的react react js添加输入字段

来自分类Dev

添加/删除表单中的输入

来自分类Dev

如何使用javascript添加n个输入值

来自分类Dev

2个文件输入形式中的文件值相同

来自分类Dev

如何从Python3中的变量/文本文件中删除b和\ n?(TypeError)

Related 相关文章

  1. 1

    从n个输入文件中获取最大向量MATLAB

  2. 2

    删除文件中的n个重复行

  3. 3

    在React中可以动态添加和删除元素吗?

  4. 4

    向表中添加和删除数据 - React

  5. 5

    使用 React 添加/删除输入字段

  6. 6

    作为最后一个元素在div中添加(克隆)和删除列(输入元素)

  7. 7

    如何忽略输入中的n个整数

  8. 8

    如何从iOS和Android的React Native中删除文本输入中的下划线

  9. 9

    添加和删除输入字段

  10. 10

    如何从输入类型=文件中删除一个对象?

  11. 11

    在ubuntu终端的目录中删除n个最大的文件

  12. 12

    如何从目录中删除随机n个文件?

  13. 13

    如何使用python删除目录中的n个文件

  14. 14

    用React添加和删除分数

  15. 15

    无法从输入React JS的搜索中删除第一个字符

  16. 16

    当用户使用React Native otp输入从otp文本输入中删除文本时,如何添加重置状态?

  17. 17

    在 React 渲染输入中动态添加属性

  18. 18

    当输入被声明为空时,在React中添加一个复选框

  19. 19

    如何在react-native中在一个屏幕中同时添加“登录”和“注册”?

  20. 20

    从产生的文件中删除\ n

  21. 21

    React.js:单击按钮添加/删除输入字段

  22. 22

    同时动态添加n个div删除n个div

  23. 23

    动态同时添加n个div删除n个div

  24. 24

    在React中链接两个输入字段

  25. 25

    单击表单对象中的react react js添加输入字段

  26. 26

    添加/删除表单中的输入

  27. 27

    如何使用javascript添加n个输入值

  28. 28

    2个文件输入形式中的文件值相同

  29. 29

    如何从Python3中的变量/文本文件中删除b和\ n?(TypeError)

热门标签

归档