Redux: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдорд╛рд░реНрдЧ рд╕рдВрдХреНрд░рдордг рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдлрд╛рдпрд░рд┐рдВрдЧ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬреБрд▓ре░ 2015  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ,

рдореИрдВ рдЕрдкрдиреЗ рдирд╡реАрдирддрдо рдРрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рдФрд░ рд░рд┐рдбрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди url рдкрд░рдореНрд╕ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╣рд░ рдмрд╛рд░ рдпреВрдЖрд░рдПрд▓ рдмрджрд▓рддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░реЙрдкрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд╣реЛ рд╕рдХреЗ

 @connect(state => ({
   campaigngroups: state.jobresults.campaigngroups,
   error: state.jobresults.error,
   loading: state.jobresults.loading
 }))

рдлрд┐рд▓рд╣рд╛рд▓ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ url рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП componentWillReceiveProps рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд░рд╛рдЙрдЯрд░ this.props.params рдФрд░ this.props.query рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирдП рдкреНрд░реЙрдкреНрд╕ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛

  componentWillReceiveProps(nextProps) {
    if (this.state.shouldupdate) {
      let { slug } = nextProps.params;
      let { citizenships, discipline, workright, location } = nextProps.query;
      const params = { slug, discipline, workright, location };
      let filters = this._getFilters(params);
      // set the state accroding to the filters in the url
      this._setState(params);
      // trigger the action to refill the stores
      this.actions.loadCampaignGroups(filters);
    }
  }

рдХреНрдпрд╛ рд░реВрдЯ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реАрдзреЗ рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ? рдореИрдВрдиреЗ willTransitionTo рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ред

docs ecosystem question

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@deowk рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рднрд╛рдЧ рд╣реИрдВ, рдореИрдВ рдХрд╣реВрдБрдЧрд╛ред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ componentWillReceiveProps() рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ - рдЬреНрдпрд╛рджрд╛рддрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЬреИрд╕реЗ рд╣рдо Redux рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреА рд╡рд░реНрддрдорд╛рди рд░рд╛рдЙрдЯрд░ рдЬрд╛рдирдХрд╛рд░реА (рд╕реНрдерд╛рди, рдкрд░рд┐рдо, рдХреНрд╡реЗрд░реА) _inside_ рдЖрдкрдХреЗ рд╕реНрдЯреЛрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХрд╛ рд╕рд╛рд░рд╛ рд░рд╛рдЬреНрдп рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИ, рдФрд░ рдЖрдк рдЕрдкрдиреЗ рд╢реЗрд╖ рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди Redux API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреНрд░рд┐рдХ рдПрдХ рдПрдХреНрд╢рди рдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЬрдм рднреА рд░рд╛рдЙрдЯрд░ рдХреА рд▓реЛрдХреЗрд╢рди рдмрджрд▓рддреА рд╣реИ рддреЛ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯрд░ рдХреЗ рдЖрдЧрд╛рдореА 1.0 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ:

// routeLocationDidUpdate() is an action creator
// Only call it from here, nowhere else
BrowserHistory.listen(location => dispatch(routeLocationDidUpdate(location)));

рдЕрдм рдЖрдкрдХрд╛ рд╕реНрдЯреЛрд░ рд╕реНрдЯреЗрдЯ рд╣рдореЗрд╢рд╛ рд░рд╛рдЙрдЯрд░ рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЗ рдШрдЯрдХ рдореЗрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рдХреНрд╡реЗрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ setState() рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ - рдмрд╕ Redux рдХреЗ рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

<Connector select={state => ({ filter: getFilters(store.router.params) })} />

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЖрдкрдХреЛ рджреГрд╢реНрдп рдкрд░рдд рдХреЗ рдмрд╛рд╣рд░ Redux рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдПрдХ рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдлрд╛рдпрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдиреЗрдВрдЯрд╡реИрд▓рд┐рд╕реЗрдкрдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВ рддреЛ рдореИрдВ RxJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ред

Redux рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реНрдЯреЛрд░ рд╕реНрдЯреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдХреНрд░рдо рдмрдирд╛рдПрдВред рдЖрдк рдЗрд╕реЗ redux-rx рдХреЗ observableFromStore() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

import { observableFromStore } from 'redux-rx';
const state$ = observableFromStore(store);

рдлрд┐рд░ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдмрд╛рдд рд╣реИред рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

const didLogin$ = state$
  .distinctUntilChanged(state => !state.loggedIn && state.router.path === '/login')
  .filter(state => state.loggedIn && state.router.path === '/login');

didLogin$.subscribe({
   router.transitionTo('/success');
});

рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдХрд┐ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреИрд╕реЗ componentDidReceiveProps() ред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ!

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@deowk рдЖрдк рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ this.props рдХреЗ рд╕рд╛рде nextProps рдЕрдЧрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдмрджрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рд╛, рддреЛ рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдирдВрдд рд▓реВрдк рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

@johanneslumpe : рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдЪрд╛рд░ рдЕрднрд┐рдпрд╛рди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧрд╣рд░реА рд╡рд╕реНрддреБ рддреБрд▓рдирд╛ рдХреА рддрд░рд╣ рдЕрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ?

@deowk рдЕрдЧрд░ рдЖрдк рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ, рддреЛ рдЖрдк рд╕рд┐рд░реНрдл рд╕рдВрджрд░реНрдн рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@deowk рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рднрд╛рдЧ рд╣реИрдВ, рдореИрдВ рдХрд╣реВрдБрдЧрд╛ред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ componentWillReceiveProps() рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ - рдЬреНрдпрд╛рджрд╛рддрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЬреИрд╕реЗ рд╣рдо Redux рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреА рд╡рд░реНрддрдорд╛рди рд░рд╛рдЙрдЯрд░ рдЬрд╛рдирдХрд╛рд░реА (рд╕реНрдерд╛рди, рдкрд░рд┐рдо, рдХреНрд╡реЗрд░реА) _inside_ рдЖрдкрдХреЗ рд╕реНрдЯреЛрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХрд╛ рд╕рд╛рд░рд╛ рд░рд╛рдЬреНрдп рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИ, рдФрд░ рдЖрдк рдЕрдкрдиреЗ рд╢реЗрд╖ рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди Redux API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреНрд░рд┐рдХ рдПрдХ рдПрдХреНрд╢рди рдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЬрдм рднреА рд░рд╛рдЙрдЯрд░ рдХреА рд▓реЛрдХреЗрд╢рди рдмрджрд▓рддреА рд╣реИ рддреЛ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯрд░ рдХреЗ рдЖрдЧрд╛рдореА 1.0 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ:

// routeLocationDidUpdate() is an action creator
// Only call it from here, nowhere else
BrowserHistory.listen(location => dispatch(routeLocationDidUpdate(location)));

рдЕрдм рдЖрдкрдХрд╛ рд╕реНрдЯреЛрд░ рд╕реНрдЯреЗрдЯ рд╣рдореЗрд╢рд╛ рд░рд╛рдЙрдЯрд░ рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЗ рдШрдЯрдХ рдореЗрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рдХреНрд╡реЗрд░реА рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ setState() рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ - рдмрд╕ Redux рдХреЗ рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

<Connector select={state => ({ filter: getFilters(store.router.params) })} />

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЖрдкрдХреЛ рджреГрд╢реНрдп рдкрд░рдд рдХреЗ рдмрд╛рд╣рд░ Redux рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдПрдХ рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдлрд╛рдпрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдиреЗрдВрдЯрд╡реИрд▓рд┐рд╕реЗрдкрдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВ рддреЛ рдореИрдВ RxJS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ред

Redux рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реНрдЯреЛрд░ рд╕реНрдЯреЗрдЯреНрд╕ рдХрд╛ рдПрдХ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдХреНрд░рдо рдмрдирд╛рдПрдВред рдЖрдк рдЗрд╕реЗ redux-rx рдХреЗ observableFromStore() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

import { observableFromStore } from 'redux-rx';
const state$ = observableFromStore(store);

рдлрд┐рд░ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдмрд╛рдд рд╣реИред рд╕рдлрд▓ рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рдж рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

const didLogin$ = state$
  .distinctUntilChanged(state => !state.loggedIn && state.router.path === '/login')
  .filter(state => state.loggedIn && state.router.path === '/login');

didLogin$.subscribe({
   router.transitionTo('/success');
});

рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдХрд┐ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреИрд╕реЗ componentDidReceiveProps() ред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗ!

рд╣рдореЗрдВ рдирдП рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рд┐рдЦрд╛ рд╣реИред

@acdlite : рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХреА рд╕рд▓рд╛рд╣ рдиреЗ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХреА, рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ -> рдПрдХ url рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдПрдХ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдХреЗ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдирд╛ред

рдореИрдВ рд╡рд╕реАрдпрддрдирд╛рдореЗ рдореЗрдВ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдХреЗ рдмрд╛рдж рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯрд░-рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк v0.13.3 рд╣реИ

class Results extends Component  {
..........
}

Results.willTransitionTo = function (transition, params, query) {
 // how do I get a reference to dispatch here?
};

@deowk рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЖрдк dispatch рд╕реАрдзреЗ redux рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

const redux = createRedux(stores);
BrowserHistory.listen(location => redux.dispatch(routeLocationDidUpdate(location)));

@ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдЯрд░ 0.13.3 рдореЗрдВ рдЕрдкрдиреЗ рдпреВрдЖрд░рдПрд▓ рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬрддрд╛ рд╣реВрдБ:

Router.run(routes, Router.HistoryLocation, function(Handler, locationState) {
   dispatch(routeLocationDidUpdate(locationState))
   React.render(<Handler/>, appEl);
});

@acdlite рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рдпрд╛! : +1:
рд╕рд╣рдордд рдпрд╣ рдирдП рдбреЙрдХреНрд╕ рдореЗрдВ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :)

рдмрд╕ рдПрдХ рдиреЛрдЯ, рдХреЗ рд░реВрдк рдореЗрдВ BrowserHistory.history() рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЧрдпрд╛ рд╣реИ BrowserHistory.addChangeListener() ред

https://github.com/rackt/react-router/blob/master/modules/BrowserHistory.js#L57

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

history.addChangeListener(() => store.dispatch(routeLocationDidUpdate(location)));

рдФрд░ рдЙрд╕ reducer рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, @pburtchaell?

рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рд╕реЗрдЯрдЕрдк рд╣реИ:

// client.js
class App extends Component {
  constructor(props) {
    super(props);
    this.history = new HashHistory();
  }

  render() {
    return (
      <Provider store={store}>
         {renderRoutes.bind(null, this.history)}
      </Provider>
    );
  }
}

// routes.js
export default function renderRoutes(history) {

  // When the route changes, dispatch that information to the store.
  history.addChangeListener(() => store.dispatch(routeLocationDidUpdate(location)));

  return (
    <Router history={history}>
      <Route component={myAppView}>
        <Route path="/" component={myHomeView}  />
      </Route>
    </Router>
  );
};

рдпрд╣ routeLocationDidUpdate() рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рд╣рд░ рдмрд╛рд░ рд░реВрдЯ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдРрдк рд╢реБрд░реВ рдореЗрдВ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред

@pburtchaell рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ routeLocationDidUpdate рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@gyzerok рдЬрд╝рд░реВрд░ред рдпрд╣ рдПрдХ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╣реИред

// actions/location.js
export function routeLocationDidUpdate(location) {
  return {
    type: 'LOCATION_UPDATE',
    payload: {
      ...location,
    },
  };
}

@pburtchaell рддреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛

рдпрд╣рд╛рдБ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

https://github.com/acdlite/redux-react-router/blob/master/README.md#bonus -reacting-to-state-changes-with-redux-rx

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @pburtchaell рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдХреЛрдб рдХреЗ рдПрдХ async рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ (REST рдХреЙрд▓ рдЖрджрд┐ рд╕реЗ)ред рдХреНрдпрд╛ рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдБ рддреЛ рдХреНрдпрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдЯреЛрд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╣ рд╕реНрдЯреЛрд░ рдПрдХ рд▓реЛрдХреЗрд╢рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдореИрдВ рддрдм рдХрд░реВрдВрдЧрд╛

<strong i="7">@connect</strong>

рдореЗрдВ, рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ

<Comments />

рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП 'рдЬреБрдбрд╝рд╛' (рд╕рджрд╕реНрдпрддрд╛) рд╣реЛрдЧрд╛? рдпрд╛ рд╕рд┐рд░реНрдл рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрди рд╕реНрдерд╛рди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ?

рдПрдХ рдпреВрдЖрд░рдПрд▓ рдХреА рддрд░рд╣

/comments/123

рд╣рдореЗрд╢рд╛ рдЯрд┐рдкреНрдкрдгреА рдШрдЯрдХ рдХреЗ рд▓рд┐рдП 'рдпреБрдЧреНрдорд┐рдд' рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реВрдВ? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдЧреВрдВрдЧрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЙрд▓рдЭрди рд╣реИред рдЬрд┐рд╕рдХрд╛ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рдерд╛ред

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рднреА рдЬреВрдЭ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рд╕реНрдерд┐рд░ fetchData(dispatch, params) рд╡рд┐рдзрд┐ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдЗрд╕реЗ рд╢реБрд░реБрдЖрддреА рд░реЗрдВрдбрд░ рд╕реЗ рдкрд╣рд▓реЗ async FETCH рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ)ред

рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░ dispatch рдХрд╛ рд╕рдВрджрд░реНрдн рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ, рдореИрдВ fetchData рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ Connector -рд╕рдорд╛рди рдШрдЯрдХ рд╣реИ рдЬреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ fetchData рдпрд╛ shouldFetchData , рдпрд╛ select рдХреЙрд▓рдмреИрдХ рдХреЛ dispatch state рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд░реНрддрдорд╛рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ store рдХреА рдЕрд╡рд╕реНрдерд╛ рдФрд░ FETCH рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рднреЗрдЬреЗрдВред

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ рдХрд┐ select рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдкреВрд░реНрд╡ рдореЗрдВ рджреЗрдЦреВрдВрдЧрд╛ред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рд╕реЗрдЯ рдЕрдк рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ (рд╕реНрдерд┐рд░ fetchData(dispatch, state) рд╡рд┐рдзрд┐ рдЬреЛ async _FETCH рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рднреЗрдЬрддреА рд╣реИ) рдпрд╣ рдЙрдЪрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛: https: // gist ред

рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛! "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдВрднрд╡ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1.0 рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

рд╕реБрдирдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ @gaearon

рдлрд┐рд░ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдмрд╛рдд рд╣реИред

рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрдЯреЛрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдзрд╛рд░рд╛ рдорд┐рд▓ рдЧрдИ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЕрдкрдирд╛ рд╕реНрдЯреЛрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗрдЯрдЕрдк рднреА рдорд┐рд▓рд╛ рд╣реИред рдЬрдм рдореЗрд░реА рджреБрдХрд╛рди рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдирдП рдорд╛рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рдЬрдм рдпрд╣ undefined рд╕реЗ рдПрдХ рд╡реИрдз рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдореЗрд░реЗ рдРрдк рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реИред

рджреЛ рдзрд╛рд░рд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИрдВ, рдФрд░ рд╕реНрдЯреЛрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Rx рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ, рдФрд░ рдЕрд╡рд▓реЛрдХрдиреАрдп рдХреНрд╡реЗрд░реА ... рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ? рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реВрдВ? рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ distinctUntilChanged рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рдореЗрд░реА рдиреВрдбрд▓ рдкрдХрд╛рдирд╛, рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА :)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрдХ! рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ред рдиреАрдЪреЗ рдЫрджреНрдо рдХреЛрдбред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рднрдпрд╛рдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ?

const didChangeProject$ = state$
  .distinctUntilChanged(state => state.project._id)
  .filter(state => typeof state.project._id !== 'undefined');

# 177 рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рдорд╛рдкрдиред рдЬрдм рд╣рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рднреА рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд, рдЕрдиреБрд░реЛрдз рдХреЙрд▓рдмреИрдХ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд, рдЖрджрд┐ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрдВрдж рд╣реИ .. рд▓реЗрдХрд┐рди рдЕрднреА рд░рд┐рдПрдХреНрдЯ 0.14 рдФрд░ рдмреАрдЯрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди 1.0 рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде, рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд░рд┐рдПрдХреНрдЯ 0.14, рд░рд┐рдПрдХреНрд╢рди-рд░рд╛рдЙрдЯрд░, рд░рд┐рдбрдХреНрд╕ рдЖрджрд┐ рдореЗрдВ рдирдИ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓рд┐рдЦрд╛ рд╣реБрдЖ? рд╣рдордореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рдРрд╕реЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рд╕рдм рд╕реАрдЦрддреЗ / рд╕рдордЭрддреЗ рд╣реБрдП рдЖрдЧрд╛рдореА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрд┐рдд рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ (рдкрдВрдЪ .. рдЙрд╣ .. рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЕрдкрдбреЗрдЯреЗрдб рдРрдк рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рд░реВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдЦреБрдж рдХреА рдЧрд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдирд╡реАрдирддрдо рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрджреНрдпрддрди рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдЙрдореНрдореАрдж рдХрд░рдирд╛ рдЬрд▓реНрдж рд╣реА рдмрд╛рд╣рд░ рд╣реИред

рдЬрдм рддрдХ рдХреЛрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ examples/real-world рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рд╣реИред рдпрд╣ рдЕрднреА "рдирд╡реАрдирддрдо рдФрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛" рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

CellOcean picture CellOcean  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ilearnio picture ilearnio  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ms88privat picture ms88privat  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmitry-zaets picture dmitry-zaets  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ramakay picture ramakay  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ