React
by Trina Lu
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
class CompareForm extends React.Component {
state = {
initPerson: {
name: '',
age: 0,
food: []
},
person: {
name: '',
age: 0,
food: []
}
}
static getDerivedStateFromProps(nextProps, prevState) {
console.log('getDerivedStateFromProps')
if (nextProps.initPerson !== prevState.initPerson) {
console.log('its new!', nextProps.initPerson, prevState.initPerson)
return {
initPerson: { ...nextProps.initPerson },
person: nextProps.initPerson
};
}
return null;
}
updateName = () => {
this.setState(state => {
return {
person: {
...state.person,
name: 'Usagit'
}
}
})
}
render() {
return (
<pre>
<button onClick={this.updateName}>Usagi!</button>
<code>{JSON.stringify(this.props, null, 4)}</code>
<code>{JSON.stringify(this.state, null, 4)}</code>
</pre>
)
}
}
class App extends React.Component {
state = {
name: 'Trina',
age: 12,
food: ['noodles', 'mos']
}
trina = {
name: 'Trina',
age: 12,
food: ['noodles', 'mos']
}
updateState = () => {
this.setState(state => {
return {
name: 'Sherry',
age: 25,
food: ['choco']
}
})
this.trina.name = 'Pisuke';
}
render() {
return (
<div>
<button onClick={this.updateState}>updateState</button>
<CompareForm initPerson={this.trina} />
</div>
)
}
}
ReactDOM.render(<App />, document.querySelector("#app"))