React mixin for HTML5 drag-and-drop sorting of items in a container
npm install --save react-html5-sortable
Use this library as a mixin into your list item components. Your list item component should have a reactKey
prop which is the unique, unchanging, key for the item. When a list item is dragged over another list item, the onMove(src, dest)
event will fire, which you can handle in your list component to change the data and re-render the list. src
will be the reactKey
prop for the list item being dragged, and dest
will be the reactKey
prop for the list item that the src
item is above.
The example below uses a simple array of strings, but as long as your list item components have a reactKey
prop, you can sort arrays of complex data structures with this module.
If your list item component has a dragHandle
ref, that element will be the only part of the item that can be grabbed to drag the item. If dragHandle
doesn't exist, the entire object can be grabbed.
var Sortable = require("react-html5-sortable");
var MyListItem = React.createClass({
mixins: [Sortable],
render: function() {
return <div>{this.props.text}</div>;
}
});
var MyList = React.createClass({
render: function() {
var items = this.props.items.map(function(item) {
return <MyListItem key={item} reactKey={item} text={item} onMove={this.props.onMove} />;
}.bind(this));
return <div>{items}</div>;
}
});
var items = ["First Item", "Second Item", "Third Item", "Fourth Item", "Fifth Item"];
// If you're using [Flux](https://facebook.github.io/flux/), this would probably live in your Store
function move(src, dest) {
var srcIdx = items.indexOf(src);
var destIdx = items.indexOf(dest);
if (srcIdx === -1 || destIdx === -1 || srcIdx === destIdx) {
return;
}
var item = items.splice(srcIdx, 1);
items.splice(destIdx, 0, item[0]);
render();
}
function render() {
React.render(<MyList items={items} onMove={move} />, document.getElementById("list-demo"));
}
render();
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.