如何使用react hook实现多个复选框

2024-01-07

我想使用react-hook 在我的HTML 页面上实现多个复选框。

我尝试使用这个 URL 来实现:https://medium.com/@Zh0uzi/my-concerns-with-react-hooks-6afda0acc672 https://medium.com/@Zh0uzi/my-concerns-with-react-hooks-6afda0acc672。在提供的链接中,它是使用类组件完成的并且工作完美,但是每当我使用 React hook setCheckedItems 来更新复选框选中状态时,它都不会重新渲染视图。

第一次渲染视图并且 console.log() 从 Checkbox 组件打印。单击复选框功能后处理更改被呼叫并且选中的项目更新值,但视图不再渲染(没有 console.log() 打印)。和{checkedItems.get("check-box-1")}也不打印任何值。

下面是我的示例代码。

复选框示例 :

import React, { useState } from 'react';
import Checkbox from '../helper/Checkbox';

const CheckboxExample = () => {
    const [checkedItems, setCheckedItems] = useState(new Map());

    const handleChange = (event) => {
        setCheckedItems(checkedItems => checkedItems.set(event.target.name, event.target.checked));
        console.log("checkedItems: ", checkedItems);
    }

    const checkboxes = [
        {
            name: 'check-box-1',
            key: 'checkBox1',
            label: 'Check Box 1',
        },
        {
            name: 'check-box-2',
            key: 'checkBox2',
            label: 'Check Box 2',
        }
    ];


    return (
        <div>
            <lable>Checked item name : {checkedItems.get("check-box-1")} </lable> <br/>
            {
                checkboxes.map(item => (
                    <label key={item.key}>
                        {item.name}
                        <Checkbox name={item.name} checked={checkedItems.get(item.name)} onChange={handleChange} />
                    </label>
                ))
            }
        </div>
    );
}
export default Example;

Checkbox:

import React from 'react';

const Checkbox = ({ type = 'checkbox', name, checked = false, onChange }) => {
    console.log("Checkbox: ", name, checked);

  return (<input type={type} name={name} checked={checked} onChange={onChange} /> )
}
export default Checkbox;

我不认为使用Map代表国家是最好的主意。
我已经使用简单的实现了你的示例Object它有效:

https://codesandbox.io/s/react-hooks-usestate-xzvq5 https://codesandbox.io/s/react-hooks-usestate-xzvq5

const CheckboxExample = () => {
  const [checkedItems, setCheckedItems] = useState({}); //plain object as state

  const handleChange = (event) => {
      // updating an object instead of a Map
      setCheckedItems({...checkedItems, [event.target.name] : event.target.checked });
  }

  useEffect(() => {
    console.log("checkedItems: ", checkedItems);
  }, [checkedItems]);  

  const checkboxes = [
      {
          name: 'check-box-1',
          key: 'checkBox1',
          label: 'Check Box 1',
      },
      {
          name: 'check-box-2',
          key: 'checkBox2',
          label: 'Check Box 2',
      }
  ];


  return (
      <div>
          <lable>Checked item name : {checkedItems["check-box-1"]} </lable> <br/>
          {
              checkboxes.map(item => (
                  <label key={item.key}>
                      {item.name}
                      <Checkbox name={item.name} checked={checkedItems[item.name]} onChange={handleChange} />
                  </label>
              ))
          }
      </div>
  );
}

EDIT:

结果是一个Map可以作为状态值,但要触发重新渲染,您需要用新的 Map 替换 Map,而不是简单地改变它,React 不会选择它,即:

const handleChange = (event) => {
  // mutate the current Map
  checkedItems.set(event.target.name, event.target.checked)
  // update the state by creating a new Map
  setCheckedItems(new Map(checkedItems) );
  console.log("checkedItems: ", checkedItems);
}

但在这种情况下,我认为使用 Map 除了可能更干净的语法之外没有任何好处.get() and .set()代替x[y].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用react hook实现多个复选框 的相关文章

随机推荐

  • 带有嵌入变量的现有字符串的 Scala 字符串插值器

    我可能缺少 Scala 字符串插值机制的一些基本内容 我想做的事 this could come from a config file string here to demo val brown BROWN val cow Moo val
  • Webkit 滚动条 CSS,始终是角落里的白框

    有没有办法避免自定义样式的 webkit 滚动条上出现默认的白框 仅当水平和垂直溢出时才会出现白框 使用谷歌浏览器 编辑 我尝试过设置body背景颜色不同 仍然只看到一个白色的盒子 Screenshot CSS webkit scrollb
  • JSON.NET 读取 JObject 时出错

    我通过 AJAX 和 Web Api 向我的服务器发送 JSON 对象 var data fdsfsd Kifdsfa fsdfsa fadsf fasdfsd fadsf fasdfsd 2008 5 11 12 13 2009 20 1
  • 无法在 GeoDjango 应用程序中同步数据库

    我在设置空间数据库并将其与 GeoDjango 同步时遇到了真正的麻烦 我能够根据 geodjango 文档设置空间数据库并创建一个 django 应用程序 但是当我运行时 python manage py sqlall world 我明白
  • 如何使用 RSpec 测试 ActionText?

    我正在尝试编写一个 RSpec 系统测试 其中涉及填写页面上的 ActionText Trix 字段 好像ActionText SystemTestHelper按照定义here https github com rails rails bl
  • C++中“保留状态”是什么意思?

    我在 MSDN 页面上阅读了此解释 了解 lambda 表达式相对于函子和函数指针的优点 保持状态 的能力是什么意思 它与通过引用或封闭范围内的值捕获某些变量的能力有关吗 http msdn microsoft com en us libr
  • 通过服务更新 wso2 ESB 中的本地条目

    有什么方法可以从 esb 服务更新本地条目 我必须在全局变量中存储一个令牌 并且需要在它过期时更新它 我想将其保留在本地条目中 看起来我无法从 ESB 服务 序列更新它
  • 未使用的 ES6 模块会影响性能吗?

    我知道未使用的 Java NET 导入不会影响性能 但我也知道的实现require 过去 只需在编译时拉取并连接整个所需的模块 文件 并且import声明是一种演变 实际上有什么不同吗 在导入列表中忘记一个非常大的未使用的 ES6 模块会影
  • 使用 devise_token_auth 和 active_model_serializers 解决多个用户模型的问题?

    多个用户模型 User Admin 和 Master 与 devise token auth 的组合在使用非 User 模型 Admin 和 Master 登录时无法成功设置响应标头 uid token 等 然而 用户模型是有效的 原因看起
  • Runtime.exec() :在 Android 中重新启动?

    我正在寻找一种可用于重新启动已取得 root 权限的设备的解决方案 我知道重新启动设备对于用户来说是非常糟糕的设计 如这里所述 https stackoverflow com questions 4030037 how to reboot
  • CUDA 主机和设备使用相同的 __constant__ 内存

    我有使用恒定内存的设备 主机功能 它在设备上运行正常 但在主机上似乎该内存仍未初始化 include
  • 从磁盘加载存储的 RSA 公钥/私钥?

    独立于私钥应该加密的事实 这与这个问题无关 我使用以下代码生成 RSA 密钥对 KeyPairGenerator kpg KeyPairGenerator getInstance RSA kpg initialize 2048 KeyPai
  • MVC 是否定义一个控制器应如何与另一个控制器通信?

    我指的是一般的 MVC 设计模式 如维基百科 http en wikipedia org wiki Model E2 80 93view E2 80 93controller 在进行 GUI 密集型应用程序时 我通常会拥有许多控制器 有时一
  • r 值参考铸造和临时物化

    以下代码的输出结果为 void doit const T1 const T2 T1 unsigned long T2 int t1 t2 t1 T1 t2 t1 T1 t2 t1 T1 t2 据我了解 t1 t2案例简直就是积分促销 第二种
  • 哪些文件在压缩后不会减少其大小[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我写了一个java程序用于压缩 我压缩了一些文本文件 压缩后文件大小减小 但是当我尝试压缩PDF文件时 压缩后我没有看到文件大小有任何
  • 在Python中找到第n个素数

    我用 Python 编写了以下代码段来查找第 n 个数字 我不明白为什么它不起作用 您能否只给我一个提示或指出到底是哪一点弄乱了它 而不是一个完整的解决方案 term int input What prime do you want to
  • 每个子类带有表的 Hibernate 鉴别器列

    现在我正在使用每个子类一个表的方法来建模我的数据 我的层次结构的简化是 abstract class Abstract common data stored in abstract class ConcreteTypeA1 extends
  • Oracle 连接运算符

    如何重写这个 select tab1 id tab2 id tab3 id from tab1 tab2 tab3 where tab1 col1 tab2 col1 and tab2 col2 tab3 col2 使用 OUTER JOI
  • relatedObjectDoesNotExist at /admin/login/ 用户没有个人资料

    学习 django 并创建了一个新项目 通过登录管理页面http 127 0 0 1 8000 admin http 127 0 0 1 8000 admin但是在为每个用户添加配置文件代码后 我收到以下错误 Error 用户 模型 py
  • 如何使用react hook实现多个复选框

    我想使用react hook 在我的HTML 页面上实现多个复选框 我尝试使用这个 URL 来实现 https medium com Zh0uzi my concerns with react hooks 6afda0acc672 http