【问题标题】:React: conditionally render an item in the menuReact:有条件地在菜单中渲染一个项目
【发布时间】:2021-02-23 12:50:36
【问题描述】:

我正在使用带有 Material-UI 的 React。 我正在以下拉菜单的形式开发一个简单的 UI。我想通过作为道具传递的条件来控制第一行的渲染。如何使用条件渲染或跳过第一行的渲染?

export const NativeSdkMenu = memo(({ showFirstMenuItem }) => (
  <Menu>
    <MenuItem component="a" href={link1}>
      {"First"}
    </MenuItem>
    <MenuItem component="a" href={link1}>
      {"Second"}
    </MenuItem>
    <MenuItem component="a" href={link1}>
      {"Third"}
    </MenuItem>
    <MenuItem component="a" href={link1}>
      {"Fourth"}
    </MenuItem>
  </Menu>
));

显然这不起作用:

if (showFirstMenuItem) {
    <MenuItem component="a" href={link1}>
      {"First"}
    </MenuItem>
}

我尝试了一些类似的方法,但看起来我需要使用一些我不知道的特定 JSX 语法。

【问题讨论】:

标签: reactjs material-ui react-functional-component conditional-rendering


【解决方案1】:

根据您的示例并假设您的道具 showFirstMenuItem 是一个布尔值,如果您的 showFirstMenuItem 为真,您可以简单地使用 && 运算符来显示第一项:

export const NativeSdkMenu = memo(({ showFirstMenuItem }) => (
 <Menu>
  {showFirstMenuItem && (
    <MenuItem component="a" href={link1}>
      {"First"}
   </MenuItem>)}
   <MenuItem component="a" href={link1}>
    {"Second"}
   </MenuItem>
   <MenuItem component="a" href={link1}>
     {"Third"}
   </MenuItem>
   <MenuItem component="a" href={link1}>
    {"Fourth"}
   </MenuItem>
  </Menu>
  ));

【讨论】:

  • 优秀的解决方案。将整个菜单项括在括号中 () 是我的少数方法不起作用的根本原因。
  • 不客气,你可以看看这篇文章,看看其他一些条件渲染的方法:robinwieruch.de/conditional-rendering-react
  • 谢谢,在尝试我的一些方法之前,我实际上已经看过那篇文章......
【解决方案2】:

其实很简单

export const NativeSdkMenu = memo(({ showFirstMenuItem }) => (
  <Menu>
   {showFirstMenuItem && <MenuItem component="a" href={link1}>
   {"First"}
  </MenuItem>}
  <MenuItem component="a" href={link1}>
   {"Second"}
  </MenuItem>
  <MenuItem component="a" href={link1}>
   {"Third"}
  </MenuItem>
  <MenuItem component="a" href={link1}>
   {"Fourth"}
  </MenuItem>
</Menu>
));

【讨论】:

  • 方向不错,但我还必须在整个 MenuItem 周围添加 () 以使其编译。
【解决方案3】:

您可以使用您的 prop 值有条件地设置 css 类:

<MenuItem component="a" href={link1} className={this.props.showFirstMenuItem ? style['your-class-name'] : ''}>
  {"First"}
</MenuItem>

【讨论】:

  • 我更喜欢基于反应的解决方案,这样我就不必修改样式/创建类,但感谢您的帮助!
  • 对不起,我看错了,我以为你想以不同的方式呈现,而不仅仅是显示/隐藏!!
  • 没问题。我只想通过使用外部传递的道具控制菜单中的第一个(或任何其他项目)来隐藏/显示它。
猜你喜欢
  • 2020-10-25
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多