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

React嵌套数组.map渲染导航菜单的key属性报错问题

解决React列表key属性报错问题

问题根源分析

你遇到的报错有两个核心原因:

  1. Fragment缺少key:渲染带子女菜单的父项时,你用<>(短语法Fragment)包裹了<li>和子菜单<div>,这个Fragment作为navMenuItems.map返回的列表项,必须添加唯一key。短语法Fragment不支持key属性,需使用完整的React.Fragment组件。
  2. 子菜单map未返回元素:子菜单的map函数中,你用了花括号但未显式返回<Link>组件,导致实际渲染的是undefined数组,即便加了key也无效。

修复后的完整代码

import React from 'react';

const navMenuItems = [
    { name: 'Home', url: '#' },
    {
      name: 'Skincare Goal',
      url: '#',
      childMenuItems: [
        { name: 'Anti-Aging', url: '/categories/anti-aging' },
        { name: 'Wound Healing', url: '/categories/wound-healing' },
        { name: 'Acne-Fightning', url: '/categories/acne-fightning' },
        { name: 'Brightening', url: '/categories/brightening' },
        { name: 'UV Protection', url: '/categories/uv-protection' },
      ],
    },
    {
      name: 'Ingredients',
      url: '#',
      childMenuItems: [
        { name: 'AHA (All Types)', url: '/ingredients/aha' },
        { name: 'Anti-Aging', url: '/ingredients/bha' },
        { name: 'BHA (Salicylic Acid)', url: '/ingredients/anti-aging' },
        { name: 'PHA (All Types)', url: '/ingredients/pha' },
        { name: 'Niacinamide', url: '/ingredients/niacinamide' },
        { name: 'Vitamin A', url: '/ingredients/vitamin-a' },
        { name: 'Hyaluronic Acid', url: '/ingredients/hyaluronic-acid' },
        { name: 'Ceramides', url: '/ingredients/ceramides' },
        { name: 'Azelaic Acid', url: '/ingredients/azelaic-acid' },
      ],
    },
];

const Navbar = () => {
  return (
    <ul>
      {navMenuItems.map((item) => {
        const parentKey = item.name.replace(' ', '');
        if (!Array.isArray(item.childMenuItems) || !item.childMenuItems.length) {
          return (
            <li key={parentKey}>
              <Link href={item.url}>{item.name}</Link>
            </li>
          );
        } else {
          return (
            <React.Fragment key={parentKey}>
              <li>
                <Link href={item.url}>{item.name}</Link>
              </li>
              <div>
                {item.childMenuItems.map((childItem) => (
                  <Link
                    key={childItem.name.replace(' ', '')}
                    href={childItem.url}
                  >
                    {childItem.name}
                  </Link>
                ))}
              </div>
            </React.Fragment>
          );
        }
      })}
    </ul>
  );
};

export default Navbar;

关键修复点说明

  • 给Fragment添加key:将短语法<>替换为<React.Fragment key={parentKey}>,确保navMenuItems.map返回的每个列表项都有唯一key。
  • 修复子菜单map的返回逻辑:把子菜单map的花括号{}改成圆括号(),实现箭头函数的隐式返回;或者保留花括号并添加return关键字,确保<Link>组件被正确返回。
  • 额外修复:原数组中"AHA (All Types"缺少闭合括号,已补充为"AHA (All Types)",避免渲染异常。

优化建议

  • 尽量使用稳定且唯一的标识作为key,比如后续给菜单项添加id字段,优先用item.id和childItem.id,比基于名称的替换更可靠,避免名称重复导致key冲突。
  • 子菜单的<div>建议包裹在<li>内,符合HTML语义化规范(ul的直接子元素只能是li),可调整结构为:
<React.Fragment key={parentKey}>
  <li>
    <Link href={item.url}>{item.name}</Link>
    <div>
      {/* 子菜单Link */}
    </div>
  </li>
</React.Fragment>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:27:32