Hooks는 리액트 v16.8에 새로 도입된 기능으로
1. 함수형 컴포넌트에서도 상태 관리를 할 수 있는 useState,
2. 렌더링 직후에 수행할 작업을 설정하는 useEffect 등의 기능을 제공하여
기존의 함수형 컴포넌트에서 할 수 없었던 다양한 작업을 할 수 있게 해준다.
함수형 컴포넌트에서도 상태 관리를 할 수 있게 해주는 Hook 함수.
const [value, setValue] = useState(0);
import React, { useState } from 'react';
const CounterUseState = () => {
const [value, setValue] = useState(0);
return (
<div>
<p>
현재 카운터 값은 <b>{value}</b>입니다.
</p>
<button onClick={() => setValue(value + 1)}>+1</button>
<button onClick={() => setValue(value - 1)}>-1</button>
</div>
);
};
export default CounterUseState;
리액트 컴포넌트가 렌더링 될 때마다 수행할 작업을 설정 할 수 있는 Hook 함수.
useEffect(()=> {
/*렌더링 직후 수행할 작업*/
return (/*렌더링 직전 또는 언마운트되기 전 수행할 작업*/ );
},[/*검사하고 싶은 값들*/])
useEffect 파라미터: 단계별 수행할 작업을 담은 함수, 검사하고 싶은 값들을 담은 배열
useEffect 반환 값: 렌더링 직전 또는 언마운트 되기 전 수행할 작업을 담은 함수.
import React, { useState, useEffect } from 'react';
const CounterUseEffect = () => {
const [value, setValue] = useState(0);
useEffect(() => {
console.log('카운터 렌더링 완료');
return () => console.log('렌더링 직전 작업 수행 중');
}, [value]);
return (
<div>
<p>
현재 카운터 값은 <b>{value}</b>입니다.
</p>
<button onClick={() => setValue(value + 1)}>+1</button>
<button onClick={() => setValue(value - 1)}>-1</button>
</div>
);
};
export default CounterUseEffect;
useState보다 더 다양한 컴포넌트 상황에 따라 다양한 상태를 다른 값으로 업데이트해주고 싶을 때 사용하는 Hook 함수.
리듀서는 현재 state, 업데이트를 위해 필요한 정보를 담은 action을 전달받아 새로운 state를 반환하는 함수이다.
리듀서 함수에서 새로운 state를 만들어서 반환할 때는 반드시 불변성을 지켜주어야 한다.
useReducer의 가장 큰 장점은 reducer 함수를 따로 정의함으로써 컴포넌트 업데이트 로직을 컴포넌트 바깥으로 빼낼 수 있다는 것.
function reducer (state,action) {
return 새로운 state;
}
const [state,dispatch] = useReducer(reducer,state의 기본 값);
import React, { useReducer } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { value: state.value + 1 };
case 'DECREMENT':
return { value: state.value - 1 };
default:
return state;
}
}
const Counter = () => {
const [state, dispatch] = useReducer(reducer, { value: 0 });
return (
<div>
<p>
현재 카운터 값은 <b>{state.value}</b>입니다.
</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+1</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>-1</button>
</div>
);
};
export default Counter;