マスターは一方向データフローに反応する


プログラミングの任意の形式と同様に、反応アプリケーション内のデータを管理する方法の数十です.それは、すべての方法が等しくスケーリングすることができるというわけではないと言いました.あなたの反応アプリケーションのいくつかの“提案されたパターン”は、あなたが再構築するか、アプリケーションを構築しているときに既存のコードを再評価するために一時停止することを余儀なくされていないことを確認するに従ってください.
今日、我々は最も重要な構造のベストプラクティスのいずれかをあなたの反応のアプリケーションを構築するときに従うことをカバーする:一方向のデータフロー.

一方向性データフローとは何か?


一方向性データフローは、コンポーネントが一方向にデータを受け取るだけであるという考えです.子コンポーネントは親コンポーネントからの関数だけを呼び出す必要がありますが、親コンポーネントは子にデータを設定/渡す必要があります.

実際のコードでどのようにこれらの外観の両方を説明するには、適切な片方向の親と子のコンポーネントがどのように書き込まれるかを始めましょう.

一方向性のデモ


Unidirectionalityを示すために使用するコンポーネントのセットの大きな例は、親“APP”コンポーネントと子“フォーム”コンポーネントです.
最初にこの一方向性に従うコードサンプルを見てみましょう.
View the code sample on CoderPad
ご覧のように、onchangeとvalue propsをsimpleformに渡します.これは、アプリケーションのコンポーネントの内部ではなく、アプリケーションとsimpleform間の分割よりも我々の状態を維持します.いったんフォームを送信すると、SimpleForm呼び出しOnDoneはアプリケーションの内部に格納された状態を変更します.これは順番にsimpleformの再表示を引き起こします.
SimpleFormがユーザーにデータを表示している間、論理自体はアプリケーション内にとどまります.SimpleFormは、状態またはアプリケーションのロジックを含みませんこれらの“dumb”コンポーネントのようなコンポーネントを呼び出します.“ダム”コンポーネントは、スタイリングや作曲性のために利用されていますが、アプリケーションのロジックや状態には使用されません.
これは、適切な反応コンポーネントのセットがどのように見えるかです.コンポーネント自体からの状態を上げて、「ダム」コンポーネントを残すこのパターンは、反応チーム自体のガイダンスから来ます.これを "lifting state up"という.
私たちには、パターンを理解することができるようになりました.

提案パターンからの中断


状態を「解除」した今、SimpleFormにドロップダウンしましょう.SimpleFormをクラスコンポーネントに変更し、状態を追加することから始めます.
class SimpleForm extends React.Component {
// State is now a part of the SimpleForm component
  state = {
    input: ""
  }

  onChange(e) {
    this.setState({
      input: e.target.value
    })
  }

  render() {
    return (
      <div>
        <label>
          <div>Username</div>
          <input onChange={this.onChange.bind(this)} value={this.state.input}/>
        </label>
        <button onClick={this.props.onDone}>Submit</button>
      </div>
    )
  }
}
今、我々はクラスのメソッドと状態にアクセスするアプリケーション内のrefを使用することができます.
export default function App() {
  const simpleRef = React.useRef()
  const [displayTxt, setDisplayTxt] = React.useState("")

  const onDone = () => {
    // Reach into the Ref to access the state of the component instance
    setDisplayTxt(simpleRef.current.state.input)
  }

  return (
    <div>
      <SimpleForm
        onDone={onDone}
        ref={simpleRef}
      />
      <p>{displayTxt}</p>
    </div>
  )
}
View the code sample on CoderPad
このコードは動作しますが、いくつかの固有の複雑さの問題があります.このコンポーネントを展開し始めるとき、あなたの状態を切り離して、親から子参照を検査しなければならないこの考えは、開発をより難しくします.視覚的にどのようにアプリケーションロジックの次は、このパターンでより困難になって見てみましょう.

問題の可視化


まず、SimpleErefコンポーネントを見てみましょう.

この例では、アプリケーションの状態の流れは次のようになります.
  • アプリ(そして、その子供たち、SimpleForm)は、
  • を加えます
  • ユーザーは、simpleform
  • に格納されるデータに変更をする
  • ユーザーはondoneアクションをトリガーする.そして、それはAPP
  • の機能をトリガーする
  • アプリOnDoneメソッドは、SimpleForm
  • からデータを検査します
    一度データがアプリに返されると、それは、独自のデータを変更すると、このようにアプリケーションの再レンダリングをトリガし、SimpleForm 上記のチャートとデータフローのアウトラインからわかるように、1つのアクションは、親と子の間で、SimpleFormに格納されたデータにアクセスするアプリケーションの試みとして行ったり来たりします.これは双方向コンポーネントの動作の主要な例です.このコードサンプルは、OnDoneがSimpleFormで状態を変更する場合にさらに複雑になります.
    今、それは、一方向性とともに働くために必要な精神的なモデルにそれを強要しました.
  • アプリ(そして、その子供たち、SimpleForm)は、
  • を加えます
  • ユーザーはSimpleFormで変化を作ります、状態はコールバック
  • を通してアプリに上げられます
  • ユーザーはondoneアクションをトリガーする.そして、それはAPP
  • の機能をトリガーする
  • アプリOnDoneメソッドは、それがそれ自身のコンポーネントで必要なすべてのデータを既に含んでいるので、単純に再追加のロジックオーバーヘッド
  • なしでアプリケーションとsimpleformを再レンダリングします
    ご覧のように、これらのメソッドの間にステップ数が似ていますが(しかし、些細な例ではないかもしれませんが)、一方向性の流れはずっと合理化され、従うのが簡単です.
    これは、Response Coreチーム(そして、大規模なコミュニティ)が、あなたができるだけしばしば一方向性を使うことを強く示唆する理由です.

    結論と挑戦


    反応する一方向データ流を理解することはスケーラブルなアプリケーションを足場にすることに不可欠です.UniDirectionalityは単に反応に適用されません、角度とVUEアプリケーションはしばしばより多くの実行者に従うために大規模なコードベースに類似したパターンを必要とします.
    次のコンポーネントをリファクタにして、このコーディングパッドでUnidirectionalityをよりよく反映してください.
    View the code sample on CoderPad
    アプリの機能は、以前のバージョンと一致する必要があります.スタック?
    で始まる:
  • GetNewActivityを反応に移す.アプリケーション
  • での効果
  • 州を動かします.活動への活動.アプリケーションのUSENT
  • はすべての小道具をDisplayActivityに渡します.そして、それを「ダム」コンポーネント
  • とします
    まだスタック?たぶんあなたのソリューションを共有することに興奮している?または ask us in our community Slack.私たちはあなたから聞いて興奮する!