-
React - 함수 재사용(useCallback)React 2020. 9. 11. 02:25
현재 App.js 에서 onCreate() 등 함수들은 컴포넌트가 매번 리렌더링 될 때마다 새로운 함수 만들고 있다.
-> 사실상 메모리에 부하에는 큰 영향 주지않음
하지만 함수 재사용할 때, props가 바뀌지 않았다면, virtual DOM 이 하는 리렌더링 작업조차 안하도록 만들 수 있음
사용법
- App.js -
1. useCallback 상단에 선언
import React, { useRef, useState, useMemo, useCallback } from 'react';
2. onChange() 함수 변경
const onChange = useCallback(e => { const {name, value} = e.target; setInputs({ ...inputs, [name]: value }); }, [inputs]);
파라미터로 deps 넣어줌 -> 여기서 inputs를 톤해 useState 관리하고 있기 때문에 inputs를 넣어줌
=> inputs가 바뀔 때만 함수가 다시 만들어지게 되고, 그렇지 않으면 기존의 값을 재사용
3. onCreate() 함수 변경
const onCreate = useCallback(() => { const user = { id: nextId.current, username, email, }; setUsers(users.concat(user)); setInputs({ username: '', email: '' }); console.log(nextId.current); nextId.current += 1; }, [username, email, users]);
username 과 email 도 inputs를 비구조 할당한 것으로 상태를 관리하는 것이기 때문에 모두 deps에 넣어주어야함
(상단에 const {username, email} = inputs; 이 부분)
-> 만약에 deps에 들어갈 값을 빼먹으면, 가장 최신 상태를 참조하는 것이 아니라, 맨 처음 페이지가 렌더링될 때의 상태를 참조하게 된다.
4. 나머지 함수에도 추가
const onRemove = useCallback(id => { setUsers(users.filter(user => user.id !== id)) }, [users]); const onToggle = useCallback(id => { setUsers(users.map( user => user.id === id ? { ...user, active: !user.active } : user )); }, [users]);
이렇게 바꿔 주는 것 자체로는 눈에 띄는 최적화는 없음
-> 컴포넌트 리렌더링 성능 최적화를 해주어야 성능이 좋아짐
=> 이 작업 전에 어떤 컴포넌트가 현재 리렌더링 되었는지 알기 위해 react dev tools 설치해야함
계속 콘솔에 떠 있던 노란 창의 정체 'React' 카테고리의 다른 글
React - useReducer (0) 2020.09.11 React - 컴포넌트 리렌더링 방지(React.memo) (0) 2020.09.11 React - 연산한 값 재사용(useMemo) (0) 2020.09.11 React - useEffect Hook (0) 2020.09.11 React - 배열에서 항목 수정하기 (0) 2020.09.10