[英]Handling an Unknown Number of Inputs in React
我正在创建一个反应元素,允许用户向朋友/家人发送电子邮件。 该元素默认为 3 个输入字段,但是用户可以单击按钮添加其他输入字段。
我构建此组件的想法是有一个递增计数器的按钮,然后使用该计数器值运行循环并将项目添加到数组
<button onClick={handleAddEmail}> Add email </button>
function handleAddEmail() {
setNumberOfEmails(numberOfEmails + 1);
}
现在要让它工作,我需要一个NumberOfEmails
挂钩。 该挂钩将使用前三个输入字段进行初始化。
const [numberOfEmails, setNumberOfEmails] = useState(3);
此外,还有一个inviteEmails
挂钩来处理每个输入的 state。
const [inviteEmails, setInviteEmails] = useState([])
所有这些输入都应在 function 中呈现:
function renderEmailFields() {
const emailContainer = [
<input
value={inviteEmails[0]}
onChange={(e) => handleEmailChange(0, e)}
placeholder="Enter email here..."
/>,
<input
value={inviteEmails[1]}
onChange={(e) => handleEmailChange(1, e)}
placeholder="Enter email here..."
/>,
<input
value={inviteEmails[2]}
onChange={(e) => handleEmailChange(2, e)}
placeholder="Enter email here..."
/>];
for (let i = 3; i < numberOfEmails; i++) {
emailContainer.push(
<input
value={inviteEmails[i]}
onChange={(e) => handleEmailChange(i, e)}
placeholder="New email..."
/>
);
}
return emailContainer;
我上面的代码接近工作,但是添加一个新的输入字段会导致以前的输入锁定并变得不可编辑。
任何意见,将不胜感激。
如果你问我,你真的不需要第二个 state 原子来表示输入的数量。
useCallback
和dataset
魔术使它成为现实,因此您不需要为每个输入单独的onClick
处理程序 function。.filter(Boolean)
删除所有虚假值; 空字符串是假的。function App() {
const [inviteEmails, setInviteEmails] = React.useState(["", "", ""]);
const handleEmailChange = React.useCallback((event) => {
const index = parseInt(event.target.dataset.index, 10);
setInviteEmails((inviteEmails) => {
const newInviteEmails = [...inviteEmails];
newInviteEmails[index] = event.target.value;
return newInviteEmails;
});
}, []);
const removeEmail = React.useCallback((event) => {
const index = parseInt(event.target.dataset.index, 10);
setInviteEmails((inviteEmails) => {
const newInviteEmails = [...inviteEmails];
newInviteEmails.splice(index, 1);
return newInviteEmails;
});
}, []);
const addEmail = React.useCallback(
() => setInviteEmails((inviteEmails) => [...inviteEmails, ""]),
[]
);
return (
<div>
{inviteEmails.map((email, index) => (
<div key={index}>
<input
value={email}
data-index={index}
onChange={handleEmailChange}
placeholder="Enter email here..."
/>
<button onClick={removeEmail} data-index={index}>
×
</button>
</div>
))}
<button onClick={addEmail}>Add email</button>
<pre>{JSON.stringify(inviteEmails.filter(Boolean), null, 2)}</pre>
</div>
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.