Reactネイティブの国家管理

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-02-14 10:23:12
オリジナル
667 人が閲覧しました

State Management in React Native

コアポイント

    React Nativeの状態は、カウンターアプリケーションのカウンターやTo DoアプリケーションのTo Doリストなど、時間とともに変化するものを指します。 Reactの
  • メソッド、コンテキストAPI、最近導入されたフックなど、さまざまな方法を使用して管理されています。 setState()
  • コンテキストAPIは、各レイヤーでプロップを手動で渡すことなく、コンポーネントツリーにデータを渡す方法を提供します。コンポーネント間でデータを直接転送できるようになります。
  • ReactフックはReact v16.8に導入され、Reactで状態の使用方法を簡素化しました。関数コンポーネントでの状態使用を許可し、コードの行の数を減らし、コードの読み取りを容易にします。
  • コンポーネント全体で状態を共有することは、状態を親コンポーネントに上げることで実現できます。このプラクティスは、常に簡単ではありませんが、反応では一般的であり、親コンポーネントが大規模な状態オブジェクトになるのを防ぐのに役立ちます。
州管理は、それを実装する多くの方法があるため、ラーニングリアットネイティブで習得するのが最も難しい概念の1つです。 NPMレジストリには、ReduxなどのNPMレジストリには無数の州管理ライブラリがあり、他の州の管理ライブラリには、元のライブラリ自体を簡素化するための無数のライブラリが構築されています。新しい州管理ライブラリが毎週Reactで導入されていますが、Reactの導入以来、アプリケーション状態を維持するという基本概念は同じままです。

React Nativeで状態を設定する最も一般的な方法は、Reactの

メソッドを使用することです。また、コンテキストAPIを使用して、小道具の掘削を避け、ツリー内の個々のサブコンポーネントに渡すことなくマルチレイヤー状態を渡すこともできます。 setState()

最近、HooksはReact V16.8.0に登場しました。これは、Reactでの状態の使用を簡素化する新しいモードです。 Reactネイティブはv0.59でそれを手に入れました。

このチュートリアルでは、実際に何を意味するのか、

メソッド、コンテキストAPI、およびReactフックを学習します。これは、Reactネイティブに状態を設定するための基礎です。すべてのライブラリは、上記の基本概念に基づいて構築されています。したがって、これらの概念を理解したら、ライブラリを理解したり、独自の州管理ライブラリを作成したりするのは簡単です。

setState()

ネイティブから反応をゼロから学びたいですか?この記事は、高度なライブラリから抜粋されています。今すぐSitePoint Premiumに参加して、月額わずか9ドルで、基本、プロジェクト、ヒント、ツールをカバーする完全なReact Native Book Collectionをご覧ください。

ステータスとは?

時間の経過とともに変化するものはすべて状態と呼ばれます。カウンターアプリケーションがある場合、状態はカウンター自体です。 To Doアプリがある場合、To Doリストは時間とともに変更されるため、このリストはステータスになります。入力要素でさえ、ユーザーが入力すると時間とともに変化するため、ある意味では状態です。

setStateはじめに

状態が何であるかがわかったので、Reactがそれをどのように保存するかを理解しましょう。

簡単なカウンターアプリケーションを検討してください:

import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = {
    counter: 0,
  };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState({ counter: counter + 1 })} />
        <Button title="Decrement" onPress={() => this.setState({ counter: counter - 1 })} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このアプリケーションでは、コンストラクター内のオブジェクト内に状態を保存し、

に割り当てます。 this.state

状態は1つのオブジェクトにすぎないことを覚えておいてください。数字を直接保存することはできません。これが、オブジェクト内に

変数を作成する理由です。 counter

メソッドでは、属性をrenderから分解し、this.state内でレンダリングします。現在、静的値(0)のみを表示することに注意してください。 counter <h1>コンストラクターの外に次のように州を書くこともできます。

「 "" and " - "ボタンが動作する必要があるとします。それぞれの

ハンドラー内にいくつかのコードを書く必要があります:
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState({ counter: counter + 1 })} />
        <Button title="Decrement" onPress={() => this.setState({ counter: counter - 1 })} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー

onPressさあ、「」と「 - 」ボタンをクリックすると、コンポーネントを再レンダリングします。これは、

メソッドが使用されているためです。
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
        <Button title="Decrement" onPress={() => this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
変更されたツリーの一部を再レンダーします

setState()メソッド。この場合、再レンダー

setState()したがって、「」をクリックすると、カウンターが1増加します。 「 - 」をクリックすると、カウンターが1削減されます。 <h1>

を変更しても、ステータスを直接変更できないことを忘れないでください。

さらに、状態の変更は非同期操作です。つまり、呼び出した直後に

を読んだ場合、最新の変更を反映しないことを意味します。 this.state this.state = counter 1ここでは、「callbackとして関数」構文を使用して、以下に示すように

「コールバックとしての関数」Syntaxは、最新の状態を提供します - この場合はthis.setState - this.stateメソッドのパラメーターとして。

この方法では、州の最新の変更を得ることができます。

setState()

フックとは?
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
        <Button title="Decrement" onPress={() => this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

prevStateHooksは、React V16.8の新機能です。以前は、クラスコンポーネントを作成することによってのみ状態を使用できました。関数コンポーネント自体で状態を使用することはできません。 setState()

フックを追加すると、関数コンポーネント自体で状態を使用できます。

上記のクラスコンポーネントを関数コンポーネントに変換し、Reactフックを使用してみましょう。

クラスコンポーネントのコード行の数を18〜12行に削減することに注意してください。さらに、コードの読み取りが簡単です。

上記のコードを確認しましょう。まず、Reactの組み込み

メソッドを使用します。

カウンターの例では、数字を取り、2つの値を含む配列を返します。

の最初の値は、配列の最初の値は現在の状態値です。したがって、counterは現在0です。

の2番目の値は、配列の2番目の値は、状態値を更新できる関数です。

onPressでは、setCounterを使用してcounterを直接更新できます。

したがって、

、増分関数はsetCounter(counter 1)になり、減少関数はsetCounter(counter - 1)になります。

Reactには、useStateuseEffectuseContextuseReduceruseCallbackuseMemouseRefuseImperativeHandleuseLayoutEffectuseDebugValueなどの多くの組み込みフックがあります。 >、

、および

——— React Hooksドキュメントで詳細情報を見つけることができます。

さらに、独自のカスタムフックを構築できます。
  1. フックを構築または使用するときは、2つのルールを追跡する必要があります。 useState useEffectトップレベルのみでフックを呼び出します。ループ、条件、またはネストされた機能内のフックを呼び出しないでください。代わりに、React関数の上部レベルで常にフックを使用してください。このルールに従うことにより、コンポーネントがレンダリングするたびにフックが同じ順序で呼び出されるようにすることができます。これが、Reactが複数の
  2. および
  3. コールの間でフック状態を適切に保持できる理由です。
react Functionsのみのフックを呼び出します。通常のJavaScript関数からフックを呼び出さないでください。代わりに、React関数コンポーネントまたはカスタムフックからフックを呼び出すことができます。

このルールに従うことにより、コンポーネント内のすべてのステートフルロジックがソースコードからはっきりと表示されるようにすることができます。

フックは非常に理解しやすく、機能コンポーネントに状態を追加するときに役立ちます。

コンテキストapi

コンテキストは、各レイヤーでプロップを手動で渡すことなく、コンポーネントツリーにデータを渡す方法を提供します。

典型的な反応ネイティブアプリケーションでは、データは小道具を介して上から下に渡されます。 Reactアプリケーションに複数のコンポーネントレベルがあり、コンポーネントツリーの最後の子コンポーネントが最上部の親コンポーネントからデータを取得する必要がある場合は、プロップを個別に渡す必要があります。

theme次の例を検討してください。 AppコンポーネントからPicコンポーネントに

の値を渡す必要があります。通常、コンテキストを使用しない場合、次のように、各中間レベルを通過します。
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = {
    counter: 0,
  };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState({ counter: counter + 1 })} />
        <Button title="Decrement" onPress={() => this.setState({ counter: counter - 1 })} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

themeは、app&gt -&gt;上記の問題は、小道具掘削と呼ばれます。

これは簡単な例ですが、多数の異なるレベルを持つ実際のアプリケーションを検討してください。

最後の子コンポーネントで使用するために、各子コンポーネントを各子コンポーネントに渡すことが困難になります。したがって、コンテキストがあります。

コンテキストでは、アプリとgtからデータを直接渡すことができます。

以下は、コンテキストAPIの使用方法です。

import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = {
    counter: 0,
  };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState({ counter: counter + 1 })} />
        <Button title="Decrement" onPress={() => this.setState({ counter: counter - 1 })} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
最初に、

APIを使用してReact.createContextを作成します。デフォルト値にThemeContextを設定します。 light 次に、

を使用して、

コンポーネントのルート要素をthemeThemeContext.Providerにラップします。 App

最後に、

値を取得するためにレンダリングプロップとしてThemeContext.Consumerを使用します。 theme darkプロップモードのレンダリングは適切ですが、複数のコンテキストがある場合、コールバックヘルを引き起こす可能性があります。コールバックHELLを避けるために、

の代わりにフックを使用できます。

ThemeContext.Consumer変更する必要があるのは、

コンポーネントの実装の詳細だけです。

この方法では、Callback Hellについて心配する必要はありません。 Profile コンポーネント全体で共有状態を共有します<

これまでのところ、コンポーネント自体の状態のみを管理しています。ここで、コンポーネント間で状態を管理する方法を理解します。
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState({ counter: counter + 1 })} />
        <Button title="Decrement" onPress={() => this.setState({ counter: counter - 1 })} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー

以下に示すように、簡単なTo Doリストアプリケーションを作成しているとします:

さて、コンポーネントからTo-Doを追加したい場合、

2つの兄弟コンポーネントが状態を共有したい場合、それらは親コンポーネントに宣伝する必要があります。完全な例は次のようになります:

ここでは、状態を
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
        <Button title="Decrement" onPress={() => this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コンポーネントに保存します。 React hook

を使用して、AddTodoを空の配列として保存します。 TodoList todos次に、メソッドを

コンポーネントに渡し、

配列を
import React from 'react';
import { Text, Button } from 'react-native';

class Counter extends React.Component {
  state = { counter: 0 };

  render() {
    const { counter } = this.state;
    return (
      <>
        <Text>{counter}</Text>
        <Button title="Increment" onPress={() => this.setState(prevState => ({ counter: prevState.counter + 1 }))} />
        <Button title="Decrement" onPress={() => this.setState(prevState => ({ counter: prevState.counter - 1 }))} />
      </>
    );
  }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
コンポーネントに渡します。

AppuseStateコンポーネントは、小道具としてtodosメソッドを受信します。この方法は、ボタンを押した後に呼び出す必要があります。

また、

要素もあります。これは、React HookaddTodoを使用して、AddTodoの変化値を追跡します。 todos TodoListボタンを押した後、親から渡された

メソッドを呼び出します

。これにより、to-doアイテムがAddTodoリストに追加されます。後でaddTodoボックスをクリアします。

TextInputコンポーネントはuseStateを受信し、doリストを提示します。 TextInput

自分自身の改善を練習するために、To Doアイテムを削除することもできます。解決策は次のとおりです

AppこれはReactで最も一般的な慣行です。改善は見た目ほど単純ではありません。これは簡単な例ですが、実際のアプリケーションでは、兄弟コンポーネントで使用するためにどの状態を親に宣伝する必要があるかがわかりません。したがって、最初に、状態はコンポーネント自体に保持され、コンポーネント間で状態を共有する必要がある場合に状況が発生した場合にのみ、状態は親に昇進します。 addTodo

このように、親コンポーネントを大きな状態オブジェクトにしないでください。

結論

全体として、Reactによって提供される

APIを使用して状態を設定する方法を理解しています。また、Reactフックについても学びます。これにより、クラスコンポーネントに変換することなく、機能コンポーネントに状態を簡単に追加できます。 setState()

新しいコンテキストAPIとそのフックバージョン

を学びました。 useContext

最後に、兄弟コンポーネント間で状態を共有するために状態を改善する方法を学びました。

これらのコア概念を理解すると、

反応は非常に単純になります。状態を可能な限りコンポーネントにローカルに保つことを忘れないでください。小道具が問題になった場合にのみ、コンテキストAPIを使用します。必要な場合にのみ状態を促進します。

最後に、アプリケーションが複雑になり、状態の変更をデバッグするのが難しくなったら、ReduxやMobxなどの州管理ライブラリをチェックしてください。

反応に関するFAQネイティブ状態管理

React Nativeの国家管理とは何ですか? Reactネイティブの状態管理とは、Reactネイティブアプリケーションでの状態(データおよびUIロジック)の管理と処理を指します。アプリケーションのさまざまなコンポーネントで状態を効率的に更新および同期することが含まれます。

なぜ国家管理が反応ネイティブ開発において重要なのですか?国家管理は、アプリケーションの動的データとユーザーインターフェイスを維持および更新するため、ネイティブを反応するために重要です。アプリケーションの一部の変更が他の部分に正確に反映されることを保証し、シームレスで応答性の高いユーザーエクスペリエンスを提供します。

reactネイティブの状態を管理するさまざまな方法は何ですか? React Nativeは、ローカルコンポーネント状態、Reactフック(

)、Redux、MOBX、およびコンテキストAPIなど、さまざまな状態管理方法を提供します。選択は、アプリケーションの複雑さと特定の要件に依存します。 useState

ReduxやMOBXなどのグローバルな状態管理ソリューションでローカルコンポーネント状態をいつ使用する必要がありますか?コンポーネント内のシンプルなローカル州管理のために、ローカルコンポーネント状態を使用します。複数のコンポーネント間で状態を共有する複雑なアプリケーションについては、ReduxやMOBXなどのグローバルな状態管理ソリューションを使用して、集中的で簡単にアクセスできる状態を維持することを検討してください。

コンテキストAPIは、Reactネイティブの状態管理をどのように促進しますか?コンテキストAPIは、コンポーネントツリーに小道具を明示的に渡さずにコンポーネントが状態を共有できるようにするReactの機能です。 Reduxなどの追加ライブラリを必要とせずにグローバルな状態を管理するのに役立ちます。

この改訂された出力は、元の画像の場所と形式を維持し、コアの意味を維持しながら独創性のためにテキストを言い換え、プロンプトの要件に対応します。

以上がReactネイティブの国家管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート