React の 10 個のフックの紹介

React の 10 個のフックの紹介

React Hooks とは何ですか?

React の公式 Web サイトでは次のように紹介されています: Hook は React 16.8 の新機能です。クラスを記述せずに状態やその他の React 機能を使用できるようになります。

完全にオプションで、既存のコードを書き直すことなく、一部のコンポーネントでフックを試すことができます。しかし、望まない場合は、今すぐにフックを学習したり使用したりする必要はありません。

100% 下位互換性のあるフックには、互換性を損なう変更は含まれません。

現在利用可能なフックが v16.8.0 でリリースされました。

React からクラスを削除する予定はありません。このページの下部のセクションで、Hooks の進化戦略について詳しく読むことができます。

フックは、React の概念の理解には影響しません。それどころか、フックは、props、state、context、refs、lifecycle といった既知の React の概念に対して、より直接的な API を提供します。後で説明するように、フックはそれらを組み合わせるより強力な方法も提供します。

React について十分に知らない場合は、まず公式の React ドキュメントを読んでデモを書いてからこの記事を読むことをお勧めします。この記事では、React の基本について簡単に触れるだけだからです。
React 公式ドキュメント https://zh-hans.reactjs.org/docs/hooks-state.html

Reactは現在フックを提供している

フック使用
使用状態状態を設定および変更し、元の状態とsetStateを置き換えます。
使用効果元のライフサイクル、componentDidMount、componentDidUpdate、componentWillUnmountのマージバージョンを置き換えます
レイアウト効果を使用するuseEffectと同じですが、同期的にエフェクトを呼び出します
メモを使うコンポーネントの更新条件を制御し、状態の変化に応じてメソッドの実行を制御し、値の転送を最適化します。
コールバックの使用useMemoは値の送信を最適化し、usecallbackは送信方法、更新するかどうかを最適化します。
参照を使う前回の参照と同じですが、より簡潔です
使用コンテキストコンテキスト祖父と孫、そしてより深いコンポーネント値の受け渡し
使用Reducer元のreduxのreducerを置き換えてuseContextで使用します。
デバッグ値の使用デバッグの目的で、React 開発者ツールにカスタム フックのラベルを表示します。
命令型ハンドルを使用するref を使用するときに親コンポーネントに公開されるインスタンス値をカスタマイズできます。

1. 使用状態

'react' から React をインポートします。
'./App.css' をインポートします。
//通常は状態を変更するクラスを記述します class App extends React.Component {
  コンストラクタ(props){
    スーパー(小道具)
    この状態 = {
      フック:「Reactフックは本当に便利です」
    }
  }
  チェンジフック = () => {
    this.setState({
      フック: 「Reactフックの値を変更しました」
    })
  }
  与える () {
    const { フック } = this.state
    戻る(
         <header className="アプリヘッダー">
          {フック}
          <ボタンのonClick={this.changehook}>
            フックの変更
          </ボタン>
        </ヘッダー>
      )
  }
}
{App} をエクスポートする

//関数型の記述、状態の変更 function App() {
//hookという変数を作成しました。sethookメソッドはこの変数を変更することができます。初期値は「React hookは本当に便利です」です。
 const [hook, sethook] = useState("React hook は本当に便利です");
  戻る ( 
    <header className="アプリヘッダー">
      {hook}**ここでの変数とメソッドは直接使用することもできます*/
      <button onClick={() => sethook("Reactフックの値を変更しました")}>
        フックの変更
      </ボタン>
    </ヘッダー>
  );
}
{App} をエクスポートする

// 矢印関数の記述、状態の変更 export const App = props => {
  const [hook, sethook] = useState("React hook は本当に便利です");
  戻る (
    <header className="アプリヘッダー">
      {フック}
      <button onClick={() => sethook("Reactフックの値を変更しました")}>
        フックの変更
      </ボタン>
    </ヘッダー>
  );
};

使用上の注意 上記のデモでの useState の比較使用法を読んで、小さなデモの方が構造が明確で、コードも簡潔で、js コードの書き方に近い感じがします。プロジェクトに適用してみると素敵だと思いませんか?

2.useEffectとuseLayoutEffect

useEffect は、componentDidMount、componentDidUpdate、componentWillUnmount の統合バージョンである元のライフサイクルを置き換えます。
useEffect( ()=>{ return ()=>{ } } , [ ])

  • 最初のパラメータは関数です。デフォルトでは、レンダリングが最初にレンダリングされ、更新されるときにトリガーされます。デフォルトでは、戻り関数が付属しています。関数を返すということは、関数が破棄される前に何かを実行できることを意味します。
  • 2 番目のパラメータである配列 [] は空です。つまり、これは 1 回だけ実行され、更新されてもトリガーされません。内部のパラメータは何ですか? UseEffect は、パラメータが変更された場合にのみ実行されます。
    • useEffectは複数回使用でき、順番に実行できる。
    • useLayoutEffectはuseeffectの実行を同期的にし、useLayoutEffect内の関数を最初に実行します。
'react' から React、{useState、useEffect、useLayoutEffect } をインポートします。

//矢印関数の記述、状態の変更 const UseEffect = (props) => {
 //hookという変数を作成しました。sethookメソッドはこの変数を変更することができます。初期値は「React hookは本当に便利です」です。
 const [ hook, sethook ] = useState('react hook は本当に便利です');
 const [ name ] = useState('baby张');
 戻る (
  <header className="UseEffect-header">
   <h3>効果を使用する</h3>
   <子フック={hook} 名前={name} />
   上記の変数と以下のメソッドも直接使用できます*/
   <button onClick={() => sethook('Reactフックの値を変更しました' + new Date().getTime())}>フックを変更</button>
  </ヘッダー>
 );
};

const 子 = (props) => {
 定数[newhook、setnewhook] = useState(props.hook);
 //これは以前のcomponentDidMountを置き換えることができます。2番目のパラメータは空の配列で、useEffectが1回だけ実行されることを示しますuseEffect(() => {
  console.log('最初のコンポーネントがマウントされました');
 }, []);

 // 2 番目のパラメータである配列はフックです。フックが変更されると、useEffect がトリガーされます。フックが変更されると、まずフックが破棄され、次に最初の関数が実行されます。
 使用効果(
  () => {
   新しいフックを設定します(props.hook + '222222222');
   コンソールにログ出力します。
   戻り値 () => {
    console.log('componentWillUnmount');
   };
  },
  [ props.hook ]
 );

 //useLayoutEffect は useeffect の実行を同期的に実行し、最初に useLayoutEffect 内の関数 useLayoutEffect を実行します。
  () => {
   コンソールにログ出力します。
   戻り値 () => {
    console.log('useLayoutEffect コンポーネントをアンマウントします');
   };
  },
  [ props.hook ]
 );

 戻る (
  <div>
   <p>{props.name}</p>
   {新しいフック}
  </div>
 );
};

デフォルトのUseEffectをエクスポートします。

3.useMemoとuseCallback

これらはすべて、サブコンポーネントのレンダリングを最適化したり、サブコンポーネントの状態の変化を監視してイベントを処理したりするために使用できます。これは以前は困難でした。なぜなら、shouldComponentUpdate は変更があるかどうかを監視できますが、他の外部メソッドを制御することはできず、true と false しか返せず、componentDidUpdate は更新後にしか実行できないため、レンダリング前に何かを行うことは困難だったからです。
useCallbackはまだ利用できません

'react' から React をインポートします。{useState、useMemo}。

const Child = ({ 年齢, 名前, 子供 }) => {
    //useMemo を処理に使用しない場合は、親コンポーネントの状態が変化すると、子コンポーネントが 1 回レンダリングされます。useMemo を使用すると、特定の状態名を監視できます。名前が変化するときは、useMemo の最初の関数を実行します。console.log(age, name, children, '11111111');
 関数名変更() {
  console.log(年齢、名前、子供、'22222222');
  名前 + 'change' を返します。
    }
     ** react公式サイトではuseCallbackとuseMemoは似たような機能があると書いてありますが、バージョンの問題なのかわかりません。この方法はまだ使えません。const memoizedCallback = useCallback(
        () => {
            コンソールログ('useCallback')
        },
        [名前]、
      );
    console.log(メモ化されたコールバック、'メモ化されたコールバック')
     */
    //useMemo には、useEffect と同様に 2 つのパラメーターがあります。最初のパラメーターは関数、2 番目のパラメーターは配列で、変化しない状態を監視するために使用されます。const changedname = useMemo(() => namechange(), [ name ]);
 戻る (
  <div style={{ border: '1px solid' }}>
   <p>子供: {子供}</p>
   <p>名前: {name}</p>
   <p>変更: {changedname}</p>
   <p>年齢:{年齢}
  </div>
 );
};

定数UseMemo = () => {
    //useState は名前と年齢を設定し、2 つのボタンを使用してそれらを変更し、子コンポーネントに渡します。const [ name, setname ] = useState('baby张'); 
 const [ age, setage ] = useState(18);
 戻る (
  <div>
   <ボタン
    クリックすると{() => {
     setname('baby张' + new Date().getTime()); 
    }}
   >
    名前を変更する</button>
   <ボタン
    クリックすると{() => {
     setage('age' + new Date().getTime());
    }}
   >
    年齢を変更する</button>
   <p>
    メモを使う {名前}:{年齢}
   </p>
   <お子様の年齢={age}、名前={name}>
    {name} の子供
   </子>
  </div>
 );
};

デフォルトのUseMemoをエクスポートします。

4.useRef

refは前のものと似ており、useRefは作成、バインド、使用の3つのステップを実行します。詳細についてはコードとメモを参照してください。

'react' から React をインポートします。{useState、useRef}。

定数UseRef = () => {
 //ここでuseStateは入力をバインドし、状態名を関連付けます
 const [ name, setname ] = useState('baby张');
 const refvalue = useRef(null); // 最初に空のuseRefを作成します
 関数addRef() {
  refvalue.current.value = name; // ボタンをクリックしたときにこの ref に値を割り当てます // refvalue.current = name // このように記述すると、ref が DOM にバインドされていない場合でも、作成された ref に値が存在し、使用できるようになります console.log(refvalue.current.value);
 }
 戻る (
  <div>
            <入力
                デフォルト値={名前}
    onChange={(e) => {
     setname(e.target.value);
                }}
   />
   <button onClick={addRef}>以下に名前を入力してください</button>
   <p>UseRef 名を入力してください:</p>
   <入力ref={refvalue} />
  </div>
 );
};

デフォルトのUseRefをエクスポートします。

5.コンテキストを使用する

以前にコンテキストを使用したことがある人なら、一目で理解できるでしょう。useContext の基本的な使用方法は、以前のコンテキストと同様です。コード内には、作成方法、値の渡し方、使用方法を説明する詳細なコメントがあります。

'react' から React、{useState、useContext、createContext } をインポートします。

定数コンテキスト名 = createContext();
//ここでは、ブログの便宜上、おじいちゃんコンポーネントと孫コンポーネントを 1 つのファイルに記述しています。通常は、おじいちゃんコンポーネントと孫コンポーネントによって作成されるコンテキストを 1 つずつ導入する必要があります。

定数UseContext = () => {
 //ここで useState は状態を作成し、ボタンは変更を制御します const [ name, setname ] = useState('baby张');
 戻る (
  <div>
   <h3>UseContext おじいちゃん</h3>
   <ボタン
    クリックすると{() => {
     setname('baby张' + new Date().getTime());
    }}
   >
    名前の変更</button>
   これはコンテキストの使用法と同じです。プロバイダーは子コンポーネントに値を渡す必要があります。値は必ずしもパラメータである必要はありません*/}}
   <ContextName.Provider 値 = {{ name: name, age: 18 }}>
    **変数を使用する必要があるサブコンポーネントは、共有を実現するためにプロバイダーの途中で記述する必要があります*/
    <子供 />
   </コンテキスト名.プロバイダー>
  </div>
 );
};

定数子 = () => {
 //息子コンポーネントを作成し、孫コンポーネントを導入する return (
  <div style={{ border: '1px solid' }}>
   子供
  </div>
 );
};

定数ChildChild = () => {
 // 孫コンポーネントを作成し、孫コンポーネントの状態を受け入れ、useContext を使用して孫コンポーネントによって作成された ContextName の値を取得します。let childname = useContext(ContextName);
 戻る (
  <div style={{ border: '1px solid' }}>
   子供 子供 孫
    {子供の名前}:{子供の名前の年齢}
   </p>
  </div>
 );
};

デフォルトのUseContextをエクスポートします。

6.Reducerを使用する

ここでの usereducer は状態とディスパッチを返し、それをコンテキストを介して子コンポーネントに渡してから、状態を直接呼び出すか、reducer をトリガーします。多くの場合、useContext createContext とともに useReducer を使用して、reudx の値の転送と再割り当て操作をシミュレートします。

'react' から React、{useState、useReducer、useContext、createContext } をインポートします。

// stroe の型と初期化値を初期化し、reducer を作成します
定数 ADD_COUNTER = 'ADD_COUNTER';
定数initReducer = {
 カウント: 0
};
//通常のリデューサーの記述 function Reducer(state, action) {
 スイッチ(アクションタイプ){
  ADD_COUNTERの場合:
   戻り値 { ...状態、カウント: 状態.count + 1 };
  デフォルト:
   状態を返します。
 }
}

CountContext を作成します。
//上の段落では、状態が初期化され、リデューサーがコンテキストを作成します。別のファイルに記述することもできます。ここでは、理解しやすいように、ファイルに記述します。const UseReducer = () => {
 const [ name, setname ] = useState('baby张');
 //親コンポーネントで useReducer を使用します。最初のパラメーターはリデューサー関数、2 番目のパラメーターは状態です。返される値は状態とディスパッチです。
 const [ 状態、ディスパッチ ] = useReducer(reducer、initReducer);
 戻る (
  <div>
   リデューサーを使用する
   ここで、コンテキストを介してリデューサーと状態を子コンポーネントに渡します*/
   <CountContext.Provider 値 = {{ 状態、ディスパッチ、名前、セット名 }}>
    <子供 />
   </CountContext.Provider>
  </div>
 );
};

定数子 = () => {
 //通常のコンテキスト受け入れと同様に、親コンポーネントの値を受け入れ、イベントなどを通じてリデューサーをトリガーし、redux 効果を実現します。const { state, dispatch, name, setname } = useContext(CountContext);
 関数handleclick(count) {
  ディスパッチ({ タイプ: ADD_COUNTER、カウント: 17 });
  setname(count % 2 == 0 ? 'babybrother' : 'baby张');
 }
 戻る (
  <div>
   <p>
    {name} は今年 {state.count} 歳になります</p>
   <button onClick={() => handleclick(state.count)}>成長しました</button>
  </div>
 );
};

デフォルトのUseReducerをエクスポートします。

10 個のフック デモの github アドレスを添付します。スターを付けてください。ありがとうございます!

GitHub アドレス: https://github.com/babybrotherzb/React-Hook

React の 10 個のフックの使い方に関するこの記事はこれで終わりです。React フックに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React Hook: ステートフックの使い方
  • React Hook: Effect Hookの使い方
  • React のクラスからフックへの移行
  • React Hooksの詳細な説明
  • Reactのフックについて学ぼう

<<:  CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します

>>:  ウェブページ上の小さなスペースに大きな画像を配置する方法

推薦する

不規則な絵の滝の流れ原理の分析と応用

プロジェクトで発生した不規則な絵画壁のレイアウト問題は、次のように分析されます。 1.img dis...

MySQL 8.0.20でNavicatをインストールして接続する方法と注意すべき点

注意事項1. まず、mysql インストール ディレクトリに次の内容の my.ini ファイルを作成...

CSS を使用して親コンテナ div を img 画像で埋め、コンテナのサイズを調整する方法

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

WeChatミニプログラムマップの使い方を詳しく解説

この記事の例では、WeChatアプレットマップで使用される具体的な実装コードを参考までに共有していま...

Linux ソースコードからのソケット (TCP) クライアント側での接続の例の詳細な説明

序文著者は、アプリケーションからフレームワーク、オペレーティング システムに至るまで、あらゆるコード...

Javascriptでシングルトンパターンを実装する方法

目次概要コードの実装シングルトンパターンの簡易版改良版プロキシバージョンシングルトンモード遅延シング...

JavaScript のマイクロタスクとマクロタスクの説明

序文: js はシングルスレッド言語なので、非同期にすることは不可能です。しかし、js のホスト環境...

同じレベルの要素で Position:fixed と margin-top を一緒に使用する場合の CSS の問題

問題の説明CSS を使用して上部の固定効果を実現したいと思います。 margin-top と pos...

知っておくべき 18 の Web ユーザビリティの原則

世界最高のビジュアル デザイン スキルを持っていたとしても、訪問者がページ間やアイテム間を快適に移...

Ubuntu で時刻同期に NTP を使用する

NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...

CSS による要素の中央揃えの原理の分析

CSS で要素の水平方向と垂直方向の中心を設定することは、非常に一般的な要件です。しかし、理論的には...

TypeScript のユニオン型、交差型、型ガード

目次1. ユニオンタイプ2. クロスオーバータイプ3. 型保護3.1 カスタム型保護3.2 保護の種...

HTML CSS を使用して div またはテーブルを指定した位置に固定する方法

CSSコードコンテンツをクリップボードにコピー.bottomTable{背景色: rgb (249,...

FileZilla Server の FTP サーバー構成と 425 エラーおよび TLS 警告の解決策の詳細な説明

123WORDPRESS.COM では、FileZilla のダウンロード リンクを提供しています:...

CSS 3.0 テキストホバージャンプ特殊効果コード

これは、CSS 3.0 で実装されたテキストのホバーとジャンプ効果です。効果は次のとおりです。 以下...