일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 고양이 사진 검색기
- 프로그래머스 프론트엔드 데브코스
- postcss
- 폼 입력 바인딩
- intersection opserver
- vue mixin
- 프로그래머스 K_Digital Training
- nextjs사용법
- SCSS forward
- netlify redirect
- Vue
- SCSS use
- 이벤트 수식어
- KDT 프로그래머스
- 프로그래머스 데브코스
- 리액트
- git 같은계정 다른 컴퓨터
- 쌓임맥락
- vue 이벤트 수신
- vue 지역 컴포넌트
- SCSS import
- KDT 프로그래머스 데브코스 프론트엔드
- SCSS extend
- flex
- 리스트 렌더링
- react next
- 다른컴퓨터에서 git사용
- vuex map
- Spacer
- 프로그래머스 데브코스 프론트엔드
- Today
- Total
혼자 적어보는 노트
[React] useCallback에 대한 이해 / 함수 재사용 본문
이전 포스팅에서 다룬 React.memo와 함께 사용할
useCallback에 대해 적어보도록 하겠다.
함수를 재사용 한다고 하는데 무슨 의미인지 어떤 식으로 사용을 하는 것인지 알아보자
useCallback을 이해하기 위한 중요 개념은
함수는 일반 객체와 같은 비교 원칙을 따른다는 것이다.
const func1 = () => 1 + 2;
const func2 = () => 1 + 2;
console.log(func1 === func2) // false;
console.log(func1 === func1) // true;
console.log(func2 === func2) // true;
같은 내용의 함수더라도 비교연산 시 false를 반환한다.
함수는 자기 자신 외의 다른 함수들에서는 false를 반환한다.
아래에 작은 예시를 만들어보았다.
import React, { useState } from "react";
import UserName from "./components/UserName";
import UserAge from "./components/UserAge";
function App() {
const data = { id: 1, name: "Jay", age: 29 };
const [userData, setUserData] = useState(data);
const increaseAge = () => {
setUserData({ ...userData, age: userData.age + 1 });
};
const addStar = () => {
setUserData({ ...userData, name: userData.name + "★" });
};
return (
<div>
<UserName name={userData.name} addStar={addStar} />
<UserAge age={userData.age} increaseAge={increaseAge} />
</div>
);
}
export default App;
부모 컴포넌트인 App에서 UserData를 생성해주고
userData의 age를 1씩 증가시켜주는 함수 increaseAge와
userData의 name에 ★을 추가해주는 함수 addStar를 만들어 주었다.
그리고 각각의 내용에 해당하는 값과 콜백 함수를 UserName, UserAge 컴포넌트에 전달해주었다.
import React from "react";
const UserName = ({ name, addStar }) => {
console.log("Name");
return (
<div>
<p>Name : {name}</p>
<button onClick={addStar}>★추가</button>
</div>
);
};
export default React.memo(UserName);
import React from "react";
const UserAge = ({ age, increaseAge }) => {
console.log("Age");
return (
<>
<p>Age : {age}</p>
<button onClick={increaseAge}> + </button>
</>
);
};
export default React.memo(UserAge);
UserName과 UserAge에는 props로 데이터와 함수를 전달 받았고
React.memo()로 래핑해주었다.
하지만 React.memo로 래핑해주었음에도 불구하고
각각의 버튼 클릭 시 두 컴포넌트에 적은 console이 출력된다.
변경되는 props가 없는것 같은데 왜 리렌더가 되는 것일까?
그 것은 앞서 말한 함수 동등성에 의해 일어는 것이다.
state가 변경됨에 따라 부모 컴포넌트가 리렌더링이 되고
함수형 컴포넌트에서는 리렌더시에 안에 포함되어 있던 함수들이 전부
새로운 함수로 다시 생성되기 때문에 다시 생성된 함수가 새로운 props로 인식하기 때문이다.
부모컴포넌트 업데이트 -> 부모컴포넌트에 있는 함수들이 새로운 함수로 변경됨
-> 이전에 자식 컴포넌트에 props로 받은 콜백함수와 새로 생성되어 props로 전달된 콜백함수를 비교
-> 다른함수로 인식하기 때문에 false반환. -> 자식컴포넌트 리렌더링
useCallback()사용
import React, { useCallback, useState } from "react";
import UserName from "./components/UserName";
import UserAge from "./components/UserAge";
function App() {
const data = { id: 1, name: "Jay", age: 29 };
const [userData, setUserData] = useState(data);
const increaseAge = useCallback(() => {
setUserData({ ...userData, age: userData.age + 1 });
}, [userData.age]);
const addStar = useCallback(() => {
setUserData({ ...userData, name: userData.name + "★" });
}, [userData.name]);
return (
<div>
<UserName name={userData.name} addStar={addStar} />
<UserAge age={userData.age} increaseAge={increaseAge} />
</div>
);
}
export default App;
자식컴포넌트에 전달할 함수들을 useCallback()로 감싸주고
두 번째 인자로 해당 함수가 의존하고 있는 데이터를 넘겨준다.
그렇게 하면 리렌더가 되어도 의존하고있는 데이터의 값이 변경되지 않는다면
같은 함수 인스턴스를 반환한다.
'React' 카테고리의 다른 글
[React] 영역 밖 클릭시 이벤트 / 모달 닫기 (0) | 2022.02.24 |
---|---|
[React] 활성화된 input focus 해제 / blur() (0) | 2022.01.17 |
[React] 리렌더링 조건 / React memo (0) | 2022.01.14 |
[React] Date를 활용하여 오늘/내일/지난 날짜 변환 해보기 (0) | 2022.01.12 |
[React] Todo List 기한 설정 기능 추가 해보기 (0) | 2022.01.11 |