【问题标题】:How to make the checkbox checked default? [duplicate]如何使复选框默认选中? [复制]
【发布时间】:2021-02-11 15:42:24
【问题描述】:

我正在制作一个需要从数据中填充动态复选框的反应应用程序。

  const sectors = [
    {
      SectorID: 5,
      Name: "Wood Truss/Panel/Building Components"
    },
    {
      SectorID: 33,
      Name: "LBM Retail/Pro Contractor"
    },
    {
      SectorID: 24,
      Name: "Light Gauge Steel Truss/Panel"
    }
  ];

那么我这里确实有一个选中复选框的列表,

  const selectedSectors = [
    {
      SectorID: 5
    },
    {
      SectorID: 24
    }
  ];

所以这里使用SectorID,我们可以找到匹配项。

预期结果:需要在加载时检查所选扇区。

我尝试过的解决方案

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

  React.useEffect(() => {
    const newData = sectors.map((sector) => {
      return selectedSectors.map((selected) => {
        if (selected.SectorId === sector.SectorId) {
          setCheckedItems((prev) => {
            const checkedItems = {
              ...prev.checkedItems,
              [sector.Name]: true
            };
            return { ...prev, checkedItems };
          });
        }
      });
    });
  }, []);

上面没有检查选定的扇区,我认为我在这里做错了。

填充复选框,如

      {sectors &&
        sectors.map((sector, index) => (
          <React.Fragment key={index}>
            <label className="block mr-4">
              <input
                className="mx-2 leading-tight"
                name={sector.Name}
                checked={checkedItems[sector.Name]}
                onChange={(e) => handleInputChange(e, sector)}
                type="checkbox"
              />
              <span className="text-sm">{sector.Name}</span>
            </label>
          </React.Fragment>
        ))}

代码沙盒:

要求:请帮助我在与selectedSectors..进行比较时默认选中复选框。

【问题讨论】:

    标签: javascript html reactjs checkbox


    【解决方案1】:

    如果您不需要对选中状态执行任何操作,那么您应该使用defaultChecked 属性并简单地在selectedSectors 数组中搜索匹配项。

    defaultChecked={selectedSectors.some(
      (selectedSector) =>
        selectedSector.SectorID === sector.SectorID
    )}
    

    如果您想保持checkedItems 状态,那么您可以在效果中初始化您的状态。遍历sectors 数组并将扇区ID 减少为选定值的对象

    React.useEffect(() => {
      const defaultCheckedSectors = sectors.reduce(
        (defaultChecked, sector) => ({
          ...defaultChecked,
          [sector.SectorID]: selectedSectors.some(
            (selectedSector) => selectedSector.SectorID === sector.SectorID
          )
        }),
        {}
      );
      setCheckedItems(defaultCheckedSectors);
    }, []);
    

    更新checked 属性以使用SectorId

    <input
      className="mx-2 leading-tight"
      name={sector.Name}
      checked={checkedItems[sector.SectorID]} // <-- use SectorID
      onChange={(e) => handleInputChange(e, sector)}
      type="checkbox"
    />
    

    您还需要更新handleInputChange 以使用该扇区。 或者,您也可以简单地传递 SectorID 值。

    const handleInputChange = (event, sector) => { // <-- consume sector
      const { checked } = event.target;
      setCheckedItems(prev => ({
        ...prev,
        [sector.SectorID]: checked // <-- use sector for ID
      }))
    };
    

    【讨论】:

    • 我需要检查检查的值并将其传递给handleInputChange 以进行另一组操作。我将根据所选扇区显示另一组数据..
    • 你能提供你的解决方案的codeandbox示例吗?
    • @Undefined Sure...如果您需要保持选中状态并添加到沙箱的链接,我正在添加版本。
    【解决方案2】:

    您无需创建另一个包含选中项的数组。只需更改您的输入,例如-

    <input className="mx-2 leading-tight"
        name={sector.Name}
        checked={!!selectedSectors.find(item => item.SectorID === sector.SectorID)}
        onChange={(e) => handleInputChange(e, sector)}
        type="checkbox" />
    

    【讨论】:

      【解决方案3】:

      这整个方法并不完全是 React 的方法。在状态中应该有一个单一的事实来源来跟踪扇区的值以及是否被检查过。并且应该使用useState 的初始状态来确定最初检查的状态。

      查看 this code sandbox I forked from yours 以查看它以更 React-y 的方式重写

      【讨论】:

      • 为什么你在useState里面硬编码了数据?我不能硬编码那样的东西..
      • ...因为数据是硬编码在您的代码中的?你可以很容易地传入一个动态值,尽管那是另外一回事
      • 不一定 React 中的每个方面都应该被“控制”,所以你不能在不了解整个故事的情况下认为一段代码“不是反应方式”
      • 我只硬编码了实际应用中来自 api 的实际数据..
      • @vsync 我从来没有说过“React 中的一切都应该总是被控制”。我完全基于问题的用例和提供的代码,他们希望在其中跟踪复选框的选中状态并相应地呈现 UI。这是您使用受控组件的时候。虽然我可能会更具体一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多