javascript - 在 React 中是否可以使用钩子来填充从 array.map() 生成的单个输入?
问题描述
考虑以下应用程序。我将如何在“输入”中存储与每个项目 ID 关联的输入,这样一旦我单击按钮,我就能够发送与我单击的按钮的项目 ID 关联的输入的信息。
是否可以将数据存储在数组中,例如我有 [{id: 123, inputvalue: "zyx"}, {id: ..., inputvalue: ...}, {id: etc., inputvalue: ETC。}]?
我将如何访问这些数据以通过使用按钮发送并用于在第三列的应用程序上呈现?
import React, { useEffect, useState, Fragment } from "react";
export default function App () {
const [input, setInput] = useState([]);
const [idData, setIdData] = useState([]);
useEffect(
//gets id data and setIdData(response.data);
)
handleButton () {
try{
//sends data for single item
} catch (e)) {
alert(e)
}
}
return(
<Fragment>
<table>
<tableheader>
<tablerow>
<tableheadercell>
ID
</tableheadercell>
<tableheadercell>
Input
</tableheadercell>
<tableheadercell>
ID and Input
</tableheadercell>
<tableheadercell>
</tableheadercell>
<tablerow>
</tableheader>
<tablebody>
{idData.map(item => (
<tablerow key={item.id}>
<tablecell>
ID
</tablecell>
<tablecell>
<input... onChange(e => setInput({
id: item.id, inputvalue: e.target.value}))>
</tablecell>
<tablecell>
{ID and input appearing together}
</tablecell>
<tablecell>
<button... onClick(() => handleButton())>
</tablecell>
<tablerow>
))}
</tablebody>
</table>
</Fragment>
);
}
非常感谢您!
解决方案
- 在 useEffect 中获取您的数据并将其存储在 state 中
setIdData
。 - 将其映射并动态呈现表格行,例如:
<td>{item.id}</td>
- 维护输入状态,并在其中
onChange
使用 set state 回调来动态更新对象,输入键id
与用户输入的值一样 - 创建一个
handleButton
for 按钮并通过item
。您可以input value
轻松地从状态中检索。
您的代码已被重构。在这里查看工作演示
代码片段:
export default function App() {
const [input, setInput] = useState({});
const [idData, setIdData] = useState([]);
useEffect(() => {
// make api call and then set the state
setIdData([{ id: 123, inputvalue: "xyz" }, { id: 234, inputvalue: "abc" }]);
}, []);
const handleInputChange = (e, id) => {
const val = e.target.value;
setInput(prev => ({ ...prev, [id]: val }));
};
const handleButton = item => {
console.log(item, input[item.id]);
};
return (
<Fragment>
<table>
<th>
<tr>
<td>ID</td>
<td>Input</td>
<td>ID and Input</td>
<td />
</tr>
</th>
<tbody>
{idData.map(item => (
<tr key={item.id}>
<td>{item.id}</td>
<td>
<input
onChange={e => handleInputChange(e, item.id)}
value={input[item.id]}
/>
</td>
<td>
{/* {ID and input appearing together} */}
{item.id + item.inputvalue}
</td>
<td>
<button onClick={() => handleButton(item)}>
click button {item.id}
</button>
</td>
</tr>
))}
</tbody>
</table>
</Fragment>
);
}
推荐阅读
- php - 为什么协议 gs 上的 file_get_contents() 错误(开发本地 GAE)
- javascript - 如何在 chrome 扩展中使用 AJAX 向“我的 XAMPP 服务器”发送 GET 请求
- javascript - div上的点击事件并过滤vuex数据--vue.js
- android - 应用在生产中时,如何使用测试用户的帐户进行实际购买以购买相同的产品?
- django - Django Microservices - 跳过所有用户为非用户服务创建的表
- r - 有没有办法在反应数据上使用来自 shinyWidget 的 pickerGroup(或 selectizeGroup)模块?
- r - 如何将列表保存为 R 中的文件以便在 Python 中读取它?
- java - 为什么 Java 不能用泛型类型参数推断 lambda 表达式的类型?
- java - ManyToOne 关系,其中通过连接两列来引用列
- http - Flutter Dart HTTP 标头不起作用。发送带有“标头”的请求。在响应授权错误时,{"CODE":401,"MESSAGE":"Unauthorized"}