이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

React.js 공식문서 정리 - Hook

  • 2021.11.18 13:03
  • Study Log

들어가며

  • 개발자에게 가장 중요한 습관은 문서를 읽는 습관이라고 생각합니다.
  • 이 글은 리액트 공식 문서를 정독하며 내용을 정리하기 위해 작성하게 되었습니다.
  • 모든 내용을 정리하기 보다는, 모르는 내용이나 기억하고 싶은 내용 위주로 정리합니다.
  • 공식 문서의 주소는 https://reactjs.org/docs/accessibility.html입니다.

Hook

1. Hooks Intro

  • 훅의 장점으로, 기존 클래스 기반에서 생명주기에 따라 로직을 복잡하게 구사했던 것을 간편하게 개선할 수 있다.

2. Hook overview

  • useEffect는 sideEffect를 커버하기 위한 hook이다.
  • useEffect는 렌더링 이후에 effect를 수행한다
  • useEffect에서 반환하는 함수를 이용하면 effect를 해제할 수 있다.
  • Hook을 호출할 때는 최상위 함수에서만 호출한다.(조건문이나 반복문 내에서 hook실행금지)
  • React함수 컴포넌트 안 이거나, custom Hook 내에서만 Hook을 호출한다.

3. Using the State Hook

  • Hook이란 함수 컴포넌트 안에서 여러가지를 관리하는 특별한 함수.
  • useState로 관리되는 state변수는 함수가 끝나도 사라지지 않는다.
  • this.setState는 병합하지만 setState는 대체한다.(모든 값에 대한 재지정이 필요)

4. Using the Effet Hook

  • 기존 클래스 컴포넌트에서도, 사이드이펙트를 다룰 때 componentDidMount, DidUpdate 즉 DOM이 바귀고 난 뒤 이펙트를 처리했다.
  • Side Effect를 수행한다.
  • useEffect가 컴포넌트 안에 있는 이유는 state에 접근할 수 있기 때문이다.
  • useEffect 에 전달되는 함수를 effect라고 한다.
  • 리렌더링시마다 계속 effect는 달라진다.
  • clean하려면(구독 해제 등) effet hook 내에서 return을 해준다. 리턴안에 있는 함수는 Update나 unmount 전에 호출이 된다.
  • 예시로 들어져 있는 FriendStatus 컴포넌트는 문자열만 리턴한다...!

6. Building Your Own Hooks

  • 커스텀 훅은 이름이 use로 시작하는 함수이다.
  • 커스텀 훅 내에서는 기존의 Hook을 호출할 수 있다.
  • useFriendStatus 이라는 custom Hook은 ID를 받아와서 online인지 아닌지를 돌려준다.
  • FriendStatus는 온라인인지 아닌지를 문자열로 리턴하고, FriendListItem은 온라인인지 아닌지를 판단해서 리스트 아이템을 반환한다. 둘 다 모두 온라인인지 아닌지를 판단해야하는 공통로직이 들어가고, 이를 추상화시켰을 뿐이다. 즉 원래 useState... useEffect 등등으로 복잡하게 처리해야했던 것들을 커스텀 훅 속에 다 넣고 결과만 가져오는 것이다.

7. Hooks API Reference

useReducer

const [state, dispatch] = useReducer(reducer, initialArg, init);
  • useReduce의 첫 값은 reducer함수, 둘째 값은 초기값, 셋째값은 Lazy Initialization을 위한 값
  • 반환 값은 state와 dispatch.

 

const initialState = {count: 0};

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}
  • Counter 컴포넌트를 살펴보면, useReducer훅을 이용하여 state와 dispatch를 만들어준다.
  • state는 이 컴포넌트의 state이며, 초기값은 initialState 즉 { count:0 }이다.
  • dispatch는 action을 입력으로 받는다. action은 객체이며, 위 예제에서는 type을 가지고 있다.
  • dispatch는 onClick에 의해서 호출이 된다.
  • dispatch는 reducer에게 action을 보내준다고 봐도 될 것 같다.
  • reducer는 액션을 받아서, switch case에 따라 액션을 분류하고, state를 업데이트한다.
  • reducer가 관심있는 대상은 현재컴포넌트의 state, 와 dispatch로부터 날아온 action이다.222

초기화 지연

function init(initialCount) {
  return {count: initialCount};
}

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    case 'reset':
      return init(action.payload);
    default:
      throw new Error();
  }
}

function Counter({initialCount}) {
  const [state, dispatch] = useReducer(reducer, initialCount, init);
  return (
    <>
      Count: {state.count}
      <button
        onClick={() => dispatch({type: 'reset', payload: initialCount})}>
        Reset
      </button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}
  • useReduce 선언 시 세 번째 인자에 두번째 인자를 받아서 리턴하는 식으로 활용할 수도 있다.
  • 리셋 버튼을 누르면, initialCount로 다시 초기화가 된다. 변경되는 값은 state로 , 불변상태 ~ 리셋할 때 처음 선언해뒀던 초기값으로 돌아갈 수 있다.

8. Hooks FAQ

How to avoid passing callbaks cown?

const TodosDispatch = React.createContext(null);

function TodosApp() {
  // 주의: `dispatch`는 다시 렌더링 간에 변경되지 않습니다
  const [todos, dispatch] = useReducer(todosReducer);

  return (
    <TodosDispatch.Provider value={dispatch}>
      <DeepTree todos={todos} />
    </TodosDispatch.Provider>
  );
}
  • 최상위 컴포넌트에서 todo라는 상태를 관리할 때 dispatch를 context로 뿌려준다.
function DeepChild(props) {
  // 작업을 수행하려면 context에서 dispatch를 얻을 수 있습니다.
  const dispatch = useContext(TodosDispatch);

  function handleClick() {
    dispatch({ type: 'add', text: 'hello' });
  }

  return (
    <button onClick={handleClick}>Add todo</button>
  );
}
  • 받을 때는 useContext를 이용해서 받아온다..!
 
 
 

 

 
 
 
 
 
 
 
 
 

'Study Log' 카테고리의 다른 글

Redux 공부하기  (0) 2022.01.01
브라우저 공부  (0) 2021.11.20
React.js 공식문서 정리 - Advanced Guides  (0) 2021.11.17
Event  (0) 2021.11.09
JavaScript export와 export default 차이  (0) 2021.11.09

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • Redux 공부하기

    Redux 공부하기

    2022.01.01
  • 브라우저 공부

    브라우저 공부

    2021.11.20
  • React.js 공식문서 정리 - Advanced Guides

    React.js 공식문서 정리 - Advanced Guides

    2021.11.17
  • Event

    Event

    2021.11.09
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • ㅣ
  • 공식문서읽기
  • 리액트

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바