ėŧīíŽëíļ State
setState()
State and Lifecycle
ėīëēĪíļ ėēëĶŽíęļ°
ėëĄęē ėęē ë ëīėĐėīęą°ë ėīíīíęļ° ėīë Īė ë ëķëķë§ ė ëĶŽ
setState()ë ėīëēĪíļ íļëĪëŽ ëīėė ëđëęļ°ė ėžëĄ ėíëëĪ.
setState()ę° ę°ė ėĢžęļ° ëė ėŽëŽ ëē íļėķëëĪëĐī ëĪėęģž ę°ėī ėžęīė ėžëĄ ėēëĶŽë ė ėëĪ.
const handleClick = () => {
this.setState({quantity: this.state.quantity + 1});
this.setState({quantity: this.state.quantity + 1});
};
ėīë ëĪė ė―ëė ëėží ęē°ęģžëĨž ėķë ĨíëĪ.
// Object.assgin()ė ę°ėēīëĪė ëŠĻë ėīęą° ę°ëĨí ėėēī ėėąė ëģĩėŽíī ëė ę°ėēīė ëķėŽëĢė í ėīëĨž ë°ííë ëĐėëėīëĪ
Object.assign(
previousState, // ëė ę°ėēī
{quantity: state.quantity + 1},
{quantity: state.quantity + 1}, // ęģė ëŪėīė°ęļ°í ëŋėīëĪ
...
);
ėíë ëëĄ ëĪė state ę°ėī ėīė state ę°ė ęļ°ë°íëëĄ íęļ° ėíīėë setState()ė ėļėëĄ íĻėëĨž ëĢėīėĪėž íëĪ.
const handleClick = () => {
this.setState((state) => {
return {quantity: state.quantity + 1};
});
};
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('root')
);
}
setInterval(tick, 1000);
ėė ę°ė íĻė ėŧīíŽëíļëĨž classëĄ ëģííëĪ. (React ėŧīíŽëíļė this ė°ļęģ )
cf. ė―ë°ą íĻė ëīëķėėė thisë, íīëđ ė―ë°ąíĻėė ė ėīęķė ëęēĻë°ė íĻė(ėë ėė ė ęē―ė°ėë setInterval)ę° ė ėí ë°ė ë°ëĨīëĐ°, ė ėíė§ ėė ęē―ė°ėë ė ė ę°ėēīëĨž ė°ļėĄ°íëĪ.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
this.handleState = this.handleState.bind(this); // 3. thisëĨž ë°ėļëíīėĪŽëĪ
console.log(this); // Clock {...}
}
componentDidMount() { // ðĄ ėŧīíŽëíļę° ėēė ë ëë§ ëëĐī íļėķëĻ
this.timer = setInterval(this.handleState, 1000);
// 4. thisëĨž ë°ėļëíė§ ėėžë ĪëĐī ėŽęļ°ė íėīí íĻėëĨž ėŽėĐíīėž íëĪ
// () => this.handleState()
}
handleState() {
console.log(this); // 1. ėŽęļ°ė thisë ė ė ę°ėēīėīęļ° ëëŽļė
this.setState((state) => { // 2. ėŽęļ°ė ė―ëę° ëŽļė ėėī ėĪíëëëĄ íęļ° ėíī
return { date: new Date() };
});
}
UNSAFE_componentWillUnmount() { // ðĄ ėŧīíŽëíļė ėíī ėėąë DOMėī ėė ëëĐī íļėķëĻ
clearInterval(this.timer);
console.log(this); // cf. ëĪëĨļ ėëŠ
ėĢžęļ° ëĐėëëĪ ëīëķė thisë Clock {...} ėīëĪ
}
render() { // ðĄ ėŧīíŽëíļ ëīėė ë°ëė ęĩŽíëėīėž í ė ėží íė ëĐėë
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById("root")
);
íđė ëĪėęģž ę°ėī ėėąí ėë ėëĪ.
const Clock = () => {
const [date, setDate] = useState(new Date());
const updateDate = () => {
setInterval(() => setDate(new Date()), 1000);
};
useEffect(updateDate, []); // ėŧīíŽëíļę° ėēė ë ëë§ ëëĐī ėĪíëĻ
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {date.toLocaleTimeString()}.</h2>
</div>
);
};
const App = () => {
return (
<div>
<Clock />
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById("root")
);
ES6 classė ëģļëŽļė ęļ°ëģļė ėžëĄ strict modeėė ėĪíëëĪ.
ėīëēĪíļ íļëĪëŽ íĻė ëīëķėėė thisë ë°ėļëĐ íīėĢžė§ ėë í undefinedė ę°ė ę°ė§ëĪ.
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
this.handleClick = this.handleClick.bind(this); // thisëĨž ë°ėļëíīėĪŽëĪ. ë§ė― thisëĨž ë°ėļëíė§ ėėëĪëĐī
}
handleClick() {
console.log(this); // ėŽęļ°ė thisë undefinedę° ëėī
this.setState(prevState => ({ // ėī ė―ëëĨž ėĪíí ë ëŽļė ę° ë°ėíė ęēėīëĪ
isToggleOn: !prevState.isToggleOn
}));
}
add() {
console.log(this);
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
ReactDOM.render(
<Toggle />,
document.getElementById('root')
);
react controlled
react ę°ė ëĢęļ°