【问题标题】:How to display and handle dynamic checkoxes that are dependent on Task array value in the backend (Mongodb) in react js?如何在react js中显示和处理依赖于后端(Mongodb)中的Task数组值的动态checkoxes?
【发布时间】:2025-12-18 18:45:02
【问题描述】:

我正在做一个反应项目,我有这样的要求,

我有一个数组,里面包含 1 个对象和 1 个名为 Task[] 的数组

"contractor": [
                {
                  "contractGivenBy": -1,
                  "contractorID": 0,
                  "contractorName": "contractor1",
                  "reviewedByAssigner": false,
                  "submitReviewToAssigner": false,
                  "tasks": [ 2, 4, 6 ],
                  "tasksDone": false
                },

现在,我想在页面中将 Tasks 数组显示为复选框。

很好,我使用map() 方法显示了所有复选框,但问题是,当用户选中或取消选中特定复选框时如何处理(从这些复选框中获取值)。

我正在使用带有 React 钩子的 React 功能组件。

这是尝试过的..

   <form onSubmit={onSubmitHandler}>
      {               
         projectData.contractor[0].tasks.map((task, index) => {
              return (
                     <div style={{ flexDirection: "column" }}>

                         <FormControlLabel
                             control={
                                 <Checkbox
                                    checked={false}
                                    value={task}
                                    onChange={handleTask} />
                                }
                                 label={`task ${task}`}
                                />
                              </div>
                             )
                           })
                          }
          <Button 
              type="submit" 
               style={{ 
                   backgroundColor:"rgba(25,123,189)", 
                   color: "white" 
                 }}>
            Assgin
          </Button>
    </form>

【问题讨论】:

  • 可以显示多少个复选框? tasks: [2, 4, 6] 表示复选框编号吗?
  • 对于数组中的每个元素,我想显示一个复选框并获取复选框的值,该值最终是数组元素本身。
  • 好的,那么复选框的最大值是多少?我的意思是,如果有tasks: [2,4,6],有 6 个或更多复选框?如果计数是动态的,你怎么知道总计数?
  • tasks.length 方法知道任务数组的长度。
  • tasks 只有 选中 框号,不是吗?我相信您应该显示所有复选框即使未选中。我是不是误会了?

标签: javascript reactjs


【解决方案1】:

更新

你去吧,它使用带有复选框实现的反应钩子,我用&lt;input type /&gt;对其进行了一些调整,但你会明白的

import React, { useState } from "react";
import ReactDOM from "react-dom";

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

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

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

  const handleChange = event => {
    setCheckedItems({
      ...checkedItems,
      [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["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>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<CheckboxExample />, rootElement);



【讨论】:

  • 是的,我试过那个,但是taskSet() 每次调用handleTask() 时都会替换旧值。那不是我想要的行为。 @raju
  • 我试过这样,首先我会在顶部取一个空数组,对于每个复选框,我都会取值并推送到那个空数组,比如 onChange={(e) =&gt; data.push(e.target.value)} 。用户提交后,我将其存储在这样的状态const [checkboxData, setCheckboxData] = React.useState(data);
  • 看到这个ibb.co/0QLKx3q 图像。我使用 set() 数据结构来存储唯一的检查值,它确实这样做了
  • 让我再次检查