反応の再構成におけるコンポーネントとコンテナの違い


135

リアクティブreduxのコンポーネントとコンテナーの違いは何ですか?


11
コンテナーはストアを認識し、状態の小道具をコンポーネントに送信します。コンポーネントの唯一の目標はhtmlをレンダリングすることです。理想的にはコンポーネントはステートレスであり、ユニットテストを簡単に記述できます
OlivierBoisséApr

回答:


167

ComponentReact APIの一部です。コンポーネントは、React UIの一部を記述するクラスまたは関数です。

コンテナーは、connectReduxストアに送信されるReactコンポーネントの非公式な用語です。コンテナーはRedux状態の更新とdispatchアクションを受け取り、通常はDOM要素をレンダリングしません。プレゼンテーションを子コンポーネントに委譲します。

詳細については、Dan Abramovによるプレゼンテーションコンポーネントとコンテナコンポーネントをご覧ください。


なかなかの説明です。非常に簡潔で詳細を知ることができます
ファリスレイ

リンクをたどると、Dan Abromovがこのパターンから後退していることがわかります。そうは言っても、テストに関する@ olivier-boisseのコメントの意味をまだ検討しています。
tim.rohrer

8

データのフェッチと表示を担当するコンポーネントは、スマートコンポーネントまたはコンテナコンポーネントと呼ばれます。データは、redux、ネットワークコール、またはサードパーティのサブスクリプションから取得できます。

ダム/プレゼンテーションコンポーネントは、受け取った小道具に基づいてビューを表示する責任があるコンポーネントです。

ここに例がある良い記事

https://www.cronj.com/blog/difference-container-component-react-js/


小道具からのデータはコンテナーに固有のものではありません。すべてのコンポーネントに共通です。
Michael Freidgeim

@MichaelFreidgeim同意します。小道具はすべての小道具です。
Akash Bhandwalkar

4

コンポーネントはビューの一部を構成するため、DOM要素をレンダリングし、コンテンツを画面に表示する必要があります。

コンテナーはデータエラボレーションに参加するため、状態を変更する必要があるため、reduxと「対話」する必要があります。そのため接続(react-redux)で接続を作成し、関数mapStateToPropsおよびmapDispatchToPropsを含める必要があります

.
.
.
import { connect } from "react-redux";

class myContainer extends Component {
}

function mapStateToProps(state) {
  // You return what it will show up as props of myContainer
  return {
    property: this.state.property
  };
}

function mapDispatchToProps(dispatch) {
  // Whenever property is called, it should be passed to all reducers
  return bindActionCreators({ property: property }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(myContainer);

3

部品

コンポーネントを使用すると、UIを独立した再利用可能な部分に分割し、各部分を分離して考えることができます。それらは「プレゼンテーションコンポーネント」と呼ばれることもあり、主な関心事は物事の見え方です

コンテナ

コンテナーは、UIのない​​コンポーネントのようなものであり、コンテナーは物事の仕組みに関係しています。。主にデータを取得および更新するためにreduxストアと通信します

Redux docの表の比較を参照してください

ここに画像の説明を入力してください

詳細説明https://redux.js.org/basics/usage-with-react#presentational-and-container-components


2

どちらもコンポーネントです。コンテナーは機能的であるため、HTMLを単独でレンダリングすることはなく、実際のHTMLを記述するプレゼンテーションコンポーネントもあります。コンテナーの目的は、状態をマップし、プレゼンテーションコンポーネントの小道具にディスパッチすることです。

さらに読む:リンク


1

React、Reduxは独立したライブラリです。

Reactは、HTML文書を作成するためのフレームワークを提供します。コンポーネントは、ドキュメントの特定の部分を表すものです。コンポーネントに関連付けられたメソッドは、ドキュメントの特定の部分を操作できます。

Reduxは、JS環境でデータを保存および管理するための特定の哲学を規定するフレームワークです。これは、特定のメソッドが定義された1つの大きなJSオブジェクトであり、最良の使用例は、Webアプリの状態管理の形になります。

Reactはすべてのデータがルートからリーフに流れるように規定しているため、すべての小道具をメインにし、コンポーネントで小道具を定義して、小道具を特定の小道具に子に渡すのは面倒になります。また、アプリケーション全体の状態が脆弱になります。

React Reduxは、接続されたコンポーネントを別のReactコンポーネント(your Container)でラップするだけで、Reduxストアに直接接続するクリーンなソリューションを提供します。実装では、アプリケーション全体の状態のどの部分が必要かをすでに定義しています。そのconnectため、そのデータをストアから取り出し、それ自体をラップするコンポーネントに小道具として渡します。

この簡単な例を考えてみましょう:

 class Person extends Component {
  constructor(props){
   this.name = this.props.name;
   this.type = this.props.type;
  }

  render() {
     return <p> My name is {this.name}. I am a doctor { this.type } </p>
  }
}

 const connect = InnerComponent => { 

   class A extends Component{
     render() {
        return <InnerComponent {...this.props} type="Doctor"/>
     }
   } 
   A.displayName = `Connect(${InnerComponent.displayName})`
   return A
 }

connect関数は小道具を渡しtypeます。

このようにして、接続はPersonコンポーネントのコンテナとして機能します。


1

Reactには2つの主要コンポーネントがあり、1つはスマートコンポーネント(コンテナー)で、もう1つはダム(プレゼンテーションコンポーネント)です。コンテナーはコンポーネントに非常に似ていますが、唯一の違いは、コンテナーがアプリケーションの状態を認識していることです。Webページの一部がデータの表示(ダム)にのみ使用される場合は、それをコンポーネントにします。アプリケーションの状態を(データが変更されるたびに)スマートに認識できるようにする必要がある場合は、コンテナーにしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.