React rerender
by evgkch
HTML
<div id="app"></div>
CSS
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
li {
margin: 8px 0;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
.done {
color: rgba(0, 0, 0, 0.3);
text-decoration: line-through;
}
input {
margin-right: 5px;
}
React
// If Item instance of Component - we have rerender
// If Item instance of PureComponent - it's ok
class Item extends React.PureComponent {
render(){
console.log('render')
return (
<li>
<label>
<input type="checkbox" checked={this.props.item.done} onChange={() => this.props.onChange(this.props.index)}/>
<span className={this.props.item.done ? "done" : ""}>{this.props.item.text}</span>
</label>
</li>
);
}
}
class TodoApp extends React.Component {
constructor(props) {
super(props)
this.state = {
items: [
{ text: "Learn JavaScript", done: false },
{ text: "Learn React", done: false },
{ text: "Play around in JSFiddle", done: true },
{ text: "Build something awesome", done: true }
],
flag: 0
}
}
onChange = index=> {
this.setState({ items: this.state.items.map((item, i) => {
if (index == i)
return {
done: item.done,
text: item.text + '*',
};
else
return item;
}) })
}
renderItem = (item, index)=>{
return (
<Item item={item} key={index} index={index} onChange={this.onChange} />
);
}
render() {
return (
<div>
<h2>Todos:</h2>
<ol>
{this.state.items.map(this.renderItem)}
</ol>
</div>
)
}
}
ReactDOM.render(<TodoApp />, document.querySelector("#app"))