我如何知道在 React 中点击了哪个数据条目?
How do I know which data entry has been clicked in React?
我正在从一个 API 中获取数据,它给我一个对象数组。每个对象都包含一些基本的用户信息,如名字、姓氏、电子邮件等。
API response: [{first_name:"",...}, {first_name:"",...}, {first_name:"",...}]
从 API 获取数据后,我将其设置为名为 'data'
的状态
我正在通过这段代码渲染对象数组:
const renderData = () => {
var rows = [];
for (var i = 0; i < data.length; ++i) {
rows.push(
<tr key={i}>
<td>{i+1}</td>
<td>{data[i].first_name}</td>
<td>{data[i].last_name}</td>
<td>{data[i].email}</td>
<td>{data[i].states}</td>
<td>{data[i].city}</td>
<td>{data[i].pincode}</td>
<td className="action-btns">
<a className="edit-btn" href="/edit">EDIT</a> // Notice this line
<a className="delete-btn" href="/delete">DELETE</a>
</td>
</tr>
);
}
return (
<tbody>
{rows}
</tbody>
);
}
renderData 在 table 的某处被调用:
export default MyComponent() {
return() {
<table>
<thead>...</thead>
{renderData()} // notice this line
</table>
}
}
现在你可能已经注意到我有 EDIT 和 DELETE button/link,只要用户点击 EDIT,我们就会转到 /edit url 然后我们使用 React router 渲染一个组件。我想将数据传递给另一个采用单个用户道具对象的组件,该组件是一种表单,它将使用提供的道具预填充数据。
但是我怎么知道哪个对象的编辑按钮被点击了
我尝试了一些天真的事情,例如:
<a onClick={() => setNumber(i)} className="edit-btn" href="#">EDIT</a> // Notice the onClick event
我想如果 i 是 for 循环中的值,只有当我知道数据中数组的哪个元素被单击时,也许我可以将它作为道具传递。
我不知道该怎么做。
但是使用这种方法只给我 11,这是从 API.
中检索到的数组 'data' 的长度
<Router>
<Switch>
<Route exact path="/" component={App} />
<Route path="/add" component={Add} />
<Route path="/edit" component={Add(props)} /> // How do I pass props here from Add.js to Main.js
</Switch>
</Router>
它给你数组的长度,因为在 i
上有一个闭包,请改用 let i
。更多详细信息 here。但是存储索引可能不是一个好主意,特别是如果你说之后从数组中删除元素,这可能会使你存储的索引无效。
不是存储索引,而是将 data[i]
本身存储在状态中(例如,被点击的项目)。
() => setClickedItem(data[i])
此外,如果您的 renderData
函数中有钩子,您可能需要将 renderData
更改为组件 RenderData
并将其用作 <RenderData/>
而不是调用就像你现在的功能一样。否则如果你把它当作函数来调用,里面有钩子,react 会认为那些钩子属于父组件,可能会发生意想不到的事情。
我正在从一个 API 中获取数据,它给我一个对象数组。每个对象都包含一些基本的用户信息,如名字、姓氏、电子邮件等。
API response: [{first_name:"",...}, {first_name:"",...}, {first_name:"",...}]
从 API 获取数据后,我将其设置为名为 'data'
的状态我正在通过这段代码渲染对象数组:
const renderData = () => {
var rows = [];
for (var i = 0; i < data.length; ++i) {
rows.push(
<tr key={i}>
<td>{i+1}</td>
<td>{data[i].first_name}</td>
<td>{data[i].last_name}</td>
<td>{data[i].email}</td>
<td>{data[i].states}</td>
<td>{data[i].city}</td>
<td>{data[i].pincode}</td>
<td className="action-btns">
<a className="edit-btn" href="/edit">EDIT</a> // Notice this line
<a className="delete-btn" href="/delete">DELETE</a>
</td>
</tr>
);
}
return (
<tbody>
{rows}
</tbody>
);
}
renderData 在 table 的某处被调用:
export default MyComponent() {
return() {
<table>
<thead>...</thead>
{renderData()} // notice this line
</table>
}
}
现在你可能已经注意到我有 EDIT 和 DELETE button/link,只要用户点击 EDIT,我们就会转到 /edit url 然后我们使用 React router 渲染一个组件。我想将数据传递给另一个采用单个用户道具对象的组件,该组件是一种表单,它将使用提供的道具预填充数据。 但是我怎么知道哪个对象的编辑按钮被点击了
我尝试了一些天真的事情,例如:
<a onClick={() => setNumber(i)} className="edit-btn" href="#">EDIT</a> // Notice the onClick event
我想如果 i 是 for 循环中的值,只有当我知道数据中数组的哪个元素被单击时,也许我可以将它作为道具传递。 我不知道该怎么做。 但是使用这种方法只给我 11,这是从 API.
中检索到的数组 'data' 的长度<Router>
<Switch>
<Route exact path="/" component={App} />
<Route path="/add" component={Add} />
<Route path="/edit" component={Add(props)} /> // How do I pass props here from Add.js to Main.js
</Switch>
</Router>
它给你数组的长度,因为在 i
上有一个闭包,请改用 let i
。更多详细信息 here。但是存储索引可能不是一个好主意,特别是如果你说之后从数组中删除元素,这可能会使你存储的索引无效。
不是存储索引,而是将 data[i]
本身存储在状态中(例如,被点击的项目)。
() => setClickedItem(data[i])
此外,如果您的 renderData
函数中有钩子,您可能需要将 renderData
更改为组件 RenderData
并将其用作 <RenderData/>
而不是调用就像你现在的功能一样。否则如果你把它当作函数来调用,里面有钩子,react 会认为那些钩子属于父组件,可能会发生意想不到的事情。