React How to render nested dropdown list in a form from a json data? React How to render nested dropdown list in a form from a json data? json json

React How to render nested dropdown list in a form from a json data?


I would use ant design cascader for such a big data set. https://ant.design/components/cascader/ There are different components you can use and you don't need a recursion just pass your json as options. Sample usage:

import { Cascader } from 'antd';const options = [  {    value: 'zhejiang',    label: 'Zhejiang',    children: [      {        value: 'hangzhou',        label: 'Hangzhou',        children: [          {            value: 'xihu',            label: 'West Lake',          },        ],      },    ],  },  {    value: 'jiangsu',    label: 'Jiangsu',    children: [      {        value: 'nanjing',        label: 'Nanjing',        children: [          {            value: 'zhonghuamen',            label: 'Zhong Hua Men',          },        ],      },    ],  },];function onChange(value) {  console.log(value);}ReactDOM.render(  <Cascader options={options} onChange={onChange} placeholder="Please select" />,  mountNode,);


If you want to do nested lists, MenuItem is not the right component for this.

It's using the li tag as a base and this is why you're getting this warning.

I suggest you use an external package for this, material-ui-nested-menu-item, created exactly for this.

All you have to do is to replace MenuItem by its default NestedMenuItem component, wrap them with a Menu container and use the container ref:

<Menu  open={!!menuPosition}  onClose={() => setMenuPosition(null)}  anchorReference="anchorPosition"  anchorPosition={menuPosition}>  <MenuItem onClick={handleItemClick}>Button 1</MenuItem>  <MenuItem onClick={handleItemClick}>Button 2</MenuItem>  <NestedMenuItem    label="Button 3"    parentMenuOpen={!!menuPosition}    onClick={handleItemClick}  >    <MenuItem onClick={handleItemClick}>Sub-Button 1</MenuItem>    <MenuItem onClick={handleItemClick}>Sub-Button 2</MenuItem>    <NestedMenuItem      label="Sub-Button 3"      parentMenuOpen={!!menuPosition}      onClick={handleItemClick}    >      <MenuItem onClick={handleItemClick}>Sub-Sub-Button 1</MenuItem>      <MenuItem onClick={handleItemClick}>Sub-Sub-Button 2</MenuItem>    </NestedMenuItem>  </NestedMenuItem>  <MenuItem onClick={handleItemClick}>Button 4</MenuItem>  <NestedMenuItem    label="Button 5"    parentMenuOpen={!!menuPosition}    onClick={handleItemClick}  >    <MenuItem onClick={handleItemClick}>Sub-Button 1</MenuItem>    <MenuItem onClick={handleItemClick}>Sub-Button 2</MenuItem>  </NestedMenuItem></Menu>

Click here to see a CodeSandbox of its usage.

Another solution would be to make MenuItem use a different tag as base by providing the component prop.


If you pass component="div" to the MenuItem component, the error that you faced would be removed. sandbox

<MenuItem              onClick={() => console.log(123)}              component="div"              key={i.value}              value={i.value}            >