Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ant design: Wrapping a menu item into a custom component

I'm playing around with ant-design and trying to structure a simple menu, and everything works as expected:

<Menu mode="inline">
  <Menu.Item key="/">
    <Icon type="dashboard" theme="outlined" />
    Dashboard
  </Menu.Item>
  <Menu.Item key="/transactions">
    <Icon type="bars" theme="outlined" />
    Transactions
  </Menu.Item>
  <Menu.Item key="/groups">
    <Icon type="team" theme="outlined" />
    Groups
  </Menu.Item>
  <Menu.Item key="/account">
    <Icon type="idcard" theme="outlined" />
    Account
  </Menu.Item>
</Menu>

(https://codesandbox.io/s/wqn37ojmv7)

Now, I wanted to DRY up this code a bit, by making a separate wrapped MenuItem component:

const MenuItem = ({route, icon, children}) => (
  <Menu.Item key={route}>
    <Icon type={icon} theme="outlined" />
    {children}
  </Menu.Item>
);

// ...
<Menu mode="inline">
  <MenuItem route="/" icon="dashboard">Dashboard</MenuItem>
  <MenuItem route="/transactions" icon="bars">Transactions</MenuItem>
  <MenuItem route="/groups" icon="team">Groups</MenuItem>
  <MenuItem route="/account" icon="idcard">Account</MenuItem>
</Menu>

However, substituting my shiny new component will pretty much break everything - somehow I seem to lose some props that were magically passed to the Menu.Items before (like a clsPrefix or a onItemHover-callback): https://codesandbox.io/s/ojyqy0oqq6

What is going on here? How are these props passed behind the scenes and how can I wrap Menu.Item correctly without losing all of this magic?

like image 622
DeX3 Avatar asked Oct 15 '18 18:10

DeX3


People also ask

Is antd heavy?

antd is 348kB uncompressed.

Is ant design easy to use?

Ant Design is a React UI library that contains easy-to-use components that are useful for building interactive user interfaces. It is very easy to use as well as integrate. It is one of the smart options to design web applications using react. It provides us with high-quality components which can be used with ease.


1 Answers

You could pass the rest of the passed props

const MenuItem = ({route, icon, children, ...props}) => ( 
    <Menu.Item key={route} {...props}> 
        <Icon type={icon} theme="outlined" />
        {children}
    </Menu.Item> );
like image 167
Gabriele Petrioli Avatar answered Sep 23 '22 10:09

Gabriele Petrioli