反応フックとは何ですか?

Nov 26, 2020 pm 04:50 PM
react hooks

React フックは React16.8 の新機能であり、React 関数コンポーネントが状態を持つことを可能にし、componentDidMount やcomponentDidUpdate などのライフサイクル メソッドを提供します。

反応フックとは何ですか?

React クラス コンポーネントのほとんどは状態を保存できますが、関数コンポーネントは状態を保存できません。また、クラスコンポーネントにはライフサイクルがありますが、関数コンポーネントにはライフサイクルがありません。

React の初期のバージョンでは、クラス コンポーネントは PureComponent を継承することで不要なレンダリングを最適化できます。関数コンポーネントと比較して、React 公式 Web サイトには、不要なレンダリングを減らすために関数コンポーネントをキャッシュする対応するメソッドが提供されていません。16.6 直接React.memo関数が出てきます。

React 16.8 の新しいフックでは、React 関数コンポーネントに状態を持たせ、componentDidMount やcomponentDidUpdate などのライフサイクル メソッドを提供できます。

フック 「フック」を意味する言葉です。

React Hooks は、コンポーネントが可能な限り純粋な関数として記述されるべきであることを意味します。外部関数と副作用が必要な場合は、フックを使用して外部コードを「フック」する必要があります。 React Hook はそのフックです。

必要なフックを使用してください。 React はデフォルトでいくつかの一般的なフックを提供しており、独自のフックをカプセル化することもできます。

すべてのフックは関数に外部関数を導入するため、React は識別しやすいようにフックの名前に use プレフィックスが付いていることに同意します。 xxx 関数を使用する場合、フックの名前は usexxx になります。

以下では、React がデフォルトで提供する最も一般的に使用される 4 つのフックを紹介します。

  • #useState()

  • useContext()

  • useReducer()

  • useEffect()

useState(): 状態フック

useState() の紹介関数コンポーネントの状態。純粋な関数は状態を持つことができないため、状態をフックに置きます。

この記事の前半のコンポーネント クラスでは、ユーザーがボタンをクリックすると、ボタンのテキストが変更されます。テキストは、ユーザーがクリックしたかどうかによって異なります。これが状態です。 useState()を使って以下のように書き換えます。

import React, { useState } from "react";
export default function  Button()  {
  const  [buttonText, setButtonText] =  useState("Click me,   please");
  function handleClick()  {
    return setButtonText("Thanks, been clicked!");
  }
  return  <button  onClick={handleClick}>{buttonText}</button>;
}
ログイン後にコピー

デモ アドレス: https://codesandbox.io/s/nifty-waterfall-4i2dq

上記のコードでは、Button コンポーネントは関数であり、次のコードを使用します。 useState を内部的に使用します () フックでステータスを導入します。

useState() この関数は状態の初期値をパラメータとして受け取ります。上記の例では、初期値はボタンのテキストです。この関数は配列を返します。配列の最初のメンバーは、状態の現在の値を指す変数 (上の例では buttonText) です。 2 番目のメンバーは状態の更新に使用される関数で、規則は set プレフィックスと状態の変数名です (上記の例は setButtonText)。

useContext(): 状態共有フック

コンポーネント間で状態を共有する必要がある場合は、useContext() を使用できます。

現在、Navbar と Messages という 2 つのコンポーネントがあり、それらの間で状態を共有したいと考えています。

<div className="App">
  <Navbar/>
  <Messages/>
</div>
ログイン後にコピー

最初のステップは、React Context API を使用してコンポーネントの外側に Context を作成することです。

const AppContext = React.createContext({});
ログイン後にコピー

コンポーネントのカプセル化コードは次のとおりです。

<AppContext.Provider value={{
  username: &#39;superawesome&#39;
}}>
  <div className="App">
    <Navbar/>
    <Messages/>
  </div>
</AppContext.Provider>
ログイン後にコピー

上記のコードでは、AppContext.Provider はサブコンポーネントで共有できる Context オブジェクトを提供します。

Navbar コンポーネントのコードは次のとおりです。

const Navbar = () => {
  const { username } = useContext(AppContext);
  return (
    <div className="navbar">
      <p>AwesomeSite</p>
      <p>{username}</p>
    </div>
  );
}
ログイン後にコピー

上記のコードでは、 useContext() フック関数を使用して Context オブジェクトを導入し、そこからユーザー名属性を取得します。

メッセージ コンポーネントのコードも同様です。

const Messages = () => {
  const { username } = useContext(AppContext)
  return (
    <div className="messages">
      <h1>Messages</h1>
      <p>1 message for {username}</p>
      <p className="message">useContext is awesome!</p>
    </div>
  )
}
ログイン後にコピー

デモ:https://codesandbox.io/s/react-usecontext-redux-0bj1v

useReducer(): アクションフック #React 自体は状態管理機能を提供しておらず、通常は外部ライブラリを使用する必要があります。このために最も一般的に使用されるライブラリは Redux です。

Redux の中心的な概念は、コンポーネントがアクションを発行して状態マネージャーと通信するということです。状態マネージャーはアクションを受け取った後、Reducer 関数を使用して新しい状態を計算します。Reducer 関数の形式は (state, action) => newState です。

useReducers() フックは、Reducer 関数を導入するために使用されます。

const [state, dispatch] = useReducer(reducer, initialState);
ログイン後にコピー

上記はuseReducer()の基本的な使い方で、Reducer関数と状態の初期値をパラメータとして受け取り、配列を返します。配列の最初のメンバーは状態の現在の値で、2 番目のメンバーはアクションを送信するディスパッチ関数です。

以下はカウンタの例です。状態の計算に使用される Reducer 関数は次のとおりです。

const myReducer = (state, action) => {
  switch(action.type)  {
    case(&#39;countUp&#39;):
      return  {
        ...state,
        count: state.count + 1
      }
    default:
      return  state;
  }
}
ログイン後にコピー

コンポーネントのコードは次のとおりです。

function App() {
  const [state, dispatch] = useReducer(myReducer, { count:   0 });
  return  (
    <div className="App">
      <button onClick={() => dispatch({ type: &#39;countUp&#39; })}>
        +1
      </button>
      <p>Count: {state.count}</p>
    </div>
  );
}
ログイン後にコピー

デモ: https://codesandbox.io/s/react-usereducer-redux-xqlet

フックは共有状態と Reducer 関数を提供できるため、これらの点で Redux を置き換えることができます。ただし、ミドルウェアとタイムトラベルは提供できないため、これら2つの機能が必要な場合は、やはりReduxを使用する必要があります。

useEffect(): 副作用フック useEffect() は、副作用のある操作を導入するために使用されます。最も一般的なのは、サーバーからのデータ。以前にcomponentDidMountに配置されていたコードをuseEffect()に配置できるようになりました。

useEffect()の使い方は以下の通りです。

useEffect(()  =>  {
  // Async Action
}, [dependencies])
ログイン後にコピー

上面用法中,useEffect()接受两个参数。第一个参数是一个函数,异步操作的代码放在里面。第二个参数是一个数组,用于给出 Effect 的依赖项,只要这个数组发生变化,useEffect()就会执行。第二个参数可以省略,这时每次组件渲染时,就会执行useEffect()。

下面看一个例子。

const Person = ({ personId }) => {
  const [loading, setLoading] = useState(true);
  const [person, setPerson] = useState({});
  useEffect(() => {
    setLoading(true); 
    fetch(`https://swapi.co/api/people/${personId}/`)
      .then(response => response.json())
      .then(data => {
        setPerson(data);
        setLoading(false);
      });
  }, [personId])
  if (loading === true) {
    return <p>Loading ...</p>
  }
  return <div>
    <p>You&#39;re viewing: {person.name}</p>
    <p>Height: {person.height}</p>
    <p>Mass: {person.mass}</p>
  </div>
}
ログイン後にコピー

上面代码中,每当组件参数personId发生变化,useEffect()就会执行。组件第一次渲染时,useEffect()也会执行。

demo:https://codesandbox.io/s/react-useeffect-redux-9t3bg

创建自己的 Hooks

上例的 Hooks 代码还可以封装起来,变成一个自定义的 Hook,便于共享。

const usePerson = (personId) => {
  const [loading, setLoading] = useState(true);
  const [person, setPerson] = useState({});
  useEffect(() => {
    setLoading(true);
    fetch(`https://swapi.co/api/people/${personId}/`)
      .then(response => response.json())
      .then(data => {
        setPerson(data);
        setLoading(false);
      });
  }, [personId]);  
  return [loading, person];
};
ログイン後にコピー

上面代码中,usePerson()就是一个自定义的 Hook。

Person 组件就改用这个新的钩子,引入封装的逻辑。

const Person = ({ personId }) => {
  const [loading, person] = usePerson(personId);
  if (loading === true) {
    return <p>Loading ...</p>;
  }
  return (
    <div>
      <p>You&#39;re viewing: {person.name}</p>
      <p>Height: {person.height}</p>
      <p>Mass: {person.mass}</p>
    </div>
  );
};
ログイン後にコピー

demo:https://codesandbox.io/s/react-useeffect-redux-ghl7c

更多编程相关知识,请访问:编程学习网站!!

以上が反応フックとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles