我有个复选框。如果选中了复选框,则应选中表单检查。但对我不起作用。我有以下代码:
import React, { useState } from 'react'
import { Row, Form, Container } from 'react-bootstrap'
import subMenu from '../subMenu.js'
function TestScreen() {
const [test1, setTest1] = useState(subMenu)
const subMenuHandler = (e) => {
let sMenu = test1
sMenu.forEach(sm => {
if (sm._id === Number(e.target.value))
sm.isChecked = e.target.checked
})
setTest1(sMenu)
}这是我的表格:
return (
<Container fluid>
<Row className="mx-xs-auto">
<Form>
<div key='default-checkbox' className="mb-3" >
{test1.map(sm => (
<Form.Check
type="checkbox"
id={sm._id}
label={sm.nama}
key={sm._id}
value={sm._id}
checked={sm.isChecked}
onChange={subMenuHandler}
/>
))}
</div>
</Form>
</Row>
</Container >
)stat isChecked已成功更改为true,但窗体检查未更改为checked,
这是我的数据:
const subMenu = [
{
_id: 1,
nama: 'submenu-1',
category: 'Electronics',
harga: 89.99,
id_menu: 1,
isChecked: false
},
{
_id: 2,
nama: 'submenu-2',
category: 'Electronics',
harga: 89.99,
id_menu: 1,
isChecked: false
},
{
_id: 3,
nama: 'submenu-3',
harga: 599.99,
id_menu: 2,
isChecked: false
},
]在这个州,isChecked变成了真,那么我错在哪里呢?我不去磨砂..。
发布于 2021-02-13 17:32:45
而不是let sMenu = test1,do,let sMenu = [...test1]
在更新状态之前复制一份状态,以便react可以检测到新的对象引用是否可用于触发重新呈现。
在前面的方式中,您只是使用不同的变量名指向同一个对象(数组也是一个对象)。
在深入了解任何UI框架之前,还要了解JS中的non-primitives和原语。当涉及到对象时,另一个重要的概念是浅层与深度复制。
发布于 2021-02-13 19:07:14
要正确地在React中更新状态,您应该创建正在修改的每个片段的副本,而不是直接变异。当您执行let sMenu = test1时,您传递的引用与创建副本的引用相同。
您不仅应该复制您的数组,还应该创建您想要更改的对象。对于真正嵌套的对象来说,这可能会变得有点混乱,在那里您会发现自己创建了很多副本。
下面这个方法不会改变你的状态:
const subMenuHandler = (e) => {
setTest1(sMenu => (
sMenu.map(sm => {
if (sm._id === Number(e.target.value)) return sm
return { ...sm, isChecked: e.target.checked }
})
))
}有几件事要注意:
sm的副本。你不会像sm.isChecked = e.target.checked那样直接变异它;https://stackoverflow.com/questions/66187914
复制相似问题