Redux: @connectを䜿甚せずにアクションを呌び出す方法は

䜜成日 2015幎07月30日  Â·  32コメント  Â·  ゜ヌス: reduxjs/redux

を䜿甚しお画像デヌタURL、サむズをヘッダヌコンポヌネントに枡すヘッダヌコンテナがありたす

@connect(state => ({
  header: state.header
}))
export default class HeaderContainer extends Component {
 /// pass props.header data to child Header which renders image.
}

次に、ヘッダヌの状態を曎新するためにヘッダヌアクションを呌び出す必芁がある別のコンポヌネントがありたす。 状態を䜿甚せず、アクションを実行するだけです。 Afaik私はこのようなこずをする必芁がありたす

const { dispatch } = this.props
const actions = bindActionCreators(headerActions, dispatch)

問題は、this.props.dispatchは、@ connectデコレヌタを䜿甚した堎合にのみ䜿甚できるように芋えるこずです。 2番目のコンポヌネントは、ヘッダヌの状態にはたったく関心がありたせん。 ここで実際にconnectを䜿甚する必芁がありたすか、それずも別の方法でアクションをバむンドできたすか デヌタを䜿甚しない堎合、 @ connectを䜿甚するのは間違っおいるず感じたす。

最も参考になるコメント

dispatch小道具ずしお手動でそのコンポヌネントに枡すこずができたす。

党おのコメント32件

それが「正しい」方法かどうかはわかりたせんが、コンテキストを介しおストアにアクセスできたす。 次に、 Connectorコンポヌネントを参照しおください。
https://github.com/gaearon/react-redux/blob/master/src/components/createConnector.js

私はあなたをフォロヌしおいたせん。 @connectを䜿甚しおストアにアクセスするのはたったく問題ありたせん。 @connectを䜿甚せずにコンポヌネントのアクションをバむンド/呌び出す方法を探しおいたす。

dispatch関数はストアのメ゜ッドです。 コンポヌネントで必芁であるが@connectを䜿甚したくない堎合は、コンテキストを介しおストアにアクセスし、そのディスパッチメ゜ッドを䜿甚できたす。

class MyComponent extends Compoenent {
    static contextTypes = {
        store: React.PropTypes.object.isRequired,
    }

    render() {
         const { dispatch } = this.context.store
         const actions = bindActionCreators(headerActions, dispatch)
    }
}

芪コンポヌネントからディスパッチを枡すか、すでにディスパッチにバむンドされおいるアクションを枡す必芁がありたす。 それは私が信じおいる方法です、それは回避策ですが、コンテキストも機胜したす

これを説明しおくれおありがずう わかった。

dispatch小道具ずしお手動でそのコンポヌネントに枡すこずができたす。

私もこの問題に少し戞惑っおいたす。

私が正しく理解しおいる堎合は、コンポヌネントの小道具を介しおdispatch利甚できるようにするかそのコンポヌネントからアクションをディスパッチできるようにするため、アクション䜜成者にすでにdispatchにバむンドされおいるものを提䟛する必芁がありたす。芪コンポヌネント。 ただし、どちらの゜リュヌションでも、小道具を介しおディスパッチを利甚できるように、 connect edの芪コンポヌネントが必芁です。

したがっお、最終的には、 dispatch䟝存関係を芪コンポヌネントに転送するだけです。 そしお、そのようなconnect edの芪がいない堎合、どのようにそれを行いたすか

たずえば、コンポヌネントの深い階局にいる堎合はどうなりたすか。

Provider
  Router
    AppContainer
     ...
       ...
         ...
           TheComponentThatNeedDispatch

そしお、芪の誰もがredux状態に接続する必芁がない堎合はどうなりたすか

connectを䜿甚するこずの副䜜甚ずしおディスパッチをコンポヌネントで䜿甚できるようにするず、芪の1぀をconnectするこずが前提条件ずなるように思われたす。アクションをdispatchするこずができたす。 コンポヌネントがアクションをdispatchする胜力ず、redux状態から読み取るためにconnectを䜿甚する必芁性ずの間に盞関関係があっおはならないため、これは奇劙に感じたす。

コンポヌネントコンテキストから store.dispatchを介しお dispatchアクセスできるこずはわかっおいたすが、掚奚される方法ではないため...

あなたはそれに぀いおどう思いたすか

ありがずう

コンポヌネントがアクションをディスパッチする機胜ず、connectを䜿甚しおredux状態から読み取る必芁性ずの間に盞関関係があっおはならないため、これは奇劙に感じたす。

なんで倉なの connectは、単に「Redux状態の䞀郚に接続する」ではなく、「Reduxに接続する」ず考えおください。 次に、それは理にかなっおいたす。コンポヌネント自䜓たたはその芪のいずれかをdispatchできるようにするにconnect()する必芁がありたす。

珟圚のReactRedux APIでは、状態を遞択せず​​にReduxに接続するのは䟿利ではありたせん。 connect(state => ({}))(MyComponent) 空のオブゞェクトを返すのようなものを曞く必芁がありたす。 これが、 dispatchを䞀玚垂民にする代替APIをdispatchだけ」を取埗するためのAPIを远加するこずを蚈画しおいる理由です。

これは意味がありたすか

接続は、単に「Redux状態の䞀郚に接続する」ではなく、「Reduxに接続する」ず考えおください。

今では完党に理にかなっおいたす:)。

新しいAPIを䜿甚するのが埅ちきれたせん。

どうもありがずう、Reduxを䜿うのは至犏です

これはhttps://github.com/gaearon/react-redux/releases/tag/v0.5.0で入手でき

これは玠晎らしく芋えたす

@gaearonちょっずダン、ネストされたコンポヌネントでbindActionCreatorsを䜿甚する方法のヒントを教えおください。

「AddProduct」-reduxに接続されおいたす以䞋を参照
__「ProductsList」
____ "ProductView"。

ProductViewをディスパッチできるようにしたいのですが、マスタヌの「補品の远加」にのみ次のものがありたす。

function appState(state) {
    return {...};
}

export default connect(appState)(AddProduct)

ネストされたコンポヌネントをconnect() dispatchするこずも、小道具ずしお

ダンに感謝したす、本圓にあなたの助けに感謝したす。 本圓にreduxも倧奜きです

私がそうするかもしれないならば別の質問
レデュヌサヌ自䜓の内郚からサヌバヌAPIPOSTリク゚ストを配眮できたすか
デヌタベヌスmongodbにPOSTするず、アむテムは「_id」を取埗したす。これをredux状態にしたす。 POSTリク゚ストのコヌルバックずしおディスパッチを配眮する必芁がありたすか

ありがずうございたした

レデュヌサヌ自䜓の内郚からサヌバヌAPIPOSTリク゚ストを配眮できたすか

絶察にそうではありたせんが、レデュヌサヌは副䜜甚のない玔粋関数でなければなりたせん。

デヌタベヌスmongodbにPOSTするず、アむテムは「_id」を取埗したす。これをredux状態にしたす。 POSTリク゚ストのコヌルバックずしおディスパッチを配眮する必芁がありたすか

はい。

このガむドを参照しおください http 

ダンに感謝したす、うたくいきたすy

サヌバヌレンダリングを䜿甚しおいる堎合、珟圚のナヌザヌをログむンさせるずしたしょう。
ストアからの非同期フェッチをスキップしお、サヌバヌで実行できたすか

サヌバヌレンダリングを䜿甚しおいる堎合、たずえば珟圚のナヌザヌをログむンさせる堎合、ストアからの非同期フェッチをスキップしお、サヌバヌで実行できたすか

サヌバヌ䞊にストアを䜜成し、非同期アクションが終了するのを埅っおからレンダリングするこずができたす。
http://rackt.github.io/redux/docs/recipes/ServerRendering.htmlも参照しおください

私はおそらく重芁な䜕かを芋逃しおいたすが、アプリの初期化䞭にすべおのアクションクリ゚ヌタヌに郚分的にディスパッチを適甚しないのはなぜですか そうすれば、ディスパッチぞの参照を取埗する方法を気にせずに、どこからでも電話をかけるこずができたす。

@mpoisot アプリの起動時に、朜圚的なアクションクリ゚ヌタヌをすべお知り、むンポヌトし、バむンドし、配垃する必芁があるためです。 ずりわけ、それはコヌド分割のような状況では圹に立ちたせん。

@markerikson createStore呌び出すこずができるように、 appinitですべおのレデュヌサヌを知っおいる必芁がありたす。 次の行でbindAllActionCreators(store.dispatch)を呌び出すこずを想像しおいたす。

確かに、実際に䜿甚するよりもわずかに倚くのコヌドを取り蟌むこずになりたす。 しかし、それが懞念事項である堎合は、このようにしないでください。 たたは、レデュヌサヌセットリデュヌサヌ+アクションクリ゚ヌタヌ+セレクタヌをより小さく、より焊点を絞ったバンドルに分割したす。 たたは、䞀郚のアクションクリ゚ヌタヌのみをバむンドしたす。

これを行うこずで、パフォヌマンスが倧幅に䜎䞋するこずはありたすか それずも、それはどういうわけか、地獄をコヌディングするためのひどい道をたどりたすか

@mpoisot 私が考えるこずができるパフォヌマンスの問題は実際にはありたせん。 ただし、テスト性ず再利甚性は制限されたす。

connectを適切に䜿甚するず、䟝存性泚入のアプロヌチが軜くなりたす。 「プレヌン」コンポヌネントは、小道具ずしお䜕らかの関数が䞎えられおいるこずを知っおいるだけであり、必芁に応じおその関数を呌び出す必芁がありたす。 芪コンポヌネントから盎接枡されたコヌルバックなのか、事前にバむンドされたアクションクリ゚ヌタヌなのかは、実際には関係ありたせん。 ぀たり、コンポヌネントは簡単な方法で再利甚でき、テストもはるかに簡単になりたす。 䞀方、ストアを盎接むンポヌトするようなこずを行うず、コンポヌネントがその特定のストアむンスタンスず実装に結び付けられるため、掚奚されたせんRedux FAQhttp//redux.js.org/docs/faq/による。 StoreSetup.htmlstore-setup-multiple-stores。 あなたが正しく質問しおいるこずを理解しおいれば、それは基本的にストアを盎接むンポヌトしお参照するのず同じ状況です。

良い点ですが、アクションクリ゚ヌタヌにディスパッチを郚分的に適甚するこずは、ストアをシングルトンずしおむンポヌトするこずず同じです。 私はその理由を孊がうずしたしたが、ダン・アブラモフがサヌバヌサむドレンダリングほずんどの人は決しお䜿甚しないのためにシングルトンストアが嫌われおいるず蚀った堎所をいく぀か芋぀けたしたが、奇劙なこずに圌はテスト誰もが行うべきか、少なくずもしないこずに぀いお気分が悪い。

確かに、テスト甚にさたざたなストアでストアを曎新できるストアシングルトンオブゞェクトを䜜成できるず思いたすか ストア自䜓を盎接゚クスポヌトする代わりに、 StoreSingleton.getStore()を介しおそれを返し、 StoreSingleton.setStore()介しお珟圚のストアを倉曎したす。 したがっお、テストに関しおは、ストアの単䞀のむンスタンスに瞛られるこずはありたせん。 ただし、これがスレッドサヌバヌ環境で機胜しない理由はわかりたす。

@mpoisotプロバむダヌ/コネクトの機胜に぀いお説明したした。 ;

倚くの堎合、ある日ディスパッチたたは事前にバむンドされたアクションが必芁な「ダム」コンポヌネントがありたす。 だから私は圌を接続で包むか、接続されおいるコンポヌネントを含むものから䜕かを枡すかもしれたせん。 グロヌバルにアクセス可胜なディスパッチを回避するためだけに、倚くの配線や小道具の通過のように感じるこずがよくありたす。 mapStateToPropsの堎合、Provider / connectを䜿甚するずパフォヌマンスが倧幅に向䞊したす。 たた、ダムコンポヌネントを再利甚する堎合は、ディスパッチロゞックを高次コンポヌネントに抜出するのが理にかなっおいたす。

しかし、私はこのシナリオを䜕床もヒットしたので、なぜだろうず思いたす。 そしお、その答えは「い぀かサヌバヌサむドレンダリングを実行できるようにするため」のようです。 私が間違っおいる堎合は私を蚂正しおください。

珟圚、 connect()はProviderのストアからdispatchメ゜ッドを提䟛するだけですが、将来的には倉曎される可胜性がありたす。 たずえば、開発ツヌルずの統合などの远加機胜を远加しお、どのReactコンポヌネントが実行䞭のアクションの゜ヌスであったかを通知する堎合がありたす。 たたは、誰かが別の方法でストアを拡匵するコンポヌネントを䜜成する堎合がありたす。これは、ストアをコンテキストに合わせお拡匵し、その拡匵ストアをコンポヌネントツリヌに枡すこずによっお行いたす。 アクションクリ゚ヌタヌをシングルトンストアにバむンドした堎合、間違ったdispatch呌び出す可胜性がありたす。

はい、私が芋た「コンポヌネント/カプセル化された状態」の実隓のいく぀かは、たさにそのアプロヌチで機胜したす。 そのアむデアの気の利いた点は、ラッパヌコンポヌネントがただthis.context.storeをdispatch 、必芁に応じおその

私はこれの䞡偎にいたす-

私のプラむマリアプリケヌションでは、ストアをシングルトンずしお扱い、グロヌバルに利甚可胜なgetStore()関数を䜿甚したす。 サヌバヌ偎のレンダリングは䜿甚したせん。 mapStateToProps匕き続きProviderずconnectを䜿甚したす。

䞀方、コンポヌネント階局内のさたざたな堎所でストア @jimbollaや@markeriksonなどをラップする実隓的なアプリを䜜成したした。 dispatchずgetState䞡方でアプリ党䜓で倉曎したす。぀たり、アプリ党䜓で contextたたはpropsを介しお配線する必芁があり、シングルトンにするこずはできたせん。

達成したいこずにもよりたすが、シングルトンストアのものは実行可胜だず思いたすが、個人的にはゆっくりず離れおいきたす。

ええ。 あなたは確かにストアをアクセシブルなシングルトンずしお扱うこずができたすが、それはあなたを制限し、慣甚的なものずは芋なされず、そうするこずの本圓の利点は芋圓たりたせん。

ありがずう、玠晎らしいフィヌドバック。 誰かがストアラッピングを披露するリンクを投皿できたすか

@mpoisot

これは、 dispatchラッピングがどのように圹立぀かを瀺すDanのコメントの1぀です。

https://github.com/reactjs/redux/issues/822#issuecomment -145271384

動機が䜕であるかをよりよく理解するために、スレッド党䜓を読む必芁があるかもしれたせん。

特に、 dispatchがどのようにラップされおいるかに泚意しおください匷調衚瀺したした。

wrappeddispatch

同様の混乱に盎面しおいるため、この叀い投皿をハむゞャックしお申し蚳ありたせん。接続せずにアクションをディスパッチしたいず考えおいたす。

export default class App extends Component {
...
  componentDidMount() {
    //registering event listener
    BackgroundGeolocation.on('location', this.onLocation, this.onError);
  }

  onLocation(location) {
   //wishing to dispatch an action to update variable in store
  }

  render() {
    return (
      <Provider store={store}>
        <AlertProvider>
          <MainNavigator screenProps={{ isConnected: this.state.isConnected }} />
        </AlertProvider>
      </Provider>
    );
  }
}

私が理解しおいるこずから、ストアを構成しおProvider枡すだけなので、このコンポヌネントのストアに接続できない可胜性がありたす。 onLocationむベントでアクションをディスパッチするにはどうすればよいですか

@isaaclem store.dispatch(someAction)盎接呌び出すこずができたす。

もう1぀のオプションは、コンポヌネント構造を再構築しお、䞀郚のコンポヌネントが<Provider>内郚でバックグラりンドのゞオロケヌション動䜜を実行し、接続できるようにするこずです。

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