如何删除 "Input type File textfield"

How to Delete "Input type File textfield"

我想要实现的是,我希望允许用户上传尽可能多或有限的文件。要添加,他可以随时添加“输入文件字段”。

一切正常,但当我尝试删除它时。它不会删除提供的 SPECIDIC INDEX 或特定 ID 的“输入字段”,但它 总是删除最后一个字段。

import React, { useState } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function App() {
  const [fields, setFields] = useState([{ files: null }]);

  function handleChange(i, event) {
    const values = [...fields];
    values[i].files = event.target.[0];
    console.log(values);

    setFields(values);
  }

  function handleAdd() {
    const values = [...fields];
    values.push({ value: null });
    setFields(values);
  }

  function handleRemove(i) {
    const values = [...fields];
    values.splice(i, 1);
    setFields(values);
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>

      <button type="button" onClick={() => handleAdd()}>
        +
      </button>

      {fields.map((field, idx) => {
        return (
          <div key={`${field}-${idx}`}>
            <input
              type="text"
              
               defaultValue={field.files || ""}
               onChange={(e) => handleChange(idx, e)}
                />
            <button type="button" onClick={() => handleRemove(idx)}>
              X
            </button>
          </div>
        );
      })}
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

问题是地图 KEY 您应该使用特定的 ID 而不是索引或文件对象,您可以在示例下方找到 uuid包。

示例:

import { useState } from "react";
import "./styles.css";
import { v4 as uuidv4 } from "uuid";

const App = () => {
 const [fields, setFields] = useState([{ id: uuidv4(), files: "" }]);

   function handleChange(i, event) {
     setFields(
      fields.map((input) =>
    input.id === i ? { ...input, files: event.target.value } : input
    )
    );
  }

  function handleAdd() {
  const values = [...fields];
  values.push({ id: uuidv4(), files: "" });
  setFields(values);
  }

  function handleRemove(idx) {
  setFields(fields.filter((_, i) => i !== idx));
  }

  return (
   <div className="App">
   <h1>Hello CodeSandbox</h1>

   <button type="button" onClick={() => handleAdd()}>
    +
   </button>

   {fields.map((field, idx) => {
    return (
      <div key={field.id}>
        <input
          type="text"
          value={field.files}
          onChange={(e) => handleChange(field.id, e)}
        />
        <button type="button" onClick={() => handleRemove(idx)}>
          X
        </button>
      </div>
    );
  })}
</div>
 );
 };
 export default App;