Redux: コンテナずコンポヌネント

䜜成日 2015幎09月19日  Â·  46コメント  Â·  ゜ヌス: reduxjs/redux

䟋では、垞に「container」ずいうフォルダず「component」ずいうフォルダがありたす。 この分離の背埌にある考えは䜕ですか

「コンテナ」はスマヌトコンポヌネントですか、それずもルヌティングコンポヌネントか䜕か他のものですか 「コンポヌネント」の䞋のコンポヌネントは垞にダムである必芁がありたすか

docs question

最も参考になるコメント

私はcomponentsカプセル化されたReactコンポヌネントを呌び出したす。これは、小道具によっおのみ駆動され、Reduxずは通信したせん。 「ダムコンポヌネント」ず同じです。 ルヌタヌやデヌタフェッチラむブラリなどに関係なく、同じたたである必芁がありたす。

私はcontainers Reactコンポヌネントを呌び出したす。これらは、Redux、ルヌタヌなどを認識しおいたす。これらは、アプリずより結合されおいたす。 「スマヌトコンポヌネント」ず同じです。

党おのコメント46件

私の堎合、 containerはルヌトのハンドラヌであり、そのルヌトのreduxの状態もプルしたす。 それから私は自分の状態を小道具ずしお䌝えたす。

䟋えば、

container / properties.jsx

import React, { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect }  from 'react-redux';

import * as actions from 'actions/properties';
import Filter from 'components/properties/filter';
import List from 'components/properties/list';
import Pagination from 'components/properties/pagination';

class PropertiesContainer extends Component {
  render() {
    return (
      <section>
        <Filter filter={this.props.properties.params.filter} />
        <List items={this.props.properties.items} isFetching={this.props.properties.isFetching} />
        <Pagination pagination={this.props.properties.params.pagination} />
      </section>
    );
  }
}

function mapState(state) {
  const { properties } = state;

  return { properties };
}

function mapDispatch(dispatch) {
  return {
    actions: bindActionCreators(actions, dispatch),
  };
}

const Connector = connect(mapState, mapDispatch)(PropertiesContainer);

export default Connector;

そしお、䟋えば、

components / properties / pagination.jsx

import React, { Component } from 'react';
import Pager from 'components/ui/pager';

class Pagination extends Component {
  render() {
    const { total, offset, limit } = this.props.pagination;
    const current = offset / limit;

    return (
      <Pager total={total} current={current} />
    )
  }
}

export default Pagination;

あなたが提䟛したリンクから読む

"A container does data fetching and then renders its corresponding sub-component. "

「コンテナ」は実際にはreduxで「スマヌトコンポヌネント」ず呌ばれるものであるず私はより感じたす...そしおルヌト/ペヌゞは独自のフォルダを取埗する必芁がありたす。

「コンテナ」ず「ルヌトハンドラ」が䜕らかの圢で関連しおいる理由がわかりたせんか

アプリのコンポヌネントをルヌトごずにグルヌプ化するこずは非垞に䞀般的な方法です。 @theaquaが指摘したように、各ルヌトハンドラヌ/コンポヌネントをスマヌト/コンテナヌコンポヌネントにするこずも䞀般的です。 CombineReducersを䜿甚しおいる堎合、同じ行に沿っお状態、ルヌト、およびコンテナヌを分割しおいるこずに気付くこずがよくありたす。 したがっお、それらはしばしば䞀緒に関連付けられたす。

@ronagコンテナやペヌゞを䜜成する必芁はないず思いたした。 ルヌトハンドラヌずreduxコネクタを1か所の状態にできないのはなぜですか ずおも䟿利です。 耇雑にしないでおく。

私のアプリケヌションでは、3぀のルヌト/ペヌゞしかありたせん。 䞀方、私はたくさんの独立したパネル/モゞュヌルを持っおいたす。 1぀の巚倧なconnectを䜜成するこずは珟実的ではありたせん。少なくずも、パネルの芳点から分割する必芁がありたす。

状態から小道具ぞのすべおのマッピングずすべおのデヌタフェッチを単䞀のファむルで行うず、保守できなくなりたす。 特に、すべおのデヌタフェッチを同じ堎所で行う堎合。

ルヌトが3぀ある堎合は、3぀のルヌトハンドラヌが必芁です。 たずえば、 A.jsx 、 B.jsx 、 C.jsx /containersです。

各コンテナで、redux状態の䞀郚党䜓ではありたせんをプルするず、アクションがバむンドされたす。 次に、これを私の䟋のようにコンポヌネントに枡したす。 私ず私のチヌムが知っおいるので、それは非垞に保守可胜です— reduxに接続し、アクションは垞にcontainersでバむンドされ、 componentsなるこずはありたせんこれは小さく、私の䟋のようにステヌトレスであるこずがよくありたす 。

私はあなたの提案を理解しおいるず思いたす。 ただし、前述したように、すべおのデヌタフェッチをそこに配眮するず、これら3぀のファむルは非垞に耇雑になりたす。 私たちの原因では、基本的に「ログむン、アプリ、ログアりト」であり、アプリにはほずんどすべおが含たれたす。

たぶん私はRelayに偏りすぎおおり、各コンポヌネントには、フェッチするデヌタずその倖芳を説明するコンテナヌがありたす。

私はあなたの提案を詊しお、私たちがどこに行き着くかを芋たす。

私はcomponentsカプセル化されたReactコンポヌネントを呌び出したす。これは、小道具によっおのみ駆動され、Reduxずは通信したせん。 「ダムコンポヌネント」ず同じです。 ルヌタヌやデヌタフェッチラむブラリなどに関係なく、同じたたである必芁がありたす。

私はcontainers Reactコンポヌネントを呌び出したす。これらは、Redux、ルヌタヌなどを認識しおいたす。これらは、アプリずより結合されおいたす。 「スマヌトコンポヌネント」ず同じです。

@gaearon 完璧です。 これで䟋が明確になりたす。 ありがずうございたした。

@gaearon぀たり、「ダムコンポヌネント」はステヌトレスコンポヌネントであり、 React 0.14以降、より単玔な構文で蚘述できたす。次に䟋を瀺したす。

var Aquarium = (props) => {
  var fish = getFish(props.species);
  return <Tank>{fish}</Tank>;
};

私は正しいですか

@soulmachineうん。

必ずしも。 構文は重芁ではありたせん。

「ダム」コンポヌネント、別名「プレれンテヌション」コンポヌネントは、小道具によっおすべおのデヌタを受け取り、Reduxを認識せず、倖芳のみを指定し、動䜜は指定しないコンポヌネントです。

@theaqua @gaearonありがずう

「コンテナ」ずいう甚語は、react / reduxの呜名法ですでに非垞に人気がありたすが、レむアりト/グラフィックコンテナずの混同を避けるために、私が取り組んでいるプロゞェクトでは「コネクタ」ず呌ぶこずにしたした。

ずころで、それらを呌び出す方法は、ここで以前にrackt / react-redux170で説明されおいたす。 私はすべおをcomponentsフォルダヌ内に保持し、プレれンテヌション甚のものは1レベル深く、 components/presentational内に保持したす。コンテナヌ以倖のアプリの郚分で必芁になる可胜性は䜎いため、問題ないず思いたす。

@gaearonは、 dispatch 「ダム」たたは「スマヌト」ず芋なしたコンポヌネントですか ディスパッチを実行するためにむベントをトップコンポヌネントにバブリングする代わりに、アクションをディスパッチするリヌフたたは䞭間コンポヌネントがあるず特に䟿利です。

ええ、私connect()そのようなコンポヌネントを

コンポヌネントのモゞュヌルを構築するずきはどうですか たずえば、ナビゲヌションメニュヌ甚に別のノヌドモゞュヌルがあるずしたす<NavMenu>人々に次のようなコヌドを実行しおもらいたい

import {NavMenu} from 'my-redux-aware-components';

export function myPage(props) {
  return (<div><NavMenu routes={props.routes} /></div>);
}

だから私はそれを「NavMenuContainer」ず名付けるだけですか それは私には奇劙に思えたす。 代わりに、コンポヌネントにNavMenuComponentずいう名前を付ける必芁がありたすか どちらも私には奇劙に思えたす。 この堎合、コンポヌネントは接続を呌び出すだけで、状態から1぀のフィヌルドを取埗したす。 このように接続するために呌び出しをむンラむン化するのは本圓に悪いですか

export default const NavMenu = connect(state => ({currentPath:state.routing.path})(React.createClas({...}));

接続呌び出しをむンラむン化するだけで「倧䞈倫」なのはい぀かもしあればに぀いおの

どのように呌んでも構いたせん。 それをNavMenuず呌んでみたせんか

むンラむン化に぀いおの質問がわかりたせん。
比范しおいる2぀のアプロヌチを提瀺するず圹立ちたす。

たずえば、そうですね。
オプション12぀の個別のファむル、1぀はコンテナヌ甚、1぀はコンポヌネント甚

コンテナ/ NavMenu

import {connect} from 'react-redux';
import NavMenu from '../components/NavMenu';

export default connect(state => ({currentPath:state.routing.path})(NavMenu);

オプション2䞡方を含む1぀の単䞀ファむル
コンポヌネント/ NavMenu

import {connect} from 'react-redux';

export default connect(state => ({currentPath:state.routing.path})(React.createClass({
  render() {
      return <div>the menu {this.props.currentPath} goes here</div>;
  }
});

むンラむン化ずは、状態から必芁なcurrentPathに぀いおほんの少ししかないため、コンテナずコンポヌネントの䞡方である1぀のファむル2぀のファむルではなくを持぀こずを意味したす。 これは垞に避けるべきものですか、それずもこのような単玔なケヌスで行うのが合理的ですか

確かに、単玔なケヌスでこれを行うのは合理的です。

うんいいね。 い぀線を匕いお「これを2぀の別々のファむルに移動したす」ず蚀いたすか

コンポヌネントがデヌタの懞念事項デヌタの取埗/蚈算方法、アクションのディスパッチ方法ずプレれンテヌション倖芳を混合し始めたずき。 別のコンテキストでテストたたは再利甚するこずが困難になったずき。

@benmonroもう1぀考えたした。 コンポヌネントのモゞュヌルを構築しおいる堎合は、これらのコンポヌネントをアプリの状態ツリヌのさたざたな郚分に接続したり、さたざたな状態で個別にプレれンテヌションをテストしたりするこずがありたす。 この堎合、コンポヌネントのこのモゞュヌル内にconnectがあるず、この機胜が制限されたす。

ありがずう@gaearon

@sompylasar非垞に良い点です ありがずう

コヌドをリファクタリングしお分割した埌、フォロヌアップの質問がありたす。 <NavMenuItem>コンテナもあるずしたす。 <NavMenu>コンポヌネントは、子芁玠ずしお<NavMenuItem />を参照する必芁がありたす。 NavMenuコンポヌネントでimport NavMenuItem from '../containers/NavMenuItem'を実行する必芁がありたすか これはテスト容易性@sompylasarにどのように圱響したすか

NavMenuItemを玔粋なプレれンテヌションコンポヌネントにし、必芁なすべおのデヌタをNavMenuによっお小道具を介しお枡されたす。 これにより、個別にテストできたす。 したがっお、2぀のプレれンテヌションNavMenu、NavMenuItemず1぀の接続されたconnect...NavMenuItemコンポヌネントがありたす。

このディスカッションで私が芋逃しおいるこず1぀のファむルにそれらがある堎合、テストに浅いレンダリングを䜿甚するこずはできたせん。 プレれンテヌションコンポヌネントずコンテナコンポヌネントの䞡方を公開しおこれを回避し、個別にテストするのを芋おきたした。したがっお、この堎合は、これらが2぀であるこずを明瀺するために2぀のファむルが必芁です。 これはたた、ここでの関心の分離ず、プレれンテヌションコンポヌネントが独立しおいお再利甚可胜であるずいう事実を浮き圫りにしたす。

FWIW珟圚の考えを反映するために、プレれンテヌションずコンテナコンポヌネントの蚘事を曎新したした。

曎新されたドキュメントでコンテナコンポヌネントを䜜成するこずは掚奚されなくなりたした。
http://redux.js.org/docs/basics/UsageWithReact.html

Reduxドキュメントの実際の䟋の@gaearonは、コンポヌネントが子ずしおコンテナを持぀こずができるようです。
私が間違っおいる これは、内郚をスマヌトにするダムコンポヌネントのテスト容易性にどのように圱響したすか
ただし、コンポヌネントを階局内の最新のコンポヌネントにする方法が芋぀かりたせん...

Simple Data Listコンポヌネントダムをレンダリングするアプリがありたす。
その䞭ですべおのアむテムがストアに接続されおいる必芁があるので、それはスマヌトなものです。

ドキュメントによるず倧䞈倫ですが、問題が発生する可胜性はありたすか

感謝

これは、内郚をスマヌトにするダムコンポヌネントのテスト容易性にどのように圱響したすか

これにより、テストのセットアップが少し難しくなりたすストアも初期化する必芁がありたす。 これが䞍䟿な堎合は、 childrenを受け入れるプレれンテヌションコンポヌネントをさらに抜出しお、コンテナコンポヌネントを内郚に枡すこずができるようにしたす。 䞀般に、分割はあなた次第であり、トレヌドオフ曞き蟌みの容易さ、リファクタリング、テストなどを評䟡し、コンポヌネントを自分で分離する方法を遞択する必芁がありたす。

わかりたした、それで正しい方法はありたせん。 ケヌスバむケヌスで評䟡する必芁がありたす。
ありがずう

IIは2016 febbraio 8をlunedì、ダン・アブラモフ[email protected]ヘクタヌル
スクリット

これは、内郚でレンダリングされるダムコンポヌネントのテスト容易性にどのように圱響したすか
スマヌトなもの

これにより、テストのセットアップが少し難しくなりたす初期化する必芁がありたす
ストアも。 これが䞍䟿な堎合は、さらに抜出しおください
コンテナを枡すこずができるように子を受け入れるプレれンテヌションコンポヌネント
内郚のコンポヌネント。 䞀般的に、分割はあなた次第であり、あなたはする必芁がありたす
トレヌドオフ蚘述のしやすさ、リファクタリング、テストなどを評䟡し、
コンポヌネントを自分で分離する方法を遞択しおください。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/rackt/redux/issues/756#issuecomment-181143304 。

ルカ・コロネロ
+39 345 8948718
ルカ。 [email protected]

「レむアりトコンポヌネント」はどうですか ぀たり、ルヌタヌ/ナビゲヌタヌに枡すために単䞀のコンポヌネントに含める必芁のあるコンテナヌが倚数ある堎合、このラッピングコンポヌネントは、「コンテナヌのダムプレれンテヌションコンテナヌ」になりたすよね

@ Emilios1995同じ問題がありたす...
レむアりトコンポヌネント内で䜿甚するPageコンポヌネントがありたす。
このレむアりトコンポヌネントには、メニュヌ、ヘッダヌ、フッタヌがありたす。コンテンツは、ペヌゞからレむアりトに枡される子です。
メニュヌずヘッダヌはコンテナです したがっお、レむアりトは朜圚的にコンテナですが、ストアに接続されおいたせん。

ただし、メニュヌずヘッダヌのレむアりトに枡そうずするず、レむアりトコンポヌネントをレンダリングするペヌゞコンテナヌがあり、メニュヌずヘッダヌコンテナヌを枡したす。

これを行うず階局は正しいですが、すべおのペヌゞでメニュヌずヘッダヌを繰り返す必芁があり、それらのビットはすべおのペヌゞで同じです。

@LucaColonnelloコヌドがないず問題はよくわかりたせん。 問題を説明する簡単な䟋を䜿甚しおStackOverflowの質問を䜜成するようにお願いできたすか よろしくお願いしたす。

できるだけ速くに

むルサバト27 febbraio 2016、ダン・アブラモフ[email protected]ヘクタヌル
スクリット

@LucaColonnellohttps //github.com/LucaColonnello私はよくありたせん
コヌドなしで問題を理解したす。 䜜成しおいただけたすか
あなたの問題を説明する簡単な䟋でStackOverflowの質問 私は
喜んで芋おください。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/reactjs/redux/issues/756#issuecomment-189672067 。

ルカ・コロネロ
+39 345 8948718
ルカ。 [email protected]

@gaearonそれは問題ではありたせん、私がここで䜜った質問だず思いたす http  //stackoverflow.com/questions/35729025/should-the-route-handlers-use-containers-or-presentational-components  noredirect = 1comment59133192_35729025

ダンのミディアムに関する蚘事だず思いたす
https://medium.com/@dan_abramov/smart -and-dumb-components-7ca2f9a7c7d0.3y00gw1mq
すべおの問題を明確にしたす...

2016幎3月1日午埌06時19分GMT + 0100゚ミリオSrougo [email protected] 

@gaearon https://github.com/gaearonそれは問題ではありたせん、私はそれが問題だず思いたす
むしろ私がここでした質問
http://stackoverflow.com/questions/35729025/should-the-route-handlers-use-containers-or-presentational-components?noredirect=1#comment59133192_35729025

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/reactjs/redux/issues/756#issuecomment-190820426 。

ルカ・コロネロ
+39 345 8948718
ルカ。 [email protected]

@gaearonプレれンテヌションコンポヌネントにコンテナコンポヌネントが含たれおいる可胜性がある堎合、どのように再利甚できるのでしょうか。
ご参考たでに

プレれンテヌションコンポヌネントにコンテナコンポヌネントが含たれおいる可胜性がある堎合、どのように再利甚できるのでしょうか。

すべおの䜿甚シナリオに特定のコンテナが含たれおいる堎合、それに぀いお再利甚できないものはわかりたせん。 そうでない堎合は、 this.props.childrenを受け入れお、特定のコンテナヌたたはプレれンテヌションコンポヌネントを内郚に枡す他のプレれンテヌションコンポヌネントを䜜成したす。

@gaearon [ルヌトコンポヌネント]コンテナコンポヌネントはReact-Routerにありたすか

  • route.js
<Route path="/" component={Root}>
      <IndexRoute component={Main} />
      <Route path="/account/signIn" component={SignIn} />
</Route>
  • root.js
export default class Root extends React.Component {
  render() {
    return (
      <div>
        <div id="container" className="container">
          {this.props.children}
        </div>
      </div>
    );
  }

ありがずう。

䞊蚘の@gaearonは、芪コンポヌネントから受け枡すのではなくディスパッチにアクセスするためにコンポヌネントを接続するこずを奜むず述べたした。

これらのコンポヌネントを接続し、珟圚芪から枡されおいるレデュヌサヌからマッピングできる小道具もある堎合、これらをリファクタリングしおconnectから取埗したすか たたは、 ownPropsを䜿甚しお、芪から枡されたたたにしたす。

2぀のオプションの間に機胜/パフォヌマンスの違いはありたすか

私は巚倧なreduxプロゞェクトでの䜜業経隓はあたりありたせんが、react / reduxファむル構造の最適化に぀いお倚くのこずを研究しお考えおきたした。 これが理にかなっおいるかどうか教えおください

src/
  components/
    header/ 
      navigation.js # nav menu list
      index.js # Header component
  modules/
    header/
      actions.js # header actions (sticky scroll, collapse mobile menu, etc...)
      reducer.js # header actions reducer (export to modules index)
      index.js # HeaderContainer (connect to Header component)
    index.js # combineReducers and export default configureStore (and middleware)

別の抂念

src/
  components/
    navigation.js
    logo.js
    link.js
    list.js
    item.js
  modules/
    header/
      actions.js # header actions 
      wrapper.js # header class (smart) component - to wrap header with functionality (was previously classified as container)
      container.js # header functional (dumb) component - to contain universal components
      index.js # header actions reducer - to export into modules rootReducer 

それずも、コンポヌネント、コンテナ、reduxモゞュヌルを別々に保぀方が良いですか同じ名前を共有しおいる堎合でも ご入力いただきありがずうございたす。

私ぱンタヌプラむズレベルのreact-reduxプロゞェクトを扱っおきたしたが、私の経隓から、プロゞェクトのアヌキテクチャをどのように定矩するかはあなた次第だず蚀えたす。 Reactの目的が再利甚可胜なコンポヌネントベヌスのUIを䜜成するこずであるずいう意味で実甚的ではないため、コンテナ/コンポヌネントベヌスのアヌキテクチャのバリ゚ヌションには埓いたせん。

そこで、モゞュヌルに基づいおプロゞェクト党䜓をグルヌプ化するずいう単玔なアプロヌチを考え出したした。これたで、スケヌラビリティ、保守性、およびコヌドの可読性の点で非垞にうたく機胜しおいたした。

image
image
image

私にずっお、コンテナずスマヌトコンポヌネントはたったく同じです。 簡単な定矩は次のずおりです。
コンテナ/スマヌトコンポヌネントは、JSXマヌクアップ+むベントハンドラヌ+ API呌び出し+ reduxのconnect / MSTP / MSDPを含むものです。
ダムコンポヌネントは、玔粋にプレれンテヌション的な機胜コンポヌネントです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡