【发布时间】:2019-09-29 19:33:47
【问题描述】:
我有一个表(父元素),它获取用户并将每一行呈现为它自己的组件。表中的行包含复选框。
目标是能够使用复选框并检索选中的复选框。
问题是,当我将函数传递给每一行(子组件)时,为了触发将选中的复选框值添加到数组(由选定用户的 id 组成),整个组件被重新渲染,它真的很滞后在前端(显然)。我尝试为每个复选框创建 refs,以便仅在需要时检索选中的复选框 - 但是您不能在循环中使用 Refs,而且对于这样的任务似乎不是一件好事。
我的问题是如何处理一个表中的大量复选框,将选中的复选框存储在一个状态中,或者在触发父组件中的函数时能够检索选中的复选框?
const UserRow = ({checked, setChecked) => (
// render fields
// ...
<Checkbox checked={checked} onChange={() => setChecked()} />
)
const ParentComponent = () => {
const [users, setUsers] = useState();
const [checkedCheckboxes, setCheckedCheckboxes] = useState([]);
useEffect(() => {
// fetch users
setUsers(fetchedUsers);
});
const rows = users.map(user => <UserRow
key={id}
name={user.name}
email={user.email}
checked={checkedCheckboxes.includes(id)}
setChecked={setCheckedCheckboxes(checkedCheckboxes.concat(id)}
/>;
return (
// render table
{rows} // inset rows
)}
【问题讨论】:
-
你能发布一些代码,或者一些工作示例吗?
-
你是在使用类还是函数式组件,可以使用 react hooks 吗?
-
@HMR 我正在使用带有钩子的功能组件。
-
查看这篇文章 - itnext.io/handling-large-lists-and-tables-in-react-238397854625 你可能会发现它很有用。
-
为什么要跟踪所有复选框的状态?为什么不从一个空数组开始并在检查时添加选定的键?我还记得读过关于复选框导致不必要的重新渲染的问题。您可能希望将您的复选框包装在 memoized 组件中,以尝试防止任何过度的重新渲染。
标签: javascript reactjs