Hooks는 리액트 v16.8에 새로 도입된 기능으로, 함수형 컴포넌트에서도 상태 관리를 할 수 있는 useState, 렌더링 직후 작업을 설정하는 useEffect 등의 기능을 제공하여 기존의 함수형 컴포넌트에서 할 수 없었던 다양한 작업을 할 수 있게 해준다.
// ( App.js )
import React, { useState, useEffect } from 'react';
function App() {
const [ name, setName ] = useState('');
const [ nickname, setNickname ] = useState('');
const onChangeName = (e) => {
setName(e.target.value);
}
const onChangeNickname = (e) => {
setNickname(e.target.value);
}
useEffect( () => {
console.log("렌더링이 완료되었습니다!");
console.log({
name,
nickname
});
});
return (
<div>
<p>현재 카운터값은 { value } 입니다.</p>
<button onClick={ () => setValue( value + 1 ) }>+1</button>
<button onClick={ () => setValue( value - 1 ) }>-1</button>
<br />
<input onChange={onChangeName} value={name} />
<input onChange={onChangeNickname} value={nickname} />
<div>
이름 : {name} <br/>
닉네임 : {nickname}
</div>
</div>
);
}
export default App;
// 위의 코드에서 useEffect 부분만 변경
useEffect( () => {
console.log("렌더링이 완료되었습니다!");
}, []);
// 위의 코드에서 useEffect 부분만 변경
useEffect( () => {
console.log("렌더링이 완료되었습니다!");
}, [name]);
// ( App.js )
import React, { useState, useEffect } from 'react';
function App() {
const [ name, setName ] = useState('');
const [ nickname, setNickname ] = useState('');
const onChangeName = (e) => {
setName(e.target.value);
}
const onChangeNickname = (e) => {
setNickname(e.target.value);
}
const [ visible, setVisible ] = useState(false);
useEffect( () => {
console.log("effect");
console.log(name);
return () => {
console.log("clean up");
console.log(name);
};
}, [name]);
/* 렌더링될 때 마다 뒷정리 함수가 계속 나타나며
뒷정리 함수가 호출될 때는 업데이트되기 직전의 값을 보여준다. */
return (
<div>
<button onClick={ () => setVisible(!visible) }>
{ visible ? 'hide' : 'show'}
</button>
<br />
<hr />
{
visible
&& <>
<input onChange={onChangeName} value={name} />
<input onChange={onChangeNickname} value={nickname} />
<div>
이름 : {name} <br/>
닉네임 : {nickname}
</div>
</>
}
</div>
);
}
export default App;
useEffect( () => {
console.log("effect");
return () => {
console.log("unmount");
};
}, []);