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

React实现从API动态生成左侧分类菜单并保留切换功能

React 动态分类菜单实现指导

1. 新增分类数据的状态与API请求

先替换硬编码的分类数组,通过API异步获取分类数据,并维护对应的状态:

import { useState, useEffect } from 'react';

function App() {
  // 保留原有菜单数据与选中状态
  const [menuData, setMenuData] = useState([]);
  const [selectedCategory, setSelectedCategory] = useState('');
  
  // 新增分类相关状态
  const [categories, setCategories] = useState([]);
  const [isCategoriesLoading, setIsCategoriesLoading] = useState(true);

  // 异步请求分类数据
  useEffect(() => {
    const fetchCategories = async () => {
      try {
        const response = await fetch('你的分类API地址');
        const fetchedCategories = await response.json();
        // 手动添加"全部"选项(如果API未返回)
        const categoriesWithAll = [{ id: 'all', name: '全部' }, ...fetchedCategories];
        setCategories(categoriesWithAll);
        // 设置初始选中第一个分类
        setSelectedCategory(categoriesWithAll[0].id);
      } catch (err) {
        console.error('分类数据加载失败:', err);
      } finally {
        setIsCategoriesLoading(false);
      }
    };
    fetchCategories();
  }, []);

  // 原有菜单数据请求逻辑保留
  useEffect(() => {
    const fetchMenuData = async () => {
      const res = await fetch('你的菜单API地址');
      const data = await res.json();
      setMenuData(data);
    };
    fetchMenuData();
  }, []);
}

2. 动态渲染分类菜单

基于API返回的分类数据生成菜单,同时处理加载状态:

<div className="categories">
  {isCategoriesLoading ? (
    <div>加载分类中...</div>
  ) : categories.length === 0 ? (
    <div>暂无分类数据</div>
  ) : (
    categories.map(category => (
      <button
        key={category.id}
        className={`category-btn ${selectedCategory === category.id ? 'active' : ''}`}
        onClick={() => setSelectedCategory(category.id)}
      >
        {category.name}
      </button>
    ))
  )}
</div>

3. 适配并保留筛选逻辑

原筛选逻辑无需大幅改动,只需确保选中的分类ID与菜单数据的分类字段匹配:

const filteredMenu = menuData.filter(item => {
  if (selectedCategory === 'all') return true;
  // 此处需确保item.category与分类API返回的id字段一致
  return item.category === selectedCategory;
});

4. 异常场景优化

可添加分类加载失败的兜底提示,避免空白页面:

{!isCategoriesLoading && categories.length === 0 && (
  <div className="error提示">分类加载失败,请刷新重试</div>
)}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:25:35