You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React TreeView嵌套对象数组更新失败,求实现父子复选框联动

React TreeView嵌套节点联动选中问题

在React中实现TreeView组件时,无法正确更新嵌套对象数组的选中状态。期望点击父复选框时,自动选中所有层级的子复选框(例如点击「Mammal」时,自动选中Canidae、Dog、Fox、Wolf等所有子节点),但当前代码仅能修改单个节点的checked值,无法联动更新嵌套的子对象。恳请帮忙排查并修复代码,实现父节点复选框联动选中所有子节点的功能。

数据结构

const data = [
  {key: "mammal", label: "Mammal", isFolder: true, checked: false, nodes: [{key: "canidae", label: "Canidae", checked: false, nodes: [{key: "dog", label: "Dog", checked: false, nodes: [], url: "https://www.google.com/search?q=dog"},{key: "fox", label: "Fox", checked: false, nodes: [], url: "https://www.google.com/search?q=fox"},{key: "wolf", label: "Wolf", checked: false, nodes: [], url: "https://www.google.com/search?q=wolf"}], url: "https://www.google.com/search?q=canidae"}], url: "https://www.google.com/search?q=mammal"},
  {key: "reptile", label: "Reptile", isFolder: true, checked: false, nodes: [{key: "squamata", label: "Squamata", checked: false, nodes: [{key: "lizard", label: "Lizard", checked: false, nodes: [], url: "https://www.google.com/search?q=lizard"},{key: "snake", label: "Snake", checked: false, nodes: [], url: "https://www.google.com/search?q=snake"},{key: "gekko", label: "Gekko", checked: false, nodes: [], url: "https://www.google.com/search?q=gekko"}], url: "https://www.google.com/search?q=squamata"}], url: "https://www.google.com/search?q=reptile"}
];

当前递归更新代码

const updateObject = (labelkey, objectData, value) => {
    return objectData.map((object) => {
      if (object.label.trim() === labelkey.trim()) {
        object.checked = value;
      } else {
        if (
          object.nodes &&
          object.nodes.length > 0 &&
          typeof object.nodes === "object" &&
          object.nodes !== null
        ) {
          object.nodes = updateObject(labelkey, object.nodes, value);
        }
      }
      return object;
    });
  };
  
  const checkBoxChicked = (label) => {
    var newData = JSON.parse(JSON.stringify(treeData));
    const result = updateObject(label.label, newData, !label.checked);
    var resultData = JSON.parse(JSON.stringify(result));
    setTreeData(resultData);
  };

组件渲染代码

return (
    <div style={{ paddingLeft: "20px" }}>
      {treeData?.map((parent) => {
        return (
          <div key={parent.label}>
            {parent.isFolder && (
              <div className="parent">
                <input
                  type="checkbox"
                  id={parent.label}
                  name={parent.label}
                  value={parent.label}
                  checked={parent?.checked ? parent.checked : false}
                  onClick={() => checkBoxChicked(parent)}
                />
                <label for={parent.label}> {parent.label}</label>
              </div>
            )}
            {!parent.isFolder && (
              <div style={{ paddingLeft: "32px" }}>
                <input
                  type="checkbox"
                  id={parent.label}
                  name={parent.label}
                  value="Bike"
                  checked={parent?.checked ? parent.checked : false}
                  onClick={() => checkBoxChicked(parent)}
                />
                <label for={parent.label}>{parent.label}</label>
              </div>
            )}
            <div>
              {parent.nodes && parent.nodes.length > 0 && (
                <Family familyTree={parent.nodes} />
              )}
            </div>
          </div>
        );
      })}
    </div>
  );

内容的提问来源于stack exchange,提问作者SATISH RAJNALE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:24:55