ContextMenu is a context menu build on React (16.8+) hooks. ContextMenu provides a quick and easy way to create instant context menus without having to build jsx. This component supports submenus, custom component menu items, and edge detection.
Using npm:
$ npm i contextmenu
https://codesandbox.io/s/62lnq93k3r
Import:
import useContextMenu from 'contextmenu';
import 'contextmenu/ContextMenu.css';
Build out your menu:
const menuConfig = {
'Say open': () => console.log('open'),
'Disabled': null,
'JSX line': <hr></hr>,
'JSX': <div style={{height: 40, border: '1px solid green'}}>yes</div>,
'Line': '---',
'Submenu': {
'Say wololol': () => console.log('wololol'),
'Go deeper': {
'Onceptioniningiong': () => console.log('inceptioniningiong'),
},
'Submenu 2': {
'electric': console.log,
'boogaloo': () => console.log('boogaloo'),
},
},
};
Render your menu in your component:
const [contextMenu, useCM] = useContextMenu({ submenuSymbol: 'O' });
return <div onContextMenu={useCM(menuConfig)}>{...}{contextMenu}</div>
ContextMenu is built off hooks, which means you must render it within React functional components.
props
is optionalprops
shape:
{
submenuSymbol: jsx; // which means jsx component or string or null
depth: number;
// more to be added later
}
- Returned from
useContextmenu()
which contains theReact.portal
to be rendered (ontodocument.body
) - Must be in your render function, anywhere.
menuConfig
is a JSON that determines what the rendered context menu looks like.- menuConfig shape:
{
[menu option name] :
| [option callback]
| [menuConfig]
| [jsx]
| "-----"
| null
}
- [menu option name] is used in conjection with [option callback] to create an option that does something
- [menu option name] is used in conjection with another
menuConfig
to create a submenu - [menu option name] is used with
null
when the item is disabled - [jsx] shows custom renderings inside menu options ([menu option name] is unused here)
- "---" is a shortcut to display a separation line between menu items ([menu option name] is unused)