Drag & drop, touch enabled, reorder / sortable list, React component
If you are using v3 alpha, please refer to this documentation.
React Reorder is a React component that allows the user to drag-and-drop items in a list (horizontal / vertical) or a grid.
It fully supports touch devices and auto-scrolls when a component is being dragged (check out the demo, link below).
It also allows the user to set a hold time (duration before drag begins) allowing additional events like clicking / tapping to be applied.
Although this project is very new, it has been thoroughly tested in all modern browsers (see supported browsers).
-
Using npm
npm install react-reorder
Add
--saveor-Sto update your package.json -
Using bower
bower install react-reorder
Add
--saveor-Sto update your bower.json
-
If using requirejs: add
react-reorderto yourrequire.configpaths: // <name> : <path/to/module> 'react-reorder': 'react-reorder/reorder' }
-
If using a module loader (requirejs / browserfiy / commonjs): require
react-reorderwhere it will be used in your projectvar Reorder = require('react-reorder');
If using requirejs you'll probably want to wrap your module e.g.
define(function (require) { // Require react-reorder here });
-
Configuration
Note: If your array is an array of primitives (e.g. strings) then
itemKeyis not required as the string itself will be used as the key, however item keys must be unique in any case-
Using JSX
<Reorder // The key of each object in your list to use as the element key itemKey='name' // Lock horizontal to have a vertical list lock='horizontal' // The milliseconds to hold an item for before dragging begins holdTime='500' // The list to display list={[ {name: 'Item 1'}, {name: 'Item 2'}, {name: 'Item 3'} ]} // A template to display for each list item template={ListItem} // Function that is called once a reorder has been performed callback={this.callback} // Class to be applied to the outer list element listClass='my-list' // Class to be applied to each list item's wrapper element itemClass='list-item' // A function to be called if a list item is clicked (before hold time is up) itemClicked={this.itemClicked} // The item to be selected (adds 'selected' class) selected={this.state.selected} // The key to compare from the selected item object with each item object selectedKey='uuid' // Allows reordering to be disabled disableReorder={false} />
-
Using standard Javascript
React.createElement(Reorder, { // The key of each object in your list to use as the element key itemKey: 'name', // Lock horizontal to have a vertical list lock: 'horizontal', // The milliseconds to hold an item for before dragging begins holdTime: '500', // The list to display list: [ {name: 'Item 1'}, {name: 'Item 2'}, {name: 'Item 3'} ], // A template to display for each list item template: ListItem, // Function that is called once a reorder has been performed callback: this.callback, // Class to be applied to the outer list element listClass: 'my-list', // Class to be applied to each list item's wrapper element itemClass: 'list-item', // A function to be called if a list item is clicked (before hold time is up) itemClicked: this.itemClicked, // The item to be selected (adds 'selected' class) selected: this.state.selected, // The key to compare from the selected item object with each item object selectedKey: 'uuid', // Allows reordering to be disabled disableReorder: false })
-
-
Callback functions
-
The
callbackfunction that is called once a reorder has been performedfunction callback(event, itemThatHasBeenMoved, itemsPreviousIndex, itemsNewIndex, reorderedArray) { // ... }
-
The
itemClickedfunction that is called when an item is clicked before any dragging beginsfunction itemClicked(event, itemThatHasBeenClicked, itemsIndex) { // ... }
Note:
eventwill be the synthetic React event for eithermouseuportouchend, and both containclientX&clientYvalues (for ease of use)
-
-
Version
2.xtested and working with React0.14 -
Versions
1.xtested and working with React0.12-0.13 -
requirejs / commonjs / browserify (Optional, but recommended*)
* Has only been tested with requirejs & browserify
-
Internet Explorer 9+ (may support IE8**)
-
Google Chrome (tested in version 39.0.2171.95(64-bit))
-
Mozilla Firefox (tested in version 33.0)
-
Opera (tested in version 26.0.1656.60)
-
Safari (tested in version 7.1.2 (9537.85.11.5))
** Have not had a chance to test in IE8, but IE8 is supported by React
-
Chrome (tested in version 40.0.2214.89)
-
Safari (tested on iOS 8)
- Internet Explorer 8*** (the lowest version that React supports)
*** If anyone could confirm that this works in IE8, that'd be awesome