useState

  1. React Developer Toolでレンダリング表示を有効にする

  2. <div className="card">...</div><Counter/> コンポーネントとして切り出す

    1. setCount((count) => count+1)setCount(count+1) に変更しておく。
     import { useState } from 'react';
     
     export const Count = () => {
       const [count, setCount] = useState(0)
    
       return (
         <div className="card">
           <button onClick={() => setCount(count + 1)}>
             count is {count}
           </button>
           <p>
             Edit <code>src/App.jsx</code> and save to test HMR
           </p>
         </div>
       )
     }
    
  3. レンダリングの違いを確認する

  4. <Counter /> をコピーして <ObjectCounter /> を作成し、useStateで保存する値をオブジェクトに変更する。

     import { useState } from 'react';
    
     export const ObjectCounter = () => {
       const [state, setState] = useState({ count: 0 });
    
       return (
         <div className="card">
           <button
             className="btn btn-primary text-xl"
             onClick={() => {
               state.count = state.count + 1;
               setState(state);
             }}
           >
             count is {state.count}
           </button>
           <p>
             Edit <code>src/App.tsx</code> and save to test HMR
           </p>
         </div>
       );
     };
    
  5. オブジェクトの値を直に書き換えてもコンポーネントが再レンダリングされないことを確認する。

    1. onClickで新規オブジェクトを作成してsetするとコンポーネントが再レンダリングされることを確認する
  6. previousValueを使って振る舞いの違いを確認する

    1. setCount(count+1)を2回呼んでも2ずつ増えないことを確認する
    2. previousValueを使って2ずつ増えるように変更する
  7. 新たに <Note /> コンポーネントを作成する。

    export const Note = () => {
    	return <p className="text-3xl">Note</p>
    }
    
  8. <Note /><Counter/> コンポーネントに追加し、aとbのレンダリングの違いを確認する

    1. <Note /> を子要素として追加した場合
    2. <Note /> をchildrenで受け取って表示した場合