reactjs - React 中的受控复选框
问题描述
我正在尝试将所有选中的复选框放入状态数组中。我可以向数组中添加值,但是当我取消选中该框时无法删除该值。我尝试过使用 splice 并按索引删除,也尝试过通过过滤器删除。它可以工作,但工作缓慢且不正确。例如,我可以取消选中所有复选框,并且一个值保持在状态。请检查我做错了什么这是一个沙盒链接和下面的代码
const [state, setState] = useState({
address: [],
})
const checkboxChange = (e) => {
const { name, checked } = e.target
if (checked === true) {
setState((prevState) => ({
...prevState,
address: [...prevState.address, name],
}))
}
if (checked === false) {
setState((prevState) => ({
...prevState,
address: [...prevState.address].filter((it) => it.id !== it.id),
}))
}
}
{list.map((it, index) => (
<div key={it.id}>
<label>
<input
className="mr-2"
checked={state.address.index}
key={it.id}
name={it.id}
defaultValue="false"
onChange={checkboxChange}
type="checkbox"
/>
{it.name}
</label>
</div>
))}
解决方案
问题
您正在比较it.id !== it.id
哪个总是评估为假。
解决方案
state.address
是 id 的数组,而不是具有id
属性的对象,您希望将每个对象与事件对象中的输入进行name
比较onChange
。
- 只过滤
prevState.address
- 相比
el !== name
代码
const checkboxChange = (e) => {
const { name, checked } = e.target;
if (checked) {
setState((prevState) => ({
...prevState,
address: [...prevState.address, name],
}))
} else {
setState((prevState) => ({
...prevState,
address: prevState.address.filter((el) => el !== name),
}))
}
}
受控输入
如果您真的希望控制输入,那么我建议:
- 将检查的值存储在地图中
onChange
只需从事件中切换选中的值- 使用
value
属性与defaultValue
输入的属性
代码
const App = (props) => {
const [state, setState] = useState({
address: {}, // <-- object map
})
useEffect(() => {
console.log(state)
}, [state])
const checkboxChange = (e) => {
const { name } = e.target
setState((prevState) => ({
...prevState,
address: {
...prevState.address,
[name]: !prevState.address[name], // <-- toggle state
},
}))
}
return (
<div>
{list.map((it, index) => (
<div key={it.id}>
<label>
<input
className="mr-2"
checked={state.address.index}
key={it.id}
name={it.id}
value={state.address[it.id]} // <-- set from checked state
onChange={checkboxChange}
type="checkbox"
/>
{it.name}
</label>
</div>
))}
</div>
)
}
推荐阅读
- javascript - Plotly.js 中带有(计算的)平均线的堆积条形图
- ffmpeg - 如何使用 FFMPEG(延迟不是问题)在不缓冲的 Azure 媒体播放器中获得连续直播?
- java - 包装递归函数总是一个好习惯吗?
- c# - 为什么空白出现在我的 C# TextWriter 文件的末尾?
- php - Laravel artisan 命令 php artisan make:Import is not defined
- leaflet - 如何使相邻的多边形与传单中编辑的多边形对齐?
- sql-server - 我可以在视图中查询数据库中的表(仅当它存在时)?
- encryption - 为什么我的托管实例数据库加密没有被禁用?
- mysql - 运算符中的 sql 中的 Null 限制
- sql - 带有case表达式的“不是单组群函数”