<main></main>
var Sortable = React.createClass({
  getInitialState: function() {
    return { items: this.props.items };
  },
  
  componentDidMount: function() {
    var $el = $(React.findDOMNode(this.refs.root));
    $el.sortable({ stop: this.onUpdate });
  },
  
  componentWillUnmount: function() {
    $el.sortable('destroy');
  },
  
  onUpdate: function(ev, ui) {
    var $el = $(React.findDOMNode(this.refs.root));
    var arr = $el.sortable('toArray', { attribute: 'data-val'});
    this.setState({items: arr});
  },
  
  render: function() {
    return <ul ref="root">
      {_.map(this.state.items, this.render_item)}
      </ul>
  },
  
  render_item: function(item) {
    return <li data-val={item} key={item}>{item}</li>
  }
});

var items = ['one', 'two', 'three', 'four'];
React.render(<Sortable items={items} />, document.querySelector('main'));
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-alpha1/jquery.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js
  3. https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.min.js
  4. https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js