`console.log()`로 이것저것 리액트 기본사항을 확인했습니다.

19630 단어 react
일본어로 기사를 읽으려면 여기를 클릭하세요: https://zenn.dev/takuyakikuchi/articles/2c4071a58bd4d7

console.log() 렌더링 타이밍 확인



⚠️ 로깅 결과를 단순화하기 위해 수명 주기가 두 번 호출되지 않도록 "엄격 모드"를 의도적으로 비활성화합니다.
Strict Mode – React

1. 부모 구성 요소 및 자식 구성 요소의 상태 업데이트 및 다시 렌더링


확인할 사항


  • 상위 구성 요소 및 하위 구성 요소의 상태가 변경될 때 다시 렌더링되는지 확인합니다.

  • 암호


  • 상위 구성 요소: App
  • 하위 구성 요소:
  • ChildA (부모로부터 소품을 받음)
  • 상태가 count입니다.
  • ChildB (부모로부터 소품을 받지 않음)


  • const ChildA = ({ state }) => {
      const [count, setCount] = React.useState(0);
    + console.log(`rendering in child A component: count has ${count}`);
      return (
        ...
          <button onClick={() => setCount(count + 1)}>Child A: Count-up</button>
        ...
      );
    };
    const ChildB = () => {
      console.log("rendering in child B component");
      return <div>Child B doesn't have props passed from the parent</div>;
    };
    export default function App() {
      const [state, setState] = React.useState(false);
      console.log("rendering in parent component");
      return (
        <div className="App">
          ...
          <button onClick={() => setState(!state)}>Update the parent state</button>
          ...
          <ChildA state={state} />
          ...
          <ChildB />
        </div>
      );
    }
    

    콘솔 결과



    <!-- 1. Initial rendering -->
    rendering in parent component 
    rendering in child A component: count has 0 
    rendering in child B component 
    <!-- 2. Update the parent state -->
    rendering in parent component 
    rendering in child A component: count has 0 
    rendering in child B component 
    <!-- 3. Update the child A state -->
    rendering in child A component: count has 1 
    <!-- 4. Update the parent state -->
    rendering in parent component 
    rendering in child A component: count has 1 
    rendering in child B component 
    

    확인됨


  • 상위 구성 요소의 상태가 변경되면 props 전달 여부에 관계없이 상위 구성 요소와 하위 구성 요소 모두에서 다시 렌더링이 발생합니다. (2번 참조)
  • 하위 구성 요소에서 상태가 변경되면 해당 구성 요소에서만 다시 렌더링이 발생합니다. (3번 참조)
  • 상위 구성 요소가 다시 렌더링되고 하위 구성 요소가 다시 렌더링되면 하위 구성 요소의 상태가 최신 상태로 유지됩니다. (4호 참조)

  • 데모





    2. useState initialState 대 Lazy 초기 상태



    확인할 사항


  • 지연 초기 상태가 초기 렌더링에서만 호출되는지 확인합니다.
  • 반면에 initialState는 매번 다시 렌더링할 때마다 호출되는지 확인합니다.

  • React: useState

    암호


  • 상위 구성 요소: App
  • 하위 구성 요소: Child .
  • childStateA 상태: 게으른 초기 상태
  • childStateB 상태: 초기 상태


  • const someExpensiveCalculation = (number, type) => {
      console.log(`in the ${type} initial state`);
      return number * 10;
    };
    const Child = ({ number }) => {
      const [childStateA, setChildStateA] = React.useState(() => {
        return someExpensiveCalculation(number, "lazy");
      });
      const [childStateB, setChildStateB] = React.useState(
        someExpensiveCalculation(number, "default")
      );
      console.log(
        `rendering in child component: A: ${childStateA}, B: ${childStateB}`
      );
      return (
        <>
          <p>{`The childStateA is ${childStateA}`}</p>
          <button onClick={() => setChildStateA(childStateA + 1)}>
            Child A: Count-up
          </button>
          <p>{`The childStateB is ${childStateB}`}</p>
          <button onClick={() => setChildStateB(childStateB + 1)}>
            Child B: Count-up
          </button>
        </>
      );
    };
    export default function App() {
      const [state, setState] = React.useState(false);
      return (
        <div className="App">
          <button onClick={() => setState(!state)}>Update the parent state</button>
          <Child number={10} />
        </div>
      );
    }
    


    콘솔 결과




    <!-- 1. Initial rendering -->
    in the lazy initial state 
    in the default initial state 
    rendering in child component: A: 100, B: 100 
    <!-- 2. Parent state update -->
    in the default initial state 
    rendering in child component: A: 100, B: 100 
    <!-- 3. Child state A update -->
    in the default initial state 
    rendering in child component: A: 101, B: 100 
    <!-- 3. Child state B update -->
    in the default initial state 
    rendering in child component: A: 101, B: 101 
    <!-- 4. Parent state update -->
    in the default initial state 
    rendering in child component: A: 101, B: 101 
    


    확인됨


  • 지연 초기 상태에서 someExpensiveCalculation()`은 초기 렌더링 시에만 호출되고 다시 렌더링 시 무시됩니다.
  • 반면 단순히 initialState 로 값을 넘기면 re-rendering이 실행될 때마다 someExpensiveCalculation()`이 호출됩니다.

  • 데모





    3. 사용시기 효과



    확인할 사항


  • 렌더링 결과가 화면에 반영된 후 useEffect에 전달된 함수가 실행되는지 확인하십시오.

  • React: useEffect

    암호


  • useEffect가 종속 값인 state에서 데이터를 가져온 후 message 상태를 업데이트합니다.

  • const dataFetchMock = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("setMessage executed in useEffect");
      }, 1500);
    });
    export default function App() {
      const [message, setMessage] = React.useState();
      const [state, setState] = React.useState(false);
      React.useEffect(() => {
        console.log(`in useEffect. state: ${state}`);
        dataFetchMock.then((value) => {
          setMessage(value);
        });
      }, [state]);
    
      console.log(`rendering: just before return jsx. message: ${message}`);
      return (
        <div className="App">
          <button onClick={() => setState(!state)}>Update the parent state</button>
          <p>{message === undefined ? "undefined" : message}</p>
        </div>
      );
    }
    


    콘솔 결과




    <!-- 1. Initial rendering -->
    rendering: just before return jsx. message: undefined 
    in useEffect. state: false 
    rendering: just before return jsx. message: setMessage executed in useEffect 
    <!-- 2. State(dependency of the useEffect) updated -->
    rendering: just before return jsx. message: setMessage executed in useEffect 
    in useEffect. state: true 
    rendering: just before return jsx. message: setMessage executed in useEffect 
    


    확인됨


  • *useEffect가 렌더링 후 작동합니다. *
  • 초기 렌더링(1번 참조), 먼저 렌더링 => useEffect => message에서 useEffect 상태 변경 트리거된 렌더링 다시
  • useEffect의 종속성 배열에 포함된 상태를 업데이트할 때(2번 참조) 상태를 업데이트하여 렌더링 => useEffect => message에서 useEffect 상태를 변경하여 다시 렌더링합니다.


  • 데모





    요약



    막연한 이해로 React를 사용할 수 있습니다.
    다만, 리렌더링 등의 타이밍을 직접 확인하는 것이 도움이 될 것이라고 생각했습니다.

    좋은 웹페이지 즐겨찾기