Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- OS
- Apple Developer Academy @ POSTECH
- 숭실대
- 운영체제
- Swift 기능
- 제앱소
- 애플 디벨로퍼 아카데미 후기
- react
- 애플 디벨로퍼 아카데미
- 애플 디벨로퍼 아카데미 21주차 회고
- 데이터베이스 공부
- iOS 개발 오류
- 치지직
- Swift 디자인패턴
- global soop
- 네이버 부스트캠프
- 소프트웨어분석및설계
- Swift 문법
- useReducer
- apple developer academy 후기
- StateObject
- SWIFT
- ObservableObject
- 애플 아카데미 후기
- ObservedObject
- 앱 비교 프로젝트
- sqoop
- swift문법
- 데이터베이스
- 네이버 치지직
Archives
- Today
- Total
사과하는 제라스
리액트에서 성능 향상하기 - 리렌더링 줄이기! 본문
목차
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
반응형
'제라스가 React를 다루는 방법' 카테고리의 다른 글
.prittierrc에는 무엇을 쓸까? (0) | 2023.01.12 |
---|---|
useReducer를 사용해보자! (0) | 2023.01.08 |
React 개발 시 단축키로 구조를 만들어보자 (0) | 2022.12.22 |
Real DOM으로 다루면 느리다구요? Virtual DOM이 뭔데요?? (0) | 2022.12.22 |