рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреИрдЯрд░реНрди рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВ
рдореИрдВ рдПрдХ рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдРрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдбрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдЕрдм рддрдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореБрдЭреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреГрд╖реНрда рд▓реЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рд╕реНрдЯреЛрд░ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ (рд╕рд░реНрд╡рд░ рдкрд░) рдХреИрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ dispatch(userActions.load())
рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕реНрдЯреЛрд░ рдХреЛ рдирдпрд╛ рд░рд╛рдЬреНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛рдиреА return { ...state, loading: true };
), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ред dispatch()
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдкрд╛рд╕ рдХреА рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП...
dispatch(someAsyncAction, successAction, failureAction) => Promise
...рдЬрд╣рд╛рдВ рд╡рд╛рджрд╛ рддрдм рддрдХ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдиреНрдп рджреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рднреЗрдЬ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ред
рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдХреНрдпрд╛ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдзрд╛рд░ рд╕реЗ рджреВрд░ рд╣реВрдВ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ?
рдзрдиреНрдпрд╡рд╛рджред
рдзрдиреНрдпрд╡рд╛рдж!
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд▓реЛрдбрд┐рдВрдЧ рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
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' })
);
};
}
рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
рдпрд╣ рдЖрдкрдХреЛ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦрдиреЗ рджреЗрдЧрд╛
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
s рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЯреНрд░реЗрдбрдСрдлрд╝ рдкрд╕рдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ 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 рдореИрдВ
рдпрд╣ рд╕рд┐рд░реНрдл рдЫрджреНрдо рдХреЛрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдЪрд┐рдкрдХрд╛рдиреЗ рди рдЬрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд┐рд╕рдХрд╛ рдПрдкреАрдЖрдИ рд░реЗрдбрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ) рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
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));
});
});
});
рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХреБрдЫ рд╕рд╛рдл рд╣реЛрддрд╛ рд╣реИ?
@ рд╕рдмрд╕реЗ
рд╕реНрд▓реИрдХ рдореЗрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:
рдореЗрд░реЗ рдкрд╛рд╕ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИ
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}));
};
}
рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╕реНрдЯрдо рд╡рд╛рджрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
@erikras рдЖрдкрдХреА рдЖрдЦрд┐рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк initialState.components
(Router.run рдХреЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ 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 рдпрд╣ рд╕рдЪ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ _really_ рдРрд╕реЗ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк React.renderToString()
рдПрдХ рдмрд╛рд░ (рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, componentWillMount()
рдореЗрдВ рдЕрдкрдиреА рд╕рднреА рд▓реЛрдбрд┐рдВрдЧ рдХрд░реЗрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╛рджреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдВред react-router
рд╕рдорд░реНрдерд┐рдд рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЕрдкрдиреЗ рдШрд░реЗрд▓реВ рд░реВрдЯрд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдпрд╣реА рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рд▓реЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдорд╛рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд▓рдХреНрд╖рдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдорд╛рд░реНрдЧ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
@erikras
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реЗрдкреЛ рд╣реИ?
@transedward рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рд╛рдордЧреНрд░реА рдЕрдм рддрдХ рдЬрд┐рд╕ рддрд░реАрдХреЗ рд╕реЗ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддреГрдд рдХреА рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдкрд░рд┐рдкрдХреНрд╡ рд╣реИред рдорд╛рдлрд╝ рдХрд░рдирд╛ред
рдЙрдиреНрдирдд рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ +1
рдореБрдЭреЗ рдкреНрдпрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рдЬрд╛ рд░рд╣рд╛ рд╣реИ!
@transedward рдпрд╣рд╛рдБ рдПрдХ рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмреНрд▓реАрдбрд┐рдВрдЧ рдПрдЬ рдЯреЗрдХ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред https://github.com/erikras/react-redux-universal-hot-example/
@erikras рдпрд╣ рдХрдорд╛рд▓ рд╣реИ! рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рд░реАрдбрдореЗ рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╣реЙрдЯ рд▓реЛрдбрд░ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ "рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдзрдиреНрдпрд╡рд╛рдж! рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдПред
@erikras рдЧреНрд░реЗрдЯ - рдзрдиреНрдпрд╡рд╛рдж!
рдмрд╕ рдПрдХ рдиреЛрдЯ - рдЗрд╕ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░- рдореИрдВрдиреЗ рд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдмрдирд╛рдпрд╛: https://github.com/pburtchaell/redux-promise-middlewareред
@pburtchaell @acdlite рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реИред https://github.com/acdlite/redux-promise
рдЗрд╕ рдкрд░ рджреЛ рд╡рд┐рдЪрд╛рд░:
рдлрд┐рд░, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдмрд╕ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рд╡рд╛рджреЗ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдкрд╛рд░рд┐рдд рд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдХреЛрдИ рд▓рдВрдмрд┐рдд рд╡рд╛рджреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рд╕рдВрджреЗрд╢ 3 рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рд╕рдВрджреЗрд╢ рдХрдВрдЯреЗрдирд░ <Message id={3}>
рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдВрджреЗрд╢ рдЪрдпрдирдХрд░реНрддрд╛ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ state.msgs[3]
рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рдВрджреЗрд╢ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рднреЗрдЬреЗрдВред
рддреЛ рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ рдФрд░ рдШрдЯрдХ рдЕрдкрдиреЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рддрдГ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡реЗ рдХрдм рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ "рд╕реНрдЯреЛрд░ рдпрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рди рдбрд╛рд▓реЗрдВ"ред рдпрд╣ рдЙрди рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ (рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп рдпрд╛рддреНрд░рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _very_ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдлрд┐рд░, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдкреГрд╖реНрда рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдмрд╕ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рд╡рд╛рджреЗ рдкреВрд░реЗ рд╣реЛ рдЧрдП рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдкрд╛рд░рд┐рдд рд╡рд╛рджреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдХреЛрдИ рд▓рдВрдмрд┐рдд рд╡рд╛рджреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрдд рдореЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рджреЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐, рдкреНрд░реЗрд╖рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХрдЪреНрдЪреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрдХреНрдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ "рдПрдХрддреНрд░рд┐рдд" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЪреАрдЬ рдЬреЛ рдореИрдВ рдЕрдХреНрд╕рд░ рдХрд░рддрд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╛рджреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рдЕрдкрдиреЗ рдЖрд╕рдкрд╛рд╕ рд░рдЦрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЬрдм рдЙрд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЕрдиреБрд░реЛрдз рдЖрдП, рддреЛ рдореИрдВ рдмрд╕ рдЙрд╕реА рд╡рд╛рджреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреВрдВ, рдЬрд┐рд╕рд╕реЗ рдмрд╣рд╕ рд╣реЛред рдореИрдВ рдлрд┐рд░ рд╡рд╛рджрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреИрд╢рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдРрдкреНрд╕ рдореЗрдВ Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ Redux рдореЗрдВ рдЙрди рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рджрд╛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рдореНрдоред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @wmertens рдХреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХреЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХрд╛рдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдХреЙрд▓реЛрдВ рд╕реЗ рдмрдЪрдирд╛ (рдпрджрд┐ рдХреБрдЫ рд▓рдВрдмрд┐рдд рд╣реИ рддреЛ рдХреБрдЫ рднреА рди рдХрд░реЗрдВ) рдПрдХ рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реЗ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдХреНрдпрд╛ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдШрдЯрдХ) рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ .. рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ @connect рдПрдиреЛрдЯреЗрд╢рди рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рд▓рдкреЗрдЯрддрд╛ рд╣реИ?
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рд╕реЗ рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ
рдХреНрдпреЛрдВ? рдпрджрд┐ рдЖрдк рдердВрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
function doSomething() {
return { type: 'SOMETHING' };
}
function maybeDoSomething() {
return function (dispatch, getState) {
if (getState().isFetching) {
return;
}
dispatch(doSomething());
};
}
store.dispatch(maybeDoSomething());
рдЬреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ!
рдореИрдВрдиреЗ рдПрдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ) рдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдПрдХ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рдерд╛ ^ ^ рдЪреВрдВрдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЙрд▓рд░ рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рд╛рдБ рдХреВрд▓ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)
рдзрдиреНрдпрд╡рд╛рдж @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' })
);
};
}
рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
рдпрд╣ рдЖрдкрдХреЛ async рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЬреИрд╕реЗ рд▓рд┐рдЦрдиреЗ рджреЗрдЧрд╛
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' }
рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ 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
рджреЛрдиреЛрдВ рдареАрдХ рд╣реИрдВред рдЪреБрдиреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдердВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдкреИрдЯрд░реНрди рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗрдВред рдЖрдк рдЗрдиреНрд╣реЗрдВ рдорд┐рдХреНрд╕ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ (рд▓реЛрдбрд┐рдВрдЧ, рд╕рдлрд▓, рдЕрд╕рдлрд▓) рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╢рдирд╕реНрдЯреЛрд░ рдмрдирд╛рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ Redux/Flux рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред
@gabrielgiussi рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/acdlite/redux-promise рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рджреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рд╛рдЬреНрдп рдХреЛ рд╣рд░ рд╕рдордп рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
@wmertens рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд░реЗрдкреЛ рдХреЛ рджреЗрдЦ рд▓реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд░рд╛рдЬреНрдп рдХреНрд░рдордмрджреНрдз рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдБ?
@gabrielgiussi рдореИрдВрдиреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдк рдереЗ
рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рджреЗ рдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛
рдореБрдЭреЗ рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реЛрдо, 10 рдЕрдЧрд╕реНрдд, 2015, рдкрд░ 19:15 gabrielgiussi [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:
@wmertens https://github.com/wmertens рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЗ рд▓реВрдБрдЧрд╛
рд░реЗрдкреЛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд░рд╛рдЬреНрдп рдХреНрд░рдордмрджреНрдз рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрд╛ рдЖрдк
рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдБ?-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/gaearon/redux/issues/99#issuecomment -129531103ред
рд╡рд╛рдЙрдЯред
(рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛, рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХрд╛ рдмрд╣рд╛рдирд╛)
рдЕрд╕рд▓ рдореЗрдВ, рд╕реНрдЯреЛрд░ рдореЗрдВ рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд░рдЦреЗ рд╣реИрдВ, рд╡реЗ рд╕рд┐рд░реНрдл рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдЖрдИрдбреА, рд░рд╛рдЬреНрдп, рдкреЗрд▓реЛрдб) рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдФрд░ рдПрдХ рдПрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╡рд╛рджреЗ рдирд╣реАрдВ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рд╢рд╛рдпрдж рдХрд╣реАрдВ рдФрд░ рдХреБрдЫ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБ, рдЬреЗрдИред рдзрдиреНрдпрд╡рд╛рдж @wmertensред
@gabrielgiussi
рдФрд░ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рдФрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рд░рд╛рдЬреНрдп рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИ, рди рдбрд╛рд▓реЗрдВред
рдорд╛рдлрд╝ рдХрд░рдирд╛ред рдореИрдВрдиреЗ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА
рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЗрддрд╛ рд╣реИ
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЛрд░ рдореЗрдВ рдЬреЛ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдПрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ (рдирд╛рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдерд╛):
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 рд▓рд┐рдЦрд╛ рд╣реИ,
рдХреНрдпрд╛ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░реЗрдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реИ? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдПрдХ рдирдпрд╛ рдкреНрд░рд╢реНрди рд╣реИ, рддреЛ рдмрд╕ рд░рд┐рдПрдХреНрдЯ/рдлреНрд▓рдХреНрд╕ (рд░реЗрдбрдХреНрд╕) рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдЕрднреА рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ https://github.com/happypoulp/redux-tutorial
@ рдмреИрдВрдбрд░рд╕рди5144
рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ-рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред
рдХреБрдЫ рдРрд╕рд╛ рд╣реА https://github.com/pburtchaell/redux-promise-middleware рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдЖ рдерд╛
рдЗрд╕ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдПрдХ рд╕реНрдЯреЛрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЪреБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ -
рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛/рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЛрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛?
рдХреНрдпрд╛ рдЖрдк рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╣рд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рдирдпрд╛ рд╕реНрдЯреЛрд░ рдмрдирд╛рдПрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рдореИрдВ рд╡рд╣ рдХрд░реВрдБрдЧрд╛
рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рдж...
рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рднреЛрд▓рд╛ рд╣реИ? (рдРрд╕рд╛ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ)
// 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 рдореИрдВ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ redux рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдШрдЯрдХ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рддрдм рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рд░рдЧрд░ рд░рд╣рд╛? рдзрдиреНрдпрд╡рд╛рдж
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ "рдШрдЯрдХрдбрд┐рдбрдорд╛рдЙрдВрдЯ" рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
@ ms88privat рдореБрдЭреЗ рдЕрднреА рддрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ, рди рд╣реА рдЗрд╕рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдВрдиреЗ рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЦреЛрд▓рд╛ рд╣реИ (рдиреЗрд╕реНрдЯреЗрдб рд╡рд╛рджреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг)ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред
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 рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреНрдпрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рддреАрди рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХ рдорд┐рд▓реЗ:
рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╛рд╕ "рдШрдЯрдХрдбрд┐рдбрдорд╛рдЙрдВрдЯ" рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВ (рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрдирд╛)ред
рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реЗрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди URL рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реЗ рдШрдЯрдХ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдорд╛рдЙрдВрдЯ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред
рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЖрдкрдХрд╛ match
рдлрд╝рдВрдХреНрд╢рди рдФрд░ renderProps
рд╕рднреА рддреАрди рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рднреА рд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдлрд╝реЗрдЪрд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬреЛ рддрдм рдореБрдЭреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди?
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЖрдкрдХреЗ match function
рд╕рдВрджрд░реНрдн рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред
@ ms88privat renderProps.components
рд░рд╛рдЙрдЯрд░ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдпрд╣ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИред @chemoish рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдк рдЧрд╣рд░реЗ рдШрдЯрдХреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@DominicTobias thx, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдХреНрдпрд╛ рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?
рд╢рд╛рдпрдж рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ? https://github.com/gaearon/react-side-effect
рдиреЗрд╕реНрдЯреЗрдб рддрддреНрд╡реЛрдВ рд╕реЗ рд╕рднреА рдореЗрдЯрд╛ рдЯреИрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд: https://github.com/nfl/react-helmet
рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдЫрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрд╕рд┐рдВрдХ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЛ рднрд░рдиреЗ рдХреА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИред
рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ @erikras рдиреЗ рдЕрдкрдиреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ redux-async-connect рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛?
@vtambourine рдореИрдВ https://github.com/markdalgleish/reial рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рд╣реИ
рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдбреЗрдЯрд╛
n . рдкрд░ рдкреБрдирдГ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдХреЗ рдмрд╛рдж рджреВрд╕рд░реА рдмрд╛рд░ рд╣реБрдХ рд▓рд╛рдирд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛
рдЧреНрд░рд╛рд╣рдХред
╤В, резрео рдордИ реирежрезрем рдХреЛред 22:54 рдмрдЬреЗ, рд╢реЙрди рдореИрдереЗрд╕рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:
@vtambourine https://github.com/vtambourine рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ
https://github.com/markdalgleish/reial рдЬреЛ рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рд╣реИ-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ 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 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдПрдкреАрдЖрдИ рд╣реИ, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ
@gaearon рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде
https://github.com/peter-mouland/react-lego-2016#redux -with-promise-middleware
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдХреИрд╕реЗ рдХрд░реЗрдВ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА