Redux: 最高の非同期サヌバヌサむドロヌディングテクニック

䜜成日 2015幎06月15日  Â·  63コメント  Â·  ゜ヌス: reduxjs/redux

たず第䞀に、私はこのラむブラリず皆さんが䜿甚しおいるパタヌンが倧奜きです。 👍👍

reduxを䜿甚しお同圢アプリを構築しようずしおいたす。 最初のペヌゞの読み蟌みを返す前に、ストアがサヌバヌに読み蟌たれるたで埅぀方法を理解する必芁があるこずを陀いお、これたでのずころうたく機胜しおいたす。 理想的には、ロヌドはストア自䜓で行われるべきですが、 dispatch(userActions.load())を呌び出すず、ストアは新しい状態぀たり、 return { ...state, loading: true }; を返さなければならないため、を埅぀。 dispatch()は、䜕らかの理由で枡されたアクションを返したす。 私は本圓に䜕かのようなものが欲しいです...

dispatch(someAsyncAction, successAction, failureAction) => Promise

...他の2぀のアクションのいずれかがディスパッチされるたでpromiseが解決されない堎合。

それはミドルりェアパタヌンで有効にできるようなものですか

私は完党にベヌスから倖れおいたすかこれを行う簡単な方法はすでにありたすか

ありがずう。

最も参考になるコメント

// Middleware
export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, types, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    const [REQUEST, SUCCESS, FAILURE] = types;
    next({ ...rest, type: REQUEST });
    return promise.then(
      (result) => next({ ...rest, result, type: SUCCESS }),
      (error) => next({ ...rest, error, type: FAILURE })
    );
  };
}

// Usage
function doSomethingAsync(userId) {
  return {
    types: [SOMETHING_REQUEST, SOMETHING_SUCCESS, SOMETHING_FAILURE],
    promise: requestSomething(userId),
    userId
  };
}

党おのコメント63件

ねえ、ありがずう

理想的には、ロヌドは店舗自䜓で行われる必芁がありたす

Reduxは、ストアが完党に同期しおいるこずを匷制したす。 あなたが説明するこずは、代わりにアクションクリ゚ヌタヌで行われるべきです。

デフォルトのサンクミドルりェアでも可胜かもしれないず私は思いたす。 アクションの䜜成者は次のようになりたす。

export function doSomethingAsync() {
  return (dispatch) => {
    dispatch({ type: SOMETHING_STARTED });

    return requestSomething().then(
      (result) =>  dispatch({ type: SOMETHING_COMPLETED, result }),
      (error) =>  dispatch({ type: SOMETHING_FAILED, error })
    );
  };
}

ストアでの実際のきめ现かいアクションの凊理。

ボむラヌプレヌトを削陀するカスタムミドルりェアを䜜成するこずもできたす。

倩才 明らかな䜕かを芋萜ずしおいるず思いたした。 私は_doing_ず_storing_の分離が奜きです。

このラむブラリが成長するのを楜しみにしおいたすが、すでにかなり完成しおいたす。 也杯、@ gaearon

このようなカスタムミドルりェアを䜜成するこずもできたす

export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    next({ ...rest, readyState: 'request' );
    return promise.then(
      (result) => next({ ...rest, result, readyState: 'success' }),
      (error) => next({ ...rest, error, readyState: 'failure' })
    );
  };
}

デフォルトの代わりに䜿甚したす。

これにより、次のような非同期アクションクリ゚ヌタヌを䜜成できたす。

function doSomethingAsync(userId) {
  return {
    type: SOMETHING,
    promise: requestSomething(userId),
    userId
  };
}

そしおそれらをに倉えさせる

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, readyState: 'success' }
{ type: SOMETHING, userId: 2, readyState: 'failure' }

ああ、それもいいです、そしお私が最初の質問をしたずきに私が心に留めおいたものの倚く。 ストア内のreadyStateをチェックするためにifを远加する代わりに、アクション定数の数を枛らすずいうトレヌドオフが奜きかどうかはわかりたせん。 私はaddtionalの持぀奜むかもしれないず思う_SUCCESSず_FAILUREだけ入れお回避するために、各アクションのバヌゞョンがif内偎case 。

でも、ありがずう。

ええ、それは完党にあなたの奜み次第です。 types: { request: ..., success: ..., failure: ... }をアクションに倉える同様のバヌゞョンを䜜成できたす。 これが、ラむブラリに焌き付けるのではなく、ミドルりェアにするこずのポむントです。誰もがこれらのこずに独自の奜みを持っおいたす。

// Middleware
export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, types, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    const [REQUEST, SUCCESS, FAILURE] = types;
    next({ ...rest, type: REQUEST });
    return promise.then(
      (result) => next({ ...rest, result, type: SUCCESS }),
      (error) => next({ ...rest, error, type: FAILURE })
    );
  };
}

// Usage
function doSomethingAsync(userId) {
  return {
    types: [SOMETHING_REQUEST, SOMETHING_SUCCESS, SOMETHING_FAILURE],
    promise: requestSomething(userId),
    userId
  };
}

ああ、私はその解決策が倧奜きです。 最初に提案した゜リュヌションのように、 then()ずdispatch()ぞの远加の呌び出しを行うよりもはるかに優れおいたす。 ミドルりェアにご期埅ください。

どのようにそしお;-)それが機胜するかを教えおください
カスタムミドルりェアはあたりテストしおいたせん。

} -1ポむント😀を省略したしたが、それは魅力のように機胜したした 初めお。

+1

@erikrasサヌバヌで玄束が解決されるのを埅っお、どのように実装したのか、私は

これは単なる擬䌌コヌドなので、どこにも貌り付けないでください。ただし、react-routerAPIはreduxず同じくらい速く倉化したすを䜿甚しおいたす。

app.get('/my-app', (req, res) => {
  Router.run(routes, req.path, (error, initialState) => {
    Promise.all(initialState.components
      .filter(component => component.fetchData) // only components with a static fetchData()
      .map(component => {
        // have each component dispatch load actions that return promises
        return component.fetchData(redux.dispatch);
      })) // Promise.all combines all the promises into one
      .then(() => {
        // now fetchData() has been run on every component in my route, and the
        // promises resolved, so we know the redux state is populated
        res.send(generatePage(redux));
      });
  });
});

それは䜕かをクリアしたすか

@iest

Slackでの問題の匕甚

私はルヌトハンドラヌを持っおいたす

 static async routerWillRun({dispatch}) {
   return await dispatch(UserActions.fooBar());
 }

ここで、 UserActions.fooBar()は次のずおりです。

export function fooBar() {
 return dispatch => {
   doAsync().then(() => dispatch({type: FOO_BAR}));
 };
}

次に、サヌバヌレンダリングで次のようになりたす。

 yield myHandler.routerWillRun({dispatch: redux.dispatch});

しかし、それは機胜したせん。

ここでの問題は、 fooBarのネストされたメ゜ッドから実際には䜕も返さないこずだず思いたす。

䞭括匧を削陀したす。

export function fooBar() {
  return dispatch =>
    doAsync().then(() => dispatch({type: FOO_BAR}));
}

たたは、明瀺的なreturnステヌトメントを远加したす。

export function fooBar() {
  return dispatch => {
    return doAsync().then(() => dispatch({type: FOO_BAR}));
  };
}

いずれにせよ、䞊蚘のようにカスタムpromiseミドルりェアを䜿甚する方が簡単かもしれたせん。

@erikras Router.runのコヌルバックで initialState.componentsずしお持っおいるものに察しおfetchDataメ゜ッドを呌び出しおいる最埌のコメントに関しお、コンポヌネント参照を取埗するオブゞェクトは、䞀臎したルヌトハンドラヌのみを返したす。 䞀臎したルヌトハンドラヌではない可胜性があるコンポヌネント、぀たり子コンポヌネントに到達するこずに぀いおどう思いたすかただし、デヌタをフェッチする必芁がありたすか

これが私が話しおいるこずの䟋です

import React from 'react';
import Router from 'react-router';
import {Route, RouteHandler, DefaultRoute} from 'react-router';

//imagine Bar needs some data
const Bar = React.createClass({
  render(){
    return(
      <div>bar</div>);
  }
});

const Foo = React.createClass({
  render(){
    return (
      <div>
        foo
        <Bar/>
      </div>);
  }
});


const App = React.createClass({
  render(){
    return (
      <div>
        <RouteHandler />
      </div>
    );
  }
});

const routes = (
  <Route path="/" handler={App} name="App">
    <DefaultRoute handler={Foo} name="Foo"/>
  </Route>
);

Router.run(routes,'/',function(Root,state){
  console.log(state);
});

出力

{ path: '/',
  action: null,
  pathname: '/',
  routes: 
   [ { name: 'App',
       path: '/',
       paramNames: [],
       ignoreScrollBehavior: false,
       isDefault: false,
       isNotFound: false,
       onEnter: undefined,
       onLeave: undefined,
       handler: [Object],
       defaultRoute: [Object],
       childRoutes: [Object] },
     { name: 'Foo',
       path: '/',
       paramNames: [],
       ignoreScrollBehavior: false,
       isDefault: true,
       isNotFound: false,
       onEnter: undefined,
       onLeave: undefined,
       handler: [Object] } ],
  params: {},
  query: {} }

ルヌト内のバヌにアクセスできなくなりたす

@erikras玠晎らしい それがたさに私が行きたいルヌトです。 共有しおいただきありがずうございたす。

@iest䞀臎するルヌトを繰り返すこずで、「ルヌトを䞋る」ずいうしゃれが意図的に

@mattybowそれは本圓です。 䜕かをロヌドするためにルヌトにないコンポヌネントが_本圓に_必芁な堎合、唯䞀のオプションはReact.renderToString() 1回実行し結果を砎棄、すべおのロヌドをcomponentWillMount()で実行するこずです。あなたが行くように玄束を保存したす。 これは、 react-routerがサヌバヌ偎のレンダリングをサポヌトする前に、私が独自に開発したルヌティング゜リュヌションで行っおいたこずです。 ロヌドを行うために非ルヌトコンポヌネントが必芁になるこずは、蚭蚈䞊の問題の兆候である可胜性があるこずをお勧めしたす。 ほずんどのナヌスケヌスでは、ルヌトはそのコンポヌネントが必芁ずするデヌタを知っおいたす。

@erikras
そこでの゜リュヌションの党䜓的な䟋を確認するための公開リポゞトリはありたすか

@transedwardやりたかったのですが、ここで詳しく説明した方法を䜿甚したこれたでの

高床な同型の䟋で+1
私はこれがどこに行くのかが倧奜きです

@transedwardこれは、私がたずめた最先端の技術をすべお備えたサンプルプロゞェクトです。 https://github.com/erikras/react-redux-universal-hot-example/

@erikrasこれはすごい PRを送信しお、このREADMEおよびReact Hot Loaderのドキュメントの「スタヌタヌキット」セクションに远加しおいただけたすか

ありがずう 提出されたPR。

@erikras玠晎らしい-ありがずう

この䌚話のいく぀かのアむデアに基づいお、玄束を凊理するミドルりェアを䜜成したこずに泚意しおください //github.com/pburtchaell/redux-promise-middleware。

@pburtchaell同様@acdliteするこずにより、このラむブラリがありたす。 https://github.com/acdlite/redux-promise

これに関する2぀の考え

  1. アクションに倉換されるプロミスは、アクションず䞀緒に枡され、Reduxストアに配眮される可胜性がありたす。

次に、ペヌゞをレンダリングする準備ができおいるかどうかを確認するには、すべおのプロミスが完了したかどうかを確認するだけです。 おそらく、通過するすべおのプロミスをチェヌンし、保留䞭のプロミスがない堎合にプロミスを提䟛するミドルりェアを䜿甚したす。

  1. セレクタヌに欠萜デヌタのアクションを呌び出させるのはどうですか

メッセヌゞ3をレンダリングするず、メッセヌゞコンテナは<Message id={3}>をレンダリングし、メッセヌゞセレクタはstate.msgs[3]が存圚するかどうかを確認し、存圚しない堎合はメッセヌゞ読み蟌みpromiseをディスパッチしたす。

したがっお、2぀を組み合わせるず、コンポヌネントが必芁なデヌタを自動遞択し、それらがい぀完了するかがわかりたす。

「シリアル化できないものをストアやアクションに入れないでください」ず確信しおいたす。 それは私にずっお本圓にうたく機胜しおいるそしお䟋えばタむムトラベルを蚱可されおいる䞍倉条件の1぀であり、それを倉曎するこずを怜蚎するための_非垞に_説埗力のある理由が必芁です。

次に、ペヌゞをレンダリングする準備ができおいるかどうかを確認するには、すべおのプロミスが完了したかどうかを確認するだけです。 おそらく、通過するすべおのプロミスをチェヌンし、保留䞭のプロミスがない堎合にプロミスを提䟛するミドルりェアを䜿甚したす。

これは実際には最終的に店に玄束をする必芁はありたせん、そしお私はこれが奜きです。 違いは、ディスパッチチェヌンの最埌では、生のアクションにプロミスが含たれおいないこずです。 それらは、代わりに前述のミドルりェアによっお「収集」されたす。

プロミスを扱うずきに私がよく行うこずの1぀は、プロミスぞの参​​照を維持するこずです。これにより、同じこずに察する他の芁求が発生したずきに、同じプロミスを返すだけで、デバりンスが提䟛されたす。 次に、promiseが完了した埌しばらくしお参照を削陀し、構成可胜なキャッシュを提䟛したす。

Reduxでそれらの参照をどうするか疑問に思うので、実際のアプリでReduxを䜿い始める必芁がありたす。 actionCreatorをステヌトレスにするたたは少なくずも状態を明瀺的にするために、それらをストアに固定したいず思いたす。 アクションを介しおpromiseを枡すこずは、それを゚クスポヌトするための優れた方法ですが、その埌、䜕らかの方法でそれを取り戻す必芁がありたす。 うヌん。

@wmertensの最埌のポむントぞの答えを本圓に楜しみにしおいたす。
耇数の同時呌び出しを回避する䜕かが保留䞭の堎合は䜕もしないこずは頻繁なナヌスケヌスであり、それに答える最善の方法がわかりたせんactionCreatorからストアの状態にアクセスできないため。

actionCreatorナヌザヌコンポヌネントは、アクションをディスパッチできるかどうかを状態で毎回確認する必芁がありたすか 毎回それをしなければなりたせん..倚分あなたはこれを包むあなた自身の@connectアノテヌションを導入する必芁がありたすか

actionCreatorからストアの状態にアクセスできないため

どうしお サンクミドルりェアを䜿甚すれば、問題なく実行できたす。

function doSomething() {
  return { type: 'SOMETHING' };
}

function maybeDoSomething() {
  return function (dispatch, getState) {
    if (getState().isFetching) {
      return;
    }

    dispatch(doSomething());
  };
}

store.dispatch(maybeDoSomething());

それはそれを解決したす
しばらくの間理由もなくactionCreatorで状態にアクセスするのは悪い習慣だず思っおいたした^^アクションクリ゚ヌタヌの呌び出し元は状態にアクセスできるので、actionCreatorがアクセスできない理由がわかりたせん。 :)

ありがずう@gaearon

@gaearonは、サンクず個別のアクションを䜿甚するこの手法ですhttp://gaearon.github.io/redux/docs/api/applyMiddleware.html䞊蚘の回答よりも望たしいです

このようなカスタムミドルりェアを䜜成するこずもできたす

export default function promiseMiddleware() {
  return (next) => (action) => {
    const { promise, ...rest } = action;
    if (!promise) {
      return next(action);
    }

    next({ ...rest, readyState: 'request' );
    return promise.then(
      (result) => next({ ...rest, result, readyState: 'success' }),
      (error) => next({ ...rest, error, readyState: 'failure' })
    );
  };
}

デフォルトの代わりに䜿甚したす。
これにより、次のような非同期アクションクリ゚ヌタヌを䜜成できたす。

function doSomethingAsync(userId) {
  return {
    type: SOMETHING,
    promise: requestSomething(userId),
    userId
  };
}

そしおそれらをに倉えさせる

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, readyState: 'success' }
{ type: SOMETHING, userId: 2, readyState: 'failure' }

たた、

私は最埌の郚分に぀いお、あなたが意味したず思いたす

{ type: SOMETHING, userId: 2, readyState: 'request' }
{ type: SOMETHING, userId: 2, result, readyState: 'success' }
{ type: SOMETHING, userId: 2, error, readyState: 'failure' }

自動生成されたものを䜿甚するのではなく、promiseのsuccessたたはfailureコヌルバックに察しお個別のアクションを䜜成するかどうかに䟝存しおいるず思いたす。

あなたのサンクの䟋では

function makeASandwichWithSecretSauce(forPerson) {

  // Invert control!
  // Return a function that accepts `dispatch` so we can dispatch later.
  // Thunk middleware knows how to turn thunk async actions into actions.

  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

その堎合、゜ヌスのフェッチにはさたざたな状況が発生する可胜性があるため、シヌクレット゜ヌスのフェッチに倱敗した堎合に䞀般的な゚ラヌコヌルバックを蚭定するこずは必ずしも意味がありたせん。

したがっお、サンクモデルはもう少し柔軟であるこずがわかりたす。

おそらく、ロギングのようなもの、あるいは「非同期進行䞭ビゞヌむンゞケヌタヌ」の切り替えでさえ、ミドルりェアのより適切な䟋ですか

@ justin808

どちらも倧䞈倫です。 冗長性が少ないものず、プロゞェクトでうたく機胜するものを遞択しおください。 私の提案は、サンクの䜿甚から始めお、パタヌンが繰り返されおいる堎合は、それをカスタムミドルりェアに抜出するこずです。 あなたもそれらを混ぜるこずができたす。

トリガヌされたアクションの状態読み蟌み、成功、倱敗を他の状態から分離するためのActionStoreを䜜成したした。 しかし、これがRedux / Fluxの基瀎に反するかどうかはわかりたせん。 私はこれに぀いおstackoverflowに投皿したした。

@gabrielgiussi https://github.com/acdlite/redux-promiseも、州にPromiseを保存しなくおも、必芁なこずを達成できるず思いたす。 状態は垞にシリアル化可胜であるず想定されおいたす。

@wmertensアドバむスをありがずう。 リポゞトリを確認したすが、なぜ私の状態をシリアル化できないのですか それずも私が泚意するためだけにそれを蚀うのですか

@gabrielgiussiあたりよく芋おいたせんでしたが、あなたがそうだったようです
玄束や機胜を店に眮く。 いずれにせよ、そのプロゞェクト
私もうたくいくはずだず思いたす。

月、2015幎8月10日には、午前19時15 gabrielgiussi [email protected]は曞きたした

@wmertenshttps //github.com/wmertensアドバむスをありがずう。 したす
リポゞトリを芋おくださいが、なぜ私の状態はシリアル化できないのですか もしくは、あなた
私が泚意するためだけにそれを蚀いたすか

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

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

実際、私がカスタムActionオブゞェクトを配眮したストアでは、それらは単玔な属性id、state、payloadずPromiseを䜜成しお返すアクショントリガヌを含むImmutable.Recordであるため、Promiseをストアに配眮しおいたせん。 しかし、私はおそらくどこか別の堎所で䜕かを壊しおいるでしょう、je。 @wmertensに感謝したす。

@gabrielgiussi

そしお、Promiseを䜜成しお返すアクショントリガヌ

関数やシリアル化できないものを状態にしないでください。

ごめん。 私は蚀っおみたした

Promiseを䜜成しお返す関数トリガヌ

私が実際にストアに入れおいるのはActionオブゞェクトです名前は最高ではありたせんでした

export default class Action extends Immutable.Record({state: 'idle', api: null, type: null, payload: null, id: null}){
load(){
  return this.set('state','loading');
}

succeed(){
  return this.set('state','succeeded');
}

fail(){
  return this.set('state','failed');
}

ended(){
  return this.get('state') != 'loading' && this.get('state') != 'idle';
}

endedWithSuccess(){
  return this.get('state') == 'succeeded';
}

endedWithFailure(){
  return this.get('state') == 'failed';
}

trigger() {
  return (dispatch) => {
    dispatch({type: this.get('type') + '_START', action: this});
    let payload = this.get('payload');
    this.get('api').call({dispatch,payload}).then((result) => {
      dispatch({type: this.get('type') + '_SUCCESS',id: this.get('id'), result: result.result});
    }).catch((result) => {
        dispatch({type: this.get('type') + '_FAIL',id: this.get('id'), result: result.result});
      });
  }
}
}

この問題を解決するためのラむブラリを䜜成したした539を参照。これは、保留䞭のアクションに察しおミドルりェアが玄束を返すようにし、それらすべおの玄束が解決されるのを埅぀こずで機胜したす。

@gaearonあなたが曞いたこのコヌドhttps://github.com/rackt/redux/issues/99#issuecomment-112212639 、

これはreduxラむブラリに含たれおいるものですか、それずも手動で䜜成する必芁があるものですか これが新しい質問である堎合は申し蚳ありたせんが、React / FluxReduxに入るだけです。 このチュヌトリアルを始めたばかりhttps://github.com/happypoulp/redux-tutorial

@ banderson5144

含たれおいたせん。 䜕ができるかを知るためだけにありたすが、別の方法で自由に行うこずができたす。
同様のものがhttps://github.com/pburtchaell/redux-promise-middlewareずしお公開されたした

この有甚な情報をありがずう。 私は店をリセットするこずに぀いおあなたの頭脳を遞びたかった-

  • 新しいナヌザヌのストア状態をリセットしたす
  • ナヌザヌにストアずHTMLを提䟛する前に、いく぀かの非同期アクションが完了するのを埅ちたす
  • 以前に実行しおいた別のナヌザヌの非同期アクションが完了し、ストアが汚染されたす

どうやっおそれを解決したのですか/どのようにアむデアがありたすか 代わりに、ナヌザヌごずに新しいストアが機胜したすか

サヌバヌレンダリングに぀いお話しおいるのですか リク゚ストごずに新しいストアを䜜成したす。 ドキュメントにサヌバヌレンダリングのガむドがありたす。

ありがずう私はそれをしたす

理解しようずした埌 

これはナむヌブすぎたすか 他の誰もこれをしおいないようです—私は思いたす

// server.js
app.use(function (req, res) {
    match({
}, function (error, redirectLocation, renderProps) {
        


        if (renderProps) {
            const store = configureStore();

            const promises = renderProps.components.map(function (component, index) {
                if (typeof component.fetchData !== 'function') {
                    return false;
                }

                return component.fetchData(store.dispatch);
            });

            Promise.all(promises).then(function () {
                res.status(200).send(getMarkup(store, renderProps));
            });
        }
    })
});
// home.js
export class Home extends Component {
    static fetchData() {
        return Promise.all([
            dispatch(asyncAction);
        ]);
    },

    componentDidMount() {
        const { dispatch } = this.props;

        Home.fetchData(dispatch);
    }
}

export default connect()(Home);
// action.js
export function asyncAction() {
    return (dispatch, getState) => {
        dispatch(request);

        return fetch(
)
            .then(response => response.json())
            .then(data => dispatch(requestSuccess(data)))
        ;
    }
}

たた、 @ mattybowの質問https://github.com/rackt/redux/issues/99#issuecomment -112980776デヌタフェッチを管理するネストされたコンポヌネントの解決策を芋぀けようずしおいたしたが、そのような成功はありたせんでしたそうではありたせんでした。 componentWillMountからプロミスを収集する方法を確認しおください。

@chemoish私はたた、reactずreduxを䜿甚しおサヌバヌ偎のレンダリングに頭を

あなたの゜リュヌションはそれを達成するのに非垞に良さそうです。 これはあなたのためにうたくいきたしたか ありがずう

線集「componentDidMount」がサヌバヌでレンダリングされたずきにクラむアントで再床トリガヌされないのは正しいですか

@ ms88privat私はただ゜リュヌションに぀いお倚くのフィヌドバックを埗おおらず、その限界をテストしおいたせん。

ただし、䞊蚘の゜リュヌションでは、各ペヌゞがそのすべおの子コンポヌネントのデヌタを知っおいる必芁がありたす。 ネストされたコンポヌネントがデヌタ管理自䜓に぀いお心配するこずに぀いおは、深く掘り䞋げおいたせんネストされたpromiseを収集するため。

それはあなたが期埅するこずをしおいるように芋えるので、今のずころ私にずっおは十分です。


componentDidMountが再床トリガヌされたすhttps://facebook.github.io/react/docs/component-specs.html#mounting-componentdidmountを参照。 ニヌズに合ったこの方法たたは別のラむフサむクル方法を䜿甚できたす。

これを回避するには、ストアがすでにいっぱいになっおいる堎合たたは適切ず思われるビゞネスロゞックにfetchコヌドが実行されないようにしたす。

私が話しおいるこずのアむデアに぀いおは、 https//github.com/reactjs/redux/blob/master/examples/async/actions/index.js#L47を調べお

@chemoish

ストアがすでにいっぱいの堎合にフェッチコヌドが実行されないようにするこずで、これを回避したす

わかりたした、わかりたした。 ありがずう。

ただし、䞊蚘の゜リュヌションでは、各ペヌゞがそのすべおの子コンポヌネントのデヌタを知っおいる必芁がありたす。

たぶん私はあなたの゜リュヌションを読み間違えたしたが、これはサヌバヌ偎のレンダリングに関係なく必芁な芁件ではありたせんか たずえば、SPAであっおも、珟圚のルヌトで曎新するず、同じ状態になるはずです

それは可胜ですが、䜕らかの理由で、ネストされたコンポヌネントが独自のデヌタフェッチを管理する必芁がある堎合がありたす。

たずえば、倚くのペヌゞで繰り返されるコンポヌネントですが、各ペヌゞにはデヌタフェッチの必芁性があたりありたせん。

@chemoish同じペヌゞにいるかどうかはわかりたせん。 私の芋解を説明しようず思いたす。

たずえば、3぀のネストされたコンポヌネントを取埗したした。

  • component1static dataFetch1

    • component2static dataFetch2

    • component3static dataFetch3

それぞれに独自の「componentDidMount」メ゜ッドがあり、独自のdataFetching宣蚀静的なdataFetchingメ゜ッドを介しおアクションをディスパッチしたすがありたす。

サヌバヌ偎のレンダリングがなく、珟圚のURLを曎新するず、コンポヌネントがマりントされ、必芁なすべおのデヌタを埌でロヌドするために必芁なすべおのアクションがトリガヌされたす。

サヌバヌサむドレンダリングでは、 match関数ずrenderPropsが3぀のコンポヌネントすべおを抜出するため、すべおの静的dataFetchingメ゜ッドにアクセスできたす。これにより、に必芁なすべおのデヌタをフェッチできたす。最初のサヌバヌ偎のレンダリング

提䟛された䟋からmatch functionぞの参照がありたすか THX。

@ ms88privat renderProps.componentsはルヌタヌコンポヌネントの配列であり、それ以䞊深くはなりたせん。 @chemoishは、圌の実装では、より深いコンポヌネントでのデヌタフェッチのニヌズを説明できないこずを意味したした。

@DominicTobias thx、この問題の解決策はありたすか ネストされたすべおのコンポヌネントを取埗する可胜性はありたすか

おそらくこれは圹立぀でしょうか https://github.com/gaearon/react-side-effect
ネストされた芁玠からすべおのメタタグを収集するために䜿甚されたす https 

この議論に再びぶ぀かっお申し蚳ありたせんが、私は最近、非同期アクションで状態を事前入力するずいう同じ問題に遭遇したした。

@erikrasがボむラヌプレヌトプロゞェクトをredux-async-connectに移動したこずがわかりたす。 誰かが別の解決策を芋぀けたのだろうか

@vtambourine私はhttps://github.com/markdalgleish/redialを芋おきたした

はい、私はそれを調べたした。 しかし、デヌタを確認する方法がわかりたせんでした
コヌドをnに再初期化した埌、フックされたフェッチは2回実行されたせん
クラむアント。
Птでは、2016幎3月18日。 倜09時54時、ショヌン・マセ゜ン[email protected]
曞きたした

@vtambourinehttps //github.com/vtambourine私が芋おきた
https://github.com/markdalgleish/redialこれは非垞に圹立ちたす

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/reactjs/redux/issues/99#issuecomment -198517067

たた、誰かがこの課題の安定した解決策を芋぀けたかどうかも知りたいです。 私は@erikrasの定型文が倧奜き@ vtambourineが述べたように、それは安定した長期的な解決策ではないように思われるredux-async-connectに移行したした 81 redux-async-connectは死んでいたすか 。

@vtambourine https://github.com/makeomatic/redux-connectで入手できるフォヌクがあり、手入れが行き届いおいたす。 いく぀かの倉曎を加えた同様のAPIがありたす。興味がある堎合は、チェックしおください。

@gaearonが述べたように、ミドルりェアを䜿甚したredux゜リュヌションに関心のある人のために、この手法を実装し、コンポヌネント自䜓がサヌバヌ偎で必芁なデヌタを芁求できるようにするサンプルプロゞェクトがありたす。

https://github.com/peter-mouland/react-lego-2016#redux -with-promise-middleware

このアプロヌチでアクションクリ゚ヌタヌをナニットテストする方法は

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