首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复选框未选中reactjs。

复选框未选中reactjs。
EN

Stack Overflow用户
提问于 2021-02-13 17:26:18
回答 2查看 121关注 0票数 2

我有个复选框。如果选中了复选框,则应选中表单检查。但对我不起作用。我有以下代码:

代码语言:javascript
复制
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)
}

这是我的表格:

代码语言:javascript
复制
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,

这是我的数据:

代码语言:javascript
复制
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变成了真,那么我错在哪里呢?我不去磨砂..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-13 17:32:45

而不是let sMenu = test1,do,let sMenu = [...test1]

在更新状态之前复制一份状态,以便react可以检测到新的对象引用是否可用于触发重新呈现。

在前面的方式中,您只是使用不同的变量名指向同一个对象(数组也是一个对象)。

在深入了解任何UI框架之前,还要了解JS中的non-primitives原语。当涉及到对象时,另一个重要的概念是浅层深度复制

票数 2
EN

Stack Overflow用户

发布于 2021-02-13 19:07:14

要正确地在React中更新状态,您应该创建正在修改的每个片段的副本,而不是直接变异。当您执行let sMenu = test1时,您传递的引用与创建副本的引用相同。

您不仅应该复制您的数组,还应该创建您想要更改的对象。对于真正嵌套的对象来说,这可能会变得有点混乱,在那里您会发现自己创建了很多副本。

下面这个方法不会改变你的状态:

代码语言:javascript
复制
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那样直接变异它;
  • 如果您使用的是地图,则这里不需要在数组上使用扩展运算符,因为它已经返回了一个新的数组,而且它不会发生任何变化。如果您使用的扩展运算符也是可以的,但是您将创建另一个在这种情况下不需要的交互。如果下面的逻辑改变对象本身,扩展运算符是好的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66187914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档