제라스가 React를 다루는 방법
리액트에서 성능 향상하기 - 리렌더링 줄이기!
Xerath(제라스)
2023. 1. 8. 13:50
728x90
반응형
성능을 최적화하는 수단은 여러가지가 존재한다.
1. React.memo를 사용한다.
React.memo로 어떤 컴포넌트의 export 값을 감싸주면 해당 컴포넌트의 props가 바뀌지 않았다면, 리렌더링을 하지 않도록 설정함.
-> 함수 컴포넌트의 리렌더링 성능을 최적화해 줌.
주로 리스트 관련 컴포넌트를 작성할 때는 리스트의 아이템, 리스트 이 두개의 컴포넌트를 React.memo를 통해 최적화해주어야 한다.
2. useState의 함수형 업데이트
useState의 함수들을 함수형으로 사용하면 된다.
예를 들면 다음과 같다.
const [data, setData] = useState('');
function test() {
setData(data => data = newData); //이런 식으로 setData를 사용 시 (인자 => 인자에 대한 식);으로 쓰면 된다.
}
3. useReducer를 사용한다.
조금 복잡하긴하다. 2번 대신으로 사용하는 것으로 주로 Redux를 잘 다룬다면 쉽게 사용할 수 있다. 장점으로는 컴포넌트의 바깥에 업데이트하는 로직들을 모아둘 수 있다.
import { useCallback, useReducer, useRef } from 'react';
import './App.css';
import TodoInsert from './components/TodoInsert';
import TodoList from './components/TodoList';
import TodoTemplate from './components/TodoTemplate';
function createBulkTodos() {
const array = [];
for (let i = 1; i <= 2500; i++) {
array.push({
id: i,
text: `Todo ${i}`,
checked: false,
});
}
return array;
}
function todoReducer(todos, action) {
switch (action.type) {
case 'INSERT':
return action.tempTodos;
case 'REMOVE':
return todos.filter((todo) => todo.id !== action.id);
case 'TOGGLE':
return todos.map((todo) =>
todo.id === action.id ? { ...todo, checked: !todo.checked } : todo,
);
default:
return todos;
}
}
const App = () => {
const [todos, dispatch] = useReducer(todoReducer, undefined, createBulkTodos);
const nextId = useRef(2501);
const onInsert = useCallback(
(text) => {
const tempTodos = [...todos, { id: nextId, text, checked: false }];
dispatch({ type: 'INSERT', tempTodos });
nextId.current += 1;
},
[todos],
);
const onRemove = useCallback((id) => {
dispatch({ type: 'REMOVE', id });
}, []);
const onToggle = useCallback((id) => {
dispatch({ type: 'TOGGLE', id });
}, []);
return (
<TodoTemplate>
<TodoInsert onInsert={onInsert} />
<TodoList todos={todos} onRemove={onRemove} onToggle={onToggle} />
</TodoTemplate>
);
};
export default App;
-> 이런 식으로 useReducer로 상태 업데이트에 대한 관리를 수행하고 각 업데이트 함수들에 dispatch를 통해 업데이트를 진행하면 된다.
4. react-virtualized를 사용한 렌더링 최적화
스크롤하기 전에 보이지 않는 영역에 대해선 미리 공간을 잡아두기만 하고 렌더링을하지 않는 방식이다.
다음과 같이 라이브러리를 설치해서 사용한다.
yarn add react-virtualized
[출처] 리액트를 다루는 기술
728x90
반응형