【发布时间】:2021-06-12 02:37:28
【问题描述】:
我正在尝试从这样的数组中创建一些受控复选框
const subjects = [
{
name: 'WebDev',
label: 'Web Development',
},
{
name: 'GraphicDesign',
label: 'Graphic Design',
},
{
name: 'Engineering',
label: 'Engineering',
},
];
我想让它们受控,所以对于checked属性,我需要它被状态控制。但是我如何遍历它们并每次访问正确的状态对象?我想我也许可以解析 subject.name 字符串,但这肯定不是好习惯吗?事实上,我也许可以在索引匹配的状态下创建一个匹配数组,但我不觉得这是可扩展的并且严重依赖于正确的顺序。
{subjects.map((subject, i) => (
<div className="w-full sm:w-auto" key={i}>
<label className="flex content-center p-3">
<input type="checkbox" name={subject.name} value={subject.name} onChange={onInputChange} checked={????}/>
<span className="ml-3">{subject.label}</span>
</label>
</div>
))}
我还有其他类似的输入。对他们来说,这很容易,因为我可以使用state.name 来控制他们。
<input id="name" type="text" value={state.name} onChange={onInputChange} name="name" required/>
然后我使用广义函数来更新输入。这需要使用useState() Hook
const onInputChange = e => {
const item = e.target.name;
const value = e.target.type === "checkbox" ? e.target.checked : e.target.value;
setState({
...state,
[item]: value,
})
}
在 React 中处理此类问题的最佳实践是什么?如果我可以在我的状态下包含如下所示的主题,那就太好了。
我是否应该放弃单独的数组并包含状态中的所有信息?
const [state, setState] = useState({
name:'',
email: '',
message: '',
checkedSubs: {
WebDev: false,
GraphicDesign: false,
Engineering: false
},
emailSent: false
})
谢谢!
【问题讨论】:
-
您是否考虑过为您的主题对象添加另一个属性?
checked: false之类的东西? -
这个
subjects数组是从哪里来的?它是组件的道具吗?有变化吗? -
如果你想使用相同的
onInputChange来处理复选框,那么它们需要是状态的顶级属性,而不是嵌套的。checked={state[subject.name]}.
标签: javascript reactjs forms checkbox