Add contextmenu to your react component with ease
npm install react-contexify-pfAdd a context menu to your react application with ease !
* Demo
* Installation
* Features
* How it works ?
* Add a context menu to a table
* Api
* Migration from v1 to v2
* Release Notes
```
$ yarn add react-contexify
or
$ npm install --save react-contexify
You also need to include the css file provided. Otherwise it wont work as expected.
`javascript`
import 'react-contexify/dist/ReactContexify.min.css'
` `
- The context menu never leave the visible screen. You can reduce the window to check the behavior
- The callback provide an access to the wrapped component
- One menu can be use for multiple targets
- Create as many contextual menu as you want, as long as the id is unique
- Easily customizable. Theme are split into different sass file. Fifteen line of code can be enough to create a theme
- Don't rely on findDOMNode
`javascript
import { ContextMenu, Item, Separator, IconFont } from 'react-contexify';
function onClick(targetNode, ref, data) {
// targetNode refer to the html node on which the menu is triggered
console.log(targetNode);
//ref will be the mounted instance of the wrapped component
//If you wrap more than one component, ref will be an array of ref
console.log(ref);
// Additionnal data props passed down to the Item
console.log(data);
}
// create your menu first
const MyAwesomeMenu = () => (
Add
Remove
Paste
);
`
`javascript
import { ContextMenuProvider, menuProvider } from 'react-contexify';
//wrap your component with the ContextMenuProvider
const Foo = () =>
const Bar = () =>
// or you can use the curried function to add the same menu for many components, it's up to you
const addContextMenu = menuProvider('menu_id');
const Foo = addContextMenu(YourComponent);
const Bar = addContextMenu(YourCompoenent);
`
`javascript
import React from 'react';
import MyAwesomeMenu from './MyAwesomeMenu';
import Foo from './Foo';
import Bar from './Bar';
const App = () => (
ReactDOM.render(
document.getElementById('root')
);
`
`javascript
import { ContextMenuProvider } from 'react-contexify';
//You need to use a tr as a render tag otherwise your browser console will bleed !
const Tr = (props) => (
{props.cel1}
{props.cel2}
);
class Table extends Component {
render() {
return (
| Cel 1 | Cel 2 |
|---|---|
`
|Props |Type |Default|Required|Possible Value | Description|
|---------|-------|:-----:|:------:|-----------------------------------------------|------------|
|id | string\|int|- | ✓ | - |Used to identify the corresponding menu|
|children | Item\|null|- | ✓ | - |Menu item|react-contexify__theme--${given theme}
|theme | string| | ✘ | light \| dark |Theme is appended to |.react-contexify__will-enter--${given animation}
|animation| string| | ✘ | fade \| flip \| pop \| zoom|Animation is appended to |
You can set built-in theme and animation using ContextMenu constant as follow :
...
|Props |Type |Default|Required|Description|
|---------|--------|:-----:|:------:|------------|
|children |node |- |✓ |Any valid node to render(string, react component...)
|leftIcon |node | |✘ |Any valid node to render(string, react component...)
|rightIcon |node | |✘ |Any valid node to render(string, react component...)
|disabled |bool |false |✘ |Disable the item
|onClick |function| |✘ |Callback when the item is clicked
|data |any | |✘ |Additional data that will be passed to the callback
#### onClick targetNode
When an you select an Item your callback will receive 3 parameters: , refs, data.
- if you wrap a single react component refs will be the mounted instance of the wrapped component
- If you wrap more than one component refs will be an array of ref
ref will be an instance of the react component only if the component is declared as a class
If you use any flux store like redux or mobx stick with it.
For more details about ref please read this
Don't expect any props. It's just a separator xD.
|Props |Type |Default|Required| Description|
|---------|-------|:-----:|:------:|------------|
|children | node|- |✘ |Menu item|
|className | string| | ✘ | Additional className|
|style| string| | ✘ | Additional style |
The icon font render a i tag.
`javascript`
//example with Font Awesome
//example with material icons
|Props |Type |Default|Required|Possible Value |Description|
|---------|--------|:-----:|:------:|------------|----|
|id |string or int| -| ✓| -| Id used to map your component to a context menu
|renderTag|node| div| ✘| -| The render tag of the wrapper
|event| string| onContextMenu| ✘| Same as React Event (onClick, onContextMenu ...)| Event to trigger the context menu
|className| string| | ✘| | Additional className
|style| object| | ✘| | Additional style
`javascript`
const Foo = () =>
|Args |Type |Default|Required|Possible Value |Description|
|---------|--------|:-----:|:------:|------------|----|
|id |string| -| ✓| -| Id used to map your component to a context menu
- Function returned by menuProvider expect :
|Args |Type |Default|Required|Possible Value |Description|
|---------|--------|:-----:|:------:|------------|----|
|targetComponent|React Component| -| ✓| -| The component on which you want to add a context menu
|renderTag|node| div| ✘| -| The render tag of the wrapper
|event| string| onContextMenu| ✘| Same as React Event (onClick, onContextMenu ...)| Event to trigger the context menu
|className| string| | ✘| | Additional className
|style| object| | ✘| | Additional style
Breaking changes are a pain for developers but sometimes we have too.
Item Component:
You can render whatever you want now, which gives you more control.
`javascript`
//before
// now`
onClick callback:
Having access to the instance of the react component can be sometimes really useful.javascript`
//before
onClick(targetNode, data)
// now
onClick(targetNode, refs, data)
- Fix child references. Thanks to @kinke
- Fixed issue 33
- Removed Proxy Container.
- Fixed for real ! issue 27
- Context menu is now rendered outside of the main react root component to avoid the fixed position being broken by the parent style. For more details please see issue 27
- Simplified implementation Pull Request #22
- Typo fix in documentation
- Pass props down to menuProvider function
- Will now hide menu on mousedown.Relate to issue 19
- Added flag noIdents to cssnano to avoid animation name collision with other libs
#### Bug Fix
- Fixed zoom animation
- Minor code cleanup
#### Bug Fix
- Firefox trigger a click event also on context menu which was making the menu disappear.
Relate to issue 16
#### Bug Fixes
- Fix issue #14
#### Bug Fixes
- conditional rendering was badly tested, shame on me !
- This version introduce breaking changes for the item component
- Upgrade to prop-types
- Tested with jest and enzyme
- Reviewed build system
- The onClick callback provide a ref to the wrapped componentIconFont` component
- Can now use condtionnal rendering for dynamic menu. Relate to issue 12
- Added
#### Bug Fixes
- Fixed right click behavior. Relate to issue 11
#### Features
- Added possibility to set the render tag for the wrapper
- Added a ContextMenuProvider component
- Added possibility to set className and style to ContextMenuProvider
- Removed ContextMenuProvider style.Was too unpredictable
#### Bug Fixes
- fixed incorrect PropTypes used
- dead code elimination
Any idea and suggestions are welcome.
Big thanks to Tobias Reich. This project is based on basicContext. A vanilla js context menu.
React Contexify is licensed under MIT.