일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Vue3
- 모던 자바스크립트 딥다이브
- 투포인터알고리즘 js
- useRef 지역 변수
- 백준 node.js
- 프로그래머스 데브코스 프론트엔드 TIL
- TypeScript 문법 소개
- 모던 javascript Deep Dive
- frontend roadmap study
- Frontend Roadmap
- 프로그래머스 K_Digital Training
- K_Digital Training
- 모던 자바스크립트 Deep Dive
- Vue3 Router
- react 프로젝트 리팩토링
- 모던 자바스크립트 TIL
- 머쓱이
- 개발자 특강
- 프로그래머스 데브코스
- 인프런 자바스크립트 알고리즘 문제풀이
- KDT 프로그래머스 데브코스 프론트엔드
- useEffect return
- KDT 프로그래머스
- 프로그래머스 K_Digital Training 프론트엔드
- 프로그래머스 데브코스 프론트엔드
- react customHook 예시
- 백준 js
- 모던 자바스크립트 Deep Dive TIL
- 우테캠 회고록
- 리팩토링 회고
- Today
- Total
프론트엔드 개발자의 기록 공간
[React] React(2) 본문
❗❗ 데브코스 51일차 (10.11)
React 강의가 짧은 대신에 많은 내용은 포함하고 있다.
그래서 파트별로 끊어서 블로그를 포스팅할 예정이다.
✅ emotion
emotion은 CSS in JS의 형식으로 styled 스타일이 첨부된 React 구성 요소를 만드는 방법이다.
즉 JavaScript 안에서 CSS를 가능하게 해준다.
- emotion 설치 - yarn add @emotion/react
- babel plugin 설치 - yarn add --dev @emotion/babel-plugin
- styled 설치 - yarn add @emotion/styled
//최상단에 해당 구문 추가 후 사용
/** @jsxImportSource @emotion/react */
import { jsx, css } from '@emotion/react'
위의 import 방식이 귀찮다면. babelrc 설정 파일에서 다음과 같은 구문을 추가해 주면 된다.
{
"presets": ["@emotion/babel-preset-css-prop"]
}
하지만 create-react-app으로 설치된 패키지는 .bablerc 파일이 숨겨져 있기 때문에 craco를 이용해 설정 파일을 제어할 수 있다. 이 부분이 필요하다면 구글링...
1. css 사용법
/** @jsxImportSource @emotion/react */
import { css, jsx } from '@emotion/react'
const divStyle = css`
background-color: red;
font-size: 24px;
&:hover {
color: white;
}
`
export default function App() {
return <div css={divStyle}>Test</div>
}
2. styled 사용법
import styled from 'styled-components'
const DivStyle = styled.div`
background-color: red;
&:hover {
color: white;
}
`
export default function App() {
return <DivStyle>Test</DivStyle>
}
✅ useMemo
성능 최적화를 위하여 연산된 값을 재사용하는 Hook으로 값을 반환한다.
함수가 리렌더링 되는 조건은 크게 다음과 같다.
- 함수 컴포넌트는 자신의 상태가 변결될 때 리렌더링 된다.
- 부모 컴포넌트로 부터 받은 prop이 변경될 때 리렌더링 된다.
- 부모 컴포넌트의 상태가 변경되면 리렌더링 된다.
1번과 2번은 그렇다 하더라도 자식의 상태와 전혀 관련이 없는 부모의 상태가 변경될 때 자식이 리렌더링 되는 것은 매우 불필요한 렌더링이다.
그럴 때 useMemo를 사용함으로써, 불필요한 리렌더링을 줄이면서 성능 최적화를 진행하게 된다.
const doubleCount = React.useMemo(() => count * 2, [count])
✅ React.Memo
위 useMemo에서 부모 컴포넌트의 상태가 변경될 때 하위 컴포넌트의 함수가 리렌더링 되는 현상을 막기 위해 useMemo를 사용했다. 함수가 아닌 컴포넌트 자체의 렌더링을 막을 때는 어떻게 할까?
바로 React.Memo를 사용하면 부모 컴포넌트의 상태가 변경되더라도 하위 컴포넌트는 리렌더링을 막을 수 있다.
사용법은 간단하다. 컴포넌트 자체를 React.Memo로 감싸주면 된다.
export function Movie({ title, releaseDate }) {
return (
<div>
<div>Movie title: {title}</div>
<div>Release date: {releaseDate}</div>
</div>
);
}
export const MemoizedMovie = React.memo(Movie);
✅ useCallback
useCallback은 useMemo와 같이 성능 최적화에 사용된다.
useMemo가 값을 반환한다면, useCallback은 함수를 반환한다.
즉, 함수가 다시 정의되는 것을 막기 위해 사용된다.
const handleClick = React.useCallback(
() => console.log('current count :' + count),
[의존성 인자])
//의존성 인자가 없다면 처음에 함수가 정의된 상태에서 계속 재활용된다.
위의 세 가지 최적화를 위한 hook을 적절히 사용하면 컴포넌트 렌더링 최적화에 큰 도움이 된다.
하지만 무분별하게 사용할 경우 메모리와, 코드가 추가로 필요하게 되므로 적절하게 조합해서 사용해야 한다.
✅ Custom Hook
사용자 정의 Hook은 기존 Hook을 조합해서 사용할 수 있다.
자주 사용하는 상태 로직을 별도 사용자 정의 Hook으로 빼서 사용하면 중복 코드를 많이 제거할 수 있고, 편하게 사용할 수 있다.
//부모 컴포넌트
import useToggle from "./hooks/husToggle";
function App() {
const [on, toggle] = useToggle();
return (
<div>
<button onClick={toggle}>{on ? 'true' : 'false'}</button>
</div>
}
}
//useToggle 클릭 시 체크박스 true, false 변환해주는 CustomHook
import {useCallback, useState} from "react";
const useToggle = (initialState = false) => {
const [state, setState] = useState(initialState);
const toggle = useCallback(() => setState((state) => !state), []);
return [state, toggle];
};
export default useToggle;
위 코드의 예시는 button 클릭 시 true, false로 토글이 되면서 텍스트가 보이는 예시이다.
반환될 상태값과, 함수를 리턴해주고 사용하는 곳에서 적절하게 사용하면 된다.
만약 여러 컴포넌트에서 토글이 사용된다면, 위와 같이 사용자 정의 Hook을 만들어서 사용하면 재사용성을 높일 수 있다.
👨💻 react를 학습할 때, 알아야 할 것이 너무 많아서 Hook에 관련된 것들은 계속 학습을 미뤘었다.
그래서 매번 CRUD 위주로 개발만 진행했고, 최적화에 대해 고민해 본 적이 없었다. 하지만 이번 기회를 통해
최적화 Hook에 대해 알 수 있었고, 어느 때에 적절히 사용하면 되는지 깊게 파악할 수 있었다.
그 외에 StoryBook을 이용한 컴포넌트 UI 관리에 대해서 학습할 수 있었다.
📖 학습한 내용
- React(2)
- 컴포넌트 스타일링
- useMemo
- React.memo
- useCallback
- Custom Hook
- StoryBook
- Form
📃 참고 사이트
https://react.vlpt.us/basic/16-useEffect.html
'프로그래머스 데브코스_FE > TIL' 카테고리의 다른 글
[React] React(4) (0) | 2022.01.23 |
---|---|
[React] React(3) (0) | 2022.01.20 |
[React] React(1) (0) | 2022.01.17 |
[Vue3] 영화 검색 사이트 프로젝트 (0) | 2022.01.14 |
[Vue3] Vue(7) 실습 및 배포 (0) | 2021.11.25 |