패스트캠퍼스

2020-01-28 5번째 수업 - Hooks, 컴포넌트간 통신, Context API 등

sunnykim91 2020. 1. 28. 21:52

Basic Hooks

useState ,  useEffect , useContext

 

hook때문에 Functional Component (= FC) 로 많이 씀

** 예전엔 (hook나오기전에) SFC였음 (Stateless Functional Component)

 

컴포넌트 사이에서 상태와 관련된 로직을 재사용하기 어렵다.

 - 컨테이너 방식말고, 상태와 관련된 로직

복잡한 컴포넌트들은 이해하기가 어렵다.

Class 는 사람과 기계를 혼동시킨다.

 - 컴파일 단계에서 코드를 최적화하기 어렵게 만듬

this.state 는 로직에서 레퍼런스를 공유하기때문에 문제가 발생할 수 있음

 

hook을 사용하면 

useState로 state를 대체가능

useEffect로 라이프사이클메소드를 대체 가능

 

 

 

첫 렌더링 순서

 

리액트 -> 컴포넌트 - 컴포넌트야 state가 0 일 때 UI를 보여줘

 

컴포넌트 -> 리액트 - 여기 랜더링 결과물로 <p>you clicked  0 times</p>가 있어, 그리고 끝나고 useEffect를 실행하는것을 잊지마

 

리액트 -> 브라우저 - UI 업데이트를 시작할게 이봐 브라우저야  나 DOM에 뭘 좀 추가할게

 

브라우저 -> 리액트 - 응 그리자

 

리액트 - 좋아, 이제 컴포넌트가 준 이펙트를 실행할거야 

 

클릭 후 렌더링

 

컴포넌트 -> 리액트 - 이봐 리액트야 내 상태를 1로 변경해줘

 

리액트 -> 컴포넌트 - 컴포넌트야 상태가 1일때 UI를 줘봐

 

컴포넌트 -> 리액트 - 여기 랜더링 결과물로 <p>you clicked  1 times</p>가 있어, 그리고 끝나고 useEffect를 실행하는것을 잊지마

 

리액트 -> 브라우저 - UI 업데이트를 시작할게 이봐 브라우저야  나 DOM에 뭘 좀 추가할게

 

브라우저 -> 리액트 - 응 그리자

 

리액트 - 좋아, 이제 컴포넌트가 준 이펙트를 실행할거야 

 

 

 

나만의 훅 Custom Hook을 만들어보자.

// useWindowWidth.js

import { useState, useEffect } from 'react';

export default function useWindowWidth() {
  // 초기화
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const resize = () => {
      setWidth(window.innerWidth);
    };
    window.addEventListener('resize', resize);
    return () => {
      window.removeEventListener('resize', resize); //componentWillUnMount
    };
  }, []);

  return width;
}

 

 

useReducer

 

다수의 하윗값을 포함하는 복잡한 정적로직을 만드는 경우

다음 state가 이전 state에 의존적인 경우

redux를 이해하고있다면 쉽게 사용 가능

 

import React, { useReducer } from 'react';

const reducer = (state, action) => {
  if (action.type === 'PLUS') {
    return {
      ...state,
      count: state.count + 1
    };
  }
  return state;
};

const initialState = {
  count: 0
};

const Example8 = () => {
  const [state, dispatch] = useReducer(reducer, initialState);

  function click() {
    dispatch({
      type: 'PLUS'
    });
  }

  return (
    <div>
      <p>{state.count}</p>
      <button onClick={click}>클릭</button>
    </div>
  );
};

export default Example8;

 

 

useMemo 실제로 변하지 않더라도, 매번 실행되는 어떤 값 , 의존성배열에 변경이 없다면 고정

 

 

Context API , useContext

 

하위 컴포넌트 전체에 데이터를 공유하는 법

 

데이터를 SET하는 놈

 - 가장 상위 컴포넌트 -> 프로바이더

 

데이터를 GET하는 놈

 모든 하위 컴포넌트에서 접근 가능

  - 방법 1 : 컨슈머 사용

  - 방법 2 : 클래스 컴포넌트의 this.context 사용 

  - 방법 3 : 펑셔널 컴포넌트의 useContext 사용

 

방법 3을 주로 사용하는 것이 좋다!!

 

 

 

 

 

 

 

반응형