<div id='container'></div>
var SearchableList = React.createClass({
  // render, renderItems
  // state - filter
  // properties = items
  getInitialState: function() {
    return { filter: '' }
  },
  mixins: [React.addons.LinkedStateMixin],
  propTypes: {
    items: React.PropTypes.arrayOf(React.PropTypes.shape({
      name: React.PropTypes.string.isRequired,
      id: React.PropTypes.number.isRequired
    })).isRequired
  },
  renderItems: function(filter) {
    var items = _.filter(this.props.items, function(item) {
      return item.name.indexOf(filter) > -1;
    });
    
    return items.map(function(item) {
      return <li>{item.name}</li>
    });
  },
  render: function() {
      return (
      	<div>
        	<input type='text' valueLink={this.linkState('filter')} />
      		<ul>
        		{this.renderItems(this.state.filter)}
        	</ul>
        </div>
      )
    }
});

 var items = [
  { name: 'sunday', id: 1 }, 
  { name: 'monday', id: 2 }, 
  { name: 'tuesday', id: 3 },
  { name: 'wednesday', id: 4 },
  { name: 'thursday', id: 5 }, 
  { name: 'friday', id: 6 },
  { name: 'saturday', id: 7 }
];
React.render(<SearchableList items={items} />, document.getElementById('container'));

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://codepen.io/chriscoyier/pen/yIgqi.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/react-with-addons.js
  3. https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/JSXTransformer.js
  4. https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js