이번 포스팅을 보시기 전에 이전에 올렸던 자바스크립트 구조분해할당 글을 읽고 오시면 도움이 될 것입니다. 구조분해 할당은 배열이나 객체의 속성을 추출하여 변수에 할당하는 것을 말합니다. 리액트 훅에서도 구조분해 할당을 활용하여 훅의 반환값을 추출하는 경우가 많이 있습니다. 이제부터 본격적으로 리액트 훅과 구조분해 할당에 대해서 알아보도록 하겠습니다.
리액트 훅은 리액트 16.8 버전부터 새로 추가가 된 기능며, 클래스 컴포넌트에서 쓰인 기능을 함수 컴포넌트에서 동일하게 쓰일 수 있도록하는 라이브러리입니다. 리액트 훅을 잘 사용하면 더 간단하고 유연한 코드를 작성할 수 있습니다.
리액트 훅을 사용할 때는 몇 가지 규칙이 있습니다.
리액트 훅의 규칙에 대한 설명은 이정도로 하고 이제는 자주 사용하는 리액트 훅에 대해서 알아보겠습니다.
이제 useState에 대한 예시를 보여드리겠습니다.
import { useState } from 'react';
function MyComponent() {
const [age, setAge] = useState(28);
const [name, setName] = useState('Taylor');
const [todos, setTodos] = useState(() => createTodos());
// ...
useState 변수는 기본적으로 [something, setSomething] 이런 형태를 가지고 있습니다.
처음 배우는 리액트 Hook인만큼 다음 포스팅에서 좀 더 자세하게 다뤄보겠습니다.
이제 다른 리액트 훅에 대해서도 알아보겠습니다.
useEffect(callback, dependencies);
기본적으로 이와 같은 구조로 사용이 됩니다.
useEffect (() => {
if(!didMountRef.current) {
return;
}else {
console.log("컴포넌트 업데이트");
}
})
dependencies는 의존성 배열의 형태로 전달됩니다.
두 번째 인수로 전달한 의존성 배열은 요소값이 변경되면 첫 번째 인수로 전달한 callback 함수를 실행합니다. 만약 두 번째 인수의 의존성 배열에 아무것도 전달하지 않으면, useEffect는 컴포넌트를 랜더링 할 때마다 콜백 함수를 실행합니다.
function Button(){
const theme = useContext(ThemeContext);
//...
}
const [state, dispatch] = useReducer(reducer, initialState);
기본적인 구조는 이렇게 되어있습니다.
useState와 useReducer를 상황에 맞게 적절하게 사용하면 좋은 코드를 작성할 수 있습니다.
const cashedFn = useCallback(fn, dependencies)
기본적인 구조는 이렇게 됩니다.
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
렌더링이 되더라도 함수 값들이 바뀌지 않을 때 함수를 재사용 하도록 하는 데 사용됩니다.
// React.memo에 대한 예시
function MyComponent(props) {
}
function areEqual(prevProps, nextProps) {
}
export default React.memo(MyComponent, areEqual);
이전과 내용이 바뀌었다면, 값을 연산하고 내용이 바뀌지 않았으면 이전에 연산 값을 재사용합니다.
여기서 주의해야할 점은 성능 최적화로만 사용해야합니다. 렌더링 방지를 하기 위해서는 사용하기 위해서 만들어진 것이 아니기 때문에 그런 용도로 사용하지 말아야합니다.
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = useMemo(() => expensiveCalculation(count), [count]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
이렇게 자주 사용하는 리액트 Hook에 대해서 알아보았습니다.
앞에 내용을 작성하면서 구조분해 할당에 대해 간단하게 알아보았는데요.
이번에는 useState를 사용해서 상태를 관리하는 경우에 구조분해 할당을 적용하면 어떻게 되는지 알아보겠습니다.
// useState를 사용
import React, { useState } from 'react';
const MyComponent = () => {
//count 상태와 setCount 함수를 추출하여 변수에 할당
const [count, setCount] = useState(0);
// count 상태를 업데이트하는 함수
const increment = () => {
setCount(count + 1);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
};
export default MyComponent;
위 예시 코드를 보겠습니다. const [count, setCount] = useState(0); 이 부분은 useState를 사용해서 반환한 값을 배열 구조 분해 할당으로 추출하고, 각각의 count, setCount라는 변수에 할당했습니다. count는 현재 상태의 값이고, setCount는 상태를 업데이트하는 함수입니다.
이렇게 리액트 훅을 사용 시 구조분해 할당을 사용하면 여러 개의 상태를 한 번에 추출할 수 있고, 각각의 변수에 할당할 수 있습니다. 즉, 코드의 가독성과 유지 보수성을 향상시키며 상태 값과 상태를 업데이트 하는 함수를 보다 더 쉽게 다룰 수 있습니다.
이번 포스팅을 이것을 설명을 마치겠습니다.