MUI Menu组件报错不接受Fragment为子元素,求解释及解决方案
错误通俗解释
MUI的Menu组件有硬性要求:它的直接子元素必须是MenuItem(或MUI认可的菜单子组件),不能是React的Fragment(就是<></>这种空标签)。哪怕你没主动写<></>,如果代码结构导致Menu拿到的第一个子元素是Fragment(比如用Fragment包裹所有MenuItem,或是某个自定义组件返回Fragment给Menu当子元素),就会触发这个报错。
解决办法
1. 去掉包裹MenuItem的Fragment
检查Menu代码,确保没有用<></>或<React.Fragment>把所有MenuItem包起来。比如别写:
<Menu> <> <MenuItem>...</MenuItem> <MenuItem>...</MenuItem> </> </Menu>
改成直接把MenuItem作为Menu的子元素:
<Menu> <MenuItem>...</MenuItem> <MenuItem>...</MenuItem> </Menu>
2. 动态/条件渲染时返回数组而非Fragment
如果通过函数或条件逻辑生成MenuItem,别返回Fragment,要返回带唯一key的数组。比如把:
<Menu> {(() => { return ( <> <MenuItem>数据1</MenuItem> <MenuItem>数据2</MenuItem> </> ) })()} </Menu>
改成:
<Menu> {(() => { return [ <MenuItem key="data1">数据1</MenuItem>, <MenuItem key="data2">数据2</MenuItem> ] })()} </Menu>
3. 自定义菜单子组件别返回Fragment
如果把多个MenuItem封装成自定义组件,别让组件返回Fragment,要直接返回数组或裸MenuItem。比如把:
const CustomMenuItems = () => ( <> <MenuItem>数据1</MenuItem> <MenuItem>数据2</MenuItem> </> )
改成:
const CustomMenuItems = () => [ <MenuItem key="data1">数据1</MenuItem>, <MenuItem key="data2">数据2</MenuItem> ]
4. 排查自定义组件内部的隐性Fragment
如果你的Db1/Db2这类自定义组件内部用了Fragment,只要不是作为Menu的直接子元素就没问题;但如果Menu的直接子元素是返回Fragment的组件,就按上面的方法调整即可。
针对你提供代码的说明
你贴的官网示例代码本身没有问题,报错大概率是因为你使用DataMenu组件时,或是嵌套的自定义组件内部存在隐性Fragment,导致Menu的直接子元素变成了Fragment。按上面的步骤排查就能解决。
内容的提问来源于stack exchange,提问作者PineCone
相关产品推荐
相关产品推荐

