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

React中使用react-simple-tree-menu从API加载渲染省份树形菜单

解决react-simple-tree-menu从API获取数据渲染树形菜单的问题

问题描述

我在使用react-simple-tree-menu组件展示省份名称树形菜单时遇到了问题,预期效果如图所示,但不知道如何从指定API端点获取数据并进行渲染,请求帮助。
API端点地址:https://www.mocky.io/v3/4c38e8a1-aa12-484d-900e-2c67726a09bf
现有代码如下:

import React from "react";
import TreeMenu from "react-simple-tree-menu";
import "react-simple-tree-menu/dist/main.css";

<TreeMenu
  cacheSearch
  data={[
    {
      key: "provinsi",
      label: "Provinsi",
      nodes: [
        {
          key: "aceh",
          label: "ACEH",
          nodes: [
            {
              key: "total_building",
              label: "902705",
              nodes: [],
            },
          ],
        },
        {
          key: "bali",
          label: "BALI",
          nodes: [
            {
              key: "total_building",
              label: "1584831",
              nodes: [],
            },
          ],
        },
        {
          key: "banten",
          label: "BANTEN",
          nodes: [
            {
              key: "total_building",
              label: "2043597",
              nodes: [],
            },
          ],
        },
      ],
    },
  ]}
  debounceTime={125}
  disableKeyboard={false}
  hasSearch={false}
  onClickItem={function noRefCheck() {}}
  resetOpenNodesOnDataUpdate={false}
/>

解决方案

1. 核心思路

通过React的useState存储树形数据,useEffect发起API请求,将返回的数据转换为组件要求的结构后,传入TreeMenu的data属性即可。

2. 完整代码示例

import React, { useState, useEffect } from "react";
import TreeMenu from "react-simple-tree-menu";
import "react-simple-tree-menu/dist/main.css";

const ProvinceTree = () => {
  // 存储适配后的树形菜单数据
  const [treeData, setTreeData] = useState([]);

  useEffect(() => {
    // 异步获取API数据并处理格式
    const fetchAndFormatData = async () => {
      try {
        const response = await fetch("https://www.mocky.io/v3/4c38e8a1-aa12-484d-900e-2c67726a09bf");
        const rawProvinces = await response.json();
        
        // 转换为react-simple-tree-menu要求的结构
        const formattedTree = [
          {
            key: "provinsi",
            label: "Provinsi",
            nodes: rawProvinces.map(province => ({
              key: province.province_name.toLowerCase().replace(/\s/g, ""),
              label: province.province_name,
              nodes: [
                {
                  key: `${province.province_name}-total`,
                  label: province.total_building.toString(),
                  nodes: []
                }
              ]
            }))
          }
        ];

        setTreeData(formattedTree);
      } catch (err) {
        console.error("数据获取失败:", err);
      }
    };

    fetchAndFormatData();
  }, []);

  return (
    <TreeMenu
      cacheSearch
      data={treeData}
      debounceTime={125}
      disableKeyboard={false}
      hasSearch={false}
      onClickItem={() => {}} // 可根据需求自定义点击逻辑
      resetOpenNodesOnDataUpdate={false}
    />
  );
};

export default ProvinceTree;

关键细节说明

  • 数据格式转换:API返回的是包含province_name和total_building的数组,需要将每个省份映射为组件要求的节点结构,确保每个节点有唯一的key值。
  • 异步请求处理:利用async/await处理API请求,放在useEffect中保证组件挂载时仅执行一次请求。
  • 错误捕获:添加try/catch捕获请求异常,便于调试排查问题。

内容的提问来源于stack exchange,提问作者Kia Kalista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:40:43