React Toggle List Item background
by Faria Chowdhury
July 14, 2015
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/JSXTransformer.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/react-with-addons.js"></script>
<script src="https://facebook.github.io/react/js/jsfiddle-integration.js"></script>
<div id="app">
<!-- This element's contents will be replaced with your component. -->
</div>
JavaScript 1.7
var ListItem = React.createClass({
propTypes: {
onClick: React.PropTypes.func.isRequired,
isSelected: React.PropTypes.bool
},
getDefaultProps: function() {
return {
isSelected: false
};
},
getInitialState: function() {
return {
hover_flag: false
};
},
hoverEvent: function() {
this.setState({hover_flag: !this.state.hover_flag});
},
render: function() {
var liStyle = {
background: '#eee'
};
if (this.props.isSelected || this.state.hover_flag) {
liStyle['background'] = '#ff7f7f';
}
return (
<li
onClick={this.props.onClick}
onMouseEnter={this.hoverEvent}
onMouseLeave={this.hoverEvent}
style={liStyle}>{this.props.name}
</li>
);
}
});
var List = React.createClass({
getInitialState: function() {
return {
selectedItem: null
};
},
clickHandler: function(idx) {
this.setState({selectedItem: idx});
},
render: function() {
var ulStyle = {
padding: '0px',
margin: '20px'
};
var items = this.props.data.map(function (item, idx) {
var is_selected = this.state.selectedItem == idx;
return <ListItem
key={idx}
name={item.name}
onClick={this.clickHandler.bind(this, idx)}
isSelected={is_selected}
/>;
}.bind(this));
return (
<ul style={ulStyle}>
{items}
</ul>
);
}
});
var App = React.createClass({
render: function() {
var data = [];
for (var i=0; i<10; i++) {
data.push({name: 'Item ' + i});
}
return (
<div>
<List data={data} />
</div>
);
...