일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- debouncing
- DOM
- CustomHook
- es6
- BFC
- BlockFormattingContext
- alias설정
- twoarrow
- 부모요소의 패딩 무시
- parent padding
- react
- 제어컴포넌트
- 문제해결
- 서초구보건소 #무료CPR교육
- createPortal
- useQueryClient
- vite
- transition
- ignore padding
- ㅡ
- accordian
- 조건부스타일
- ?? #null병합연산자
- 화살표2개
- Carousel
- 함수형프로그래밍
- 리액트
- tailwindCSS
- 부모패딩
- QueryClient
Archives
- Today
- Total
프론트엔드 첫걸음
useCallback으로 함수 재생성 방지하기 본문
useCallbak -
함수를 리액트 내부저장공간에 저장해서 함수객체가 실행될 때마다 재사용하도록 할 때 useCallback을 사용한다.
import React, { useState, useCallback } from 'react';
import Button from './components/UI/Button/Button';
import DemoOutput from './components/Demo/DemoOutput';
import './App.css'
function App() {
const [showParagraph, setShowParagraph] = useState(false);
const [allowToggle, setAllowToggle] = useState(false);
console.log('App running')
const toggleParagraphHandler = useCallback(() => {
if(allowToggle){
setShowParagraph((prevShowParagraph)=> !prevShowParagraph);
}
}, [allowToggle]);// toggleParagraphHandler에서 allowToggle이 함수의 외부인자이고, allowToggle이 바뀌면 함수도 바뀌어야하므로 배열에 넣어주었다.
const AllowtoggleHandler = () => {
setAllowToggle(true);
};
return (
<div className="app">
<h1>Hi there</h1>
<DemoOutput show={false}/>
<Button onClick={AllowtoggleHandler}> Allow Toggling! </Button>
<Button onClick={toggleParagraphHandler}> Toggle Paragraph! </Button>
</div>
)
}
useCallback으로 함수를 감싸주면 된다.
App 컴포넌트가 다시 렌더링 되어도 항상 같은 함수객체가 사용된다.
함수의 두번째 인자로 의존성 배열을 넣어 준다.
함수의 외부 인자로 인해 함수가 바뀌는 경우 함수 또한 바뀌어야 하기 때문에 함수의 외부인자를 배열 안에 넣어준다.
Fetch 함수 사용
function fetchMoviesHandler() {
fetch('https://swapi.dev/api/films/')
.then((response) => {
return response.json();
})
.then((data) => {
const transformedMovies = data.results.map((movieData) => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date,
};
});
});
setMovies(transformedMovies);
}
async await 사용
async function fetchMoviesHandler() {
const response = await fetch('https://swapi.dev/api/films/');
const data = await response.data();
const transformedMovies = data.results.map((movieData) => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date,
};
});
setMovies(transformedMovies);
}
화면이 로딩되자마자 fetch 하도록 useEffect 사용
useEffect 안에 함수 넣으면 무한 반복되니까 useCallback 사용
const fetchMoviesHandler = useCallback(async () => {
const response = await fetch('https://swapi.dev/api/films/');
const data = await response.json();
const transformedMovies = data.results.map((movieData) => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date,
};
});
setMovies(transformedMovies);
}, []);
'개발 공부 > React' 카테고리의 다른 글
함수형 컴포넌트 class 컴포넌트로 바꾸기 (0) | 2022.08.04 |
---|---|
성능개선 - useMemo 로 데이터 저장 (0) | 2022.08.04 |
성능개선 - react.memo로 불필요한 재평가 방지하기 (0) | 2022.08.04 |
객체 타입의 prop 전개연산자로 전달하기 (0) | 2022.07.30 |
[문제해결] useLocation - 주소에 따라서 활성화된 메뉴 스타일 변경 (0) | 2022.07.27 |