如何删除 "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;
我想要实现的是,我希望允许用户上传尽可能多或有限的文件。要添加,他可以随时添加“输入文件字段”。
一切正常,但当我尝试删除它时。它不会删除提供的 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;