기존 Class Components의 단점을 보완하기 위해 React팀에서 개발했다.
(Components 재사용이 어려움, 복잡한 Component 이해가 어려움, JavaScript의 this의 문제점)
최상위에서만 Hook을 호출해야 한다. 반복문, 조건문, 중첩된 함수 내에서 사용 금지
Functional Components 와 Custom Hook에서만 사용 가능
1: import React, { useState } from 'react'; 2:
3: function Example() {
4: const [count, setCount] = useState(0); 5:
6: return (
7: <div>
8: <p>You clicked {count} times</p>
9: <button onClick={() => setCount(count + 1)}>10: Click me
11: </button>
12: </div>13: );
14: }
useEffect = componentDidMount + componentDidUpdate + componentWillUnmount
<Class Components>
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() { document.title = `You clicked ${this.state.count} times`; } componentDidUpdate() { document.title = `You clicked ${this.state.count} times`; }
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
<Hook>
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => { document.title = `You clicked ${count} times`; });
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
componentWillUnmount에서 따로 적용했던 구독해지를 useEffect내부에서 적용할 수 있다.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});