React|最適化素子性能03(不変性の重要性を考慮する必要はない)


🔶 不変性の重要性


非常に重要:(反応素子で)更新状態→一定に保つ

🔹 サンプルコード(onToggle)&説明

const onToggle = useCallback((id) => {
    setTodos((todos) =>
      todos.map((todo) =>
        todo.id === id ? { ...todo, checked: !todo.checked } : todo,
      ),
    );
  }, []);

  • [実施]既存データを修正する場合
    →直接xを修正する
    →新規シナリオの作成→新規オブジェクトの作成→必要な部分を置換

  • 更新が必要な場所に新しいアレイ/オブジェクトを作成します.
    → React.memoの使用:propsの変化を理解してレンダリング性能を最適化する
  • 🔹 不変性を維持するのは何ですか?


    ==既存値:xを直接変更&新しい値の作成

    🔹 不変性コードの例


  •     const array = [1,2,3,4,5];
        
        // 나쁜 예
        const nextArrayBad = array; // 똑같은 배열 가리킴 (배열 복사x)
        nextArrayBad[0]=100;
        console.log(array === nextArrayBad) // 완전 같은 배열 (true)
        
        // 좋은 예
        const nextArrayGood = [...array] // 모두 복사 (배열 내부 값)
        nextArrayGood[0]=100;
        console.log(array === nextArrayGood) // 다른 배열 (false)
  • オブジェクト
  •     const object = {
          foo: 'bar',
          value: 1
        }
        
        // 나쁜 예
        const nextObjectBad = object; // 같은 객체 가리킴 (복사x)
        nextObjectBad.value = nextObjectBad.value +1;
        console.log(object === nextObjectBad); // true (같은 객체)
        
        // 좋은 예
        const nextObjectGood = {
          ...object, // 모두 복사 (기존 내용)
          value: object.value+1 // 새로운 값 덮어 씀
        }
        console.log(object===nextObjectGood) // false (다른 객체)

    🔹 変わらない時はない。


  • オブジェクトの内部値を検出→新しい値がxを変更したかどうか
    → React.memoでは最適化できません(相互比較)
  • 🔹 展開演算子(…構文)→オブジェクト/配列の内部値をコピーする場合


  • 浅いコピー
    =一番外側の値のみコピー

  • 内部値がオブジェクトまたは配列の場合.
    内部値は個別にコピーする必要があります.

  • サンプルコード
  •     const todos = [{id: 1,checked: true},{id:2,checked: true}];
        const nextTodos = [...todos];
        
        nextTodos[0].checked=false;
        console.log(todos[0]===nextTodos[0]); // true (같은 객체 가리킴)
        
        nextTodos[0]={
          ...nextTodos[0],
          checked:false
        }
        console.log(todos[0]===nextTodos[0]); // false (새로운 객체를 할당)

    🔹 オブジェクト内のオブジェクト


  • 変更せずに新しい値を割り当てる必要があります.

  • サンプルコード
  •     const nextComplexObject = {
          ...complexObject,
          objectInside:{
            ...complexObject.objectInside,
            enabled: false
          }
        }
        
        console.log(complexObject === nextComplexObject) // false
        console.log(complexObject.objectInside === nextComplexObject.objectInside) // false

  • 利用immer→複雑な場合
    →仕事が楽
  • 🔶 パフォーマンスの最適化は不要


  • 内部データ<100個

  • 更新頻度x