【发布时间】:2021-01-22 17:28:11
【问题描述】:
我正在尝试实现一个三态复选框来做出反应。重复单击复选框将像这样循环通过blank->checked->crossed->blank->...。环顾四周并寻找答案,我找到了一个参考:Indeterminate checkbox in React JSX。
我尝试过这样的事情:
export default function App() {
const [state, setState] = React.useState({
data: [
{
id: "1",
one: 0
},
{
id: "2",
one: 0
}
]
});
const indetSetter = React.useCallback(
(el, id) => {
if (el) {
if (el.id === id && state.data.map((datum) => datum.one === 2)) {
el.indeterminate = true;
}
}
},
[state]
);
const advance = (id, e) => {
setState((state) => {
state.data.map((datum) =>
datum.id === id ? { ...datum, one: (datum.one + 1) % 3 } : { ...datum }
);
});
return (
<>
{state.data.map((item) => {
// console.log("show", item);
return (
<input
key={item.id}
id={item.id}
type="checkbox"
checked={item.one === 1}
ref={(el) => indetSetter(el, item.id)}
onChange={(e) => advance(item.id, e)}
/>
);
})}
</>
);
}
但最终它会抛出一个错误:can't access property "indeterminate", el is null 或 can't access property "data", state is undefined。
工作sn-p:https://codesandbox.io/s/relaxed-hill-qqb4y
非常感谢任何解决此问题的帮助。
提前致谢:)
【问题讨论】:
-
尝试使用
useLayoutEffect,以便在dom可用后执行代码 -
@diedu 我不确定我正在尝试执行的代码。使用
useLayoutEffect会补充我写的逻辑吗?如果你能帮上忙 -
对不起,我的评论是完全错误的,你没有使用任何
useEffect钩子。更详细地看一下,我认为您应该创建一个单独的组件来封装不确定复选框的逻辑。顺便说一句,codesandbox 与问题中的代码非常不同
标签: html reactjs checkbox refs