예제 코드
import React, { useEffect, useState } from 'react';
const Info = () => {
const [name, setName] = useState('');
const [nickname, setNickname] = useState('');
useEffect(() => {
console.log({
name,
nickname,
});
});
const onChangeName = (e) => {
setName(e.target.value);
};
const onChangeNickName = (e) => {
setNickname(e.target.value);
};
return (
<div>
<div>
<input placeholder="이름" onChange={onChangeName} />
<input placeholder="닉네임" onChange={onChangeNickName} />
</div>
<div>
<b>이름 : {name}</b>
</div>
<div>
<b>닉네임 : {nickname}</b>
</div>
</div>
);
};
export default Info;
useEffect 함수의 두 번째 파라미터로 비어 있는 배열 넣는다.
console.log에 처음 렌더링할 때만 console이 찍히고 input 변경 시에는 안찍힘
useEffect(() => {
console.log({
name,
nickname,
},[]);
});
useEffect(() => {
console.log({
name,
nickname,
},[name]);
});
언마운트되기 전 (componentWillUnmount), 업데이트하기 직전(getSnapshotBeforeUpdate)에 작업 수행 하기위해 뒷정리 함수 반환
언마운트, 업데이트를 하기위해 부모 컴포넌트 가시성 추가
const App = () => {
const [visible, setVisible] = useState(false);
const onClick = () => {
setVisible(!visible);
};
return (
<div>
<button onClick={onClick}>{visible ? '보이기' : '숨기기'}</button>
<hr />
{visible && <Info />}
</div>
);
};
뒷정리함수 적용
useEffect(() => {
console.log('일반 상황1 -> 마운트되어서 Info 컴포넌트가 보일 때');
console.log('일반 상황2 -> 정보가 업데이트 될 때');
return () => {
console.log('뒷정리 함수 상황1 : 언마운트 되어서 숨기려할 때');
console.log(
'뒷정리 함수 상황2 -> 업데이트 되기 직전에. 즉 input에 값 입력해도 업데이트 직전인 상황나옴. 리액트 -> 리액ㅌ'
);
console.log('상황 2는 2번째 배열에 값에 따라 달라짐');
};
}, [name]);
function reducer(state, action) {
switch (action.type) {
case 'INCREASE':
return { value: state.value + 1 };
case 'DECREASE':
return { value: state.value - 1 };
default:
return state;
}
}
const Counter = () => {
const [state, dispatch] = useReducer(reducer, { value: 0 });
return (
<div>
<p>현재 카운터 값 : {state.value}</p>
<button onClick={() => dispatch({ type: 'INCREASE' })}>+1</button>
<button onClick={() => dispatch({ type: 'DECREASE' })}>-1</button>
</div>
);
};
코드 분석
function reducer(state, action) {
switch (action.type) {
case 'INCREASE':
return { value: state.value + 1 };
case 'DECREASE':
return { value: state.value - 1 };
default:
return state;
}
}
const [state, dispatch] = useReducer(reducer, { value: 0 });
<button onClick={() => dispatch({ type: 'INCREASE' })}>+1</button>
<button onClick={() => dispatch({ type: 'DECREASE' })}>-1</button>
dispatch 함수 안에 파라미터로 타입을 넣어주면 리듀서 함수가 호출된다.
reducer 함수
function reducer(state, action) {
return {
...state,
[action.name]: action.value,
};
}
컴포넌트
const Info = () => {
const [state, dispatch] = useReducer(reducer, {
name: '',
nickname: '',
});
const { name, nickname } = state;
const onChange = (e) => {
dispatch(e.target);
};
return (
<div>
<input
name="name"
value={name}
onChange={onChange}
/>
<input
name="nickname"
value={nickname}
onChange={onChange}
/>
</div>
};