패스트캠퍼스

2020년 1월 6일 수업

sunnykim91 2020. 1. 6. 17:04
const BlinkRender = () => {
  const [value, setValue] = useState(0);

  useLayoutEffect(() => {
    if (value === 0) {
      setValue(10 + Math.random() * 200);
    }
  }, [value]);

  console.log('render', value);

  return <div onClick={() => setValue(0)}>value: {value}</div>;
};

useEffect와 useLayoutEffect 

기본적으로 이 둘은 동일하다. 

하지만, useLayoutEffect는 브라우저의 painting작업을 blocking하고 먼저 호출되게한다.

위 코드를 useEffect로 바꿔서 실행하다보면, 깜박거리는 현상이 발생한다.

하지만, useLayoutEffect를 사용하게되면, 그 깜박거리는 현상이 사라진다.

 

 

 

useRef, createRef

const BlinkRender = () => {
  const [renderIndex, setRenderIndex] = useState(1);
  const refFromUseRef = useRef();
  const refFromCreateRef = createRef();

  if (!refFromUseRef.current) {
    refFromUseRef.current = renderIndex;
  }

  if (!refFromCreateRef.current) {
    refFromCreateRef.current = renderIndex;
  }

  return (
    <>
      <p>Current render index: {renderIndex}</p>
      <p>refFromUseRef: {refFromUseRef.current}</p>
      <p>refFromCreateRef: {refFromCreateRef.current}</p>
      <button onClick={() => setRenderIndex(prev => prev + 1)}>
        Focus Input
      </button>
    </>
  );
};

기본적으로 이 둘도 동일하다.

하지만, useRef는 재렌더링을 하지않고, createRef는 랜더링을 한다.

그래서 화면에서 보면 createRef를 사용한경우 숫자가 올라가는 반면, useRef는 숫자가 올라가지않음

(하지만, 실제로 값은 둘다 올라가고 있는중!!)

 

 

 

useEffect와 isEqual 

const BlinkRender = () => {
  const [user, setUser] = useState({ name: 'react', count: 1 });

  useEffect(() => {
    if (!isEqual(prevUserRef.current, user)) {
      // deep comparison
      console.log('updated');
    }

    // shallow comparions 얕은 검사를 하기때문에 count가 변동이 되지 않아도 위에 콘솔이 찍혀버린다 -> 두번째 인자를 user.count로 바꾸면 해결이 되기도 하지만 isEqual이라는 lodash(npm i 로 설치해야됨) 깊은 검사를 한다
  }, [user]);

  const prevUserRef = useRef();
  useEffect(() => {
    prevUserRef.current = user;
  });

  const randomUp = () => {
    const count = Math.random() >= 0.5 ? user.count : user.count + 1;
    setUser(prevUser => ({ ...prevUser, count }));
  };

  return (
    <>
      <p>Count: {user.count}</p>
      <button onClick={randomUp}> random up</button>
    </>
  );
};

 

 

createContext , useContext

 

useContext를 사용하기위해 createContext로 생성해줘야한다.

 

 

useRef  유일하게 내장되어있는 Hook들 중에 전체 라이프사이클에서 데이터를 유지함.

 

 

반응형