{
product_id: "223af-b4535-54e21-31233-12a122-b453d",
quantity: 2.
}
function fetchProductBySlug(slug) {
return async dispatch => {
dispatch({ type: FETCH_PRODUCT_BY_SLUG });
try {
const { data } = await axios.get(`/products/${slug}`);
dispatch({ type: FETCH_PRODUCT_BY_SLUG_SUCCEEDED, payload: data });
} catch (err) {
dispatch({ type: FETCH_PRODUCT_BY_SLUG_FAILED, payload: mapAxiosError(err) });
}
};
}
export default function product(state = initialState, action) {
switch(action.type) {
case FETCH_PRODUCT_BY_SLUG:
return {
...state,
isFetching: true,
error: null,
};
case FETCH_PRODUCT_BY_SLUG_SUCCEEDED:
return {
...state,
product: action.payload,
isFetching: false,
error: null,
};
case FETCH_PRODUCT_BY_SLUG_FAILED:
return {
...state,
isFetching: false,
error: action.payload,
};
default:
return state;
}
}
Почему dispatch не срабатывает?
setProductComments(/* ... */);
this.props.setProductComments(/* ... */);
this.props.dispatch(setProductComments(/* ... */));
const mapDispatchToProps = {
setProductComments,
};
Зачем в Web-приложении может понадобиться решение вроде Redux?
В плане так их надо передать в редюсер для ошибок, а в компоненте следить за изменением этого редюсера...
const initialState = {
isFetching: false,
token: null,
error: null,
};
function auth(initialState, action) {
switch(action.type) {
case LOGIN_REQUEST:
return {
...state,
isFetching: true,
error: null,
};
case LOGIN_SUCCEEDED:
return {
...state,
isFetching: false,
token: action.payload,
};
case LOGIN_FAILED:
return {
...state,
isFetching: false,
error: action.payload,
};
default:
return state;
}
}
Будет ли правильным делать запросы из компонента?
Ведь так при ошибке мы может её сразу добавить в стейт errors компонента и всё.
const mapStateToProps = state => ({
error: loginErrorSelector(state),
});
render() {
const { error } = this.props;
if (error) return <TryAgain error={error} action={login} />;
return ( /* ... */ );
}
this.props.history.push('/user');
<Route exact path="/" component={Form} />
<Route exact path="/" render={routeProps => <Form {...rotueProps} />} />
const state = createStore();
. Верните обратно.Как преобразовать ее в класс, чтобы добавить state с параметром загрузки, который потом можно было бы получать в других частях приложения?
export const getResourcesAction = () => async (dispatch, getState) => {
const { resources } = getState();
if (isEmpty(resources)) {
try {
dispatch({ type: LOAD_RESOURCES_REQUEST });
const res = await fetch('/api/resources/all', { credentials: 'include' });
const data = await res.json();
dispatch({
type: LOAD_RESOURCES_SUCCEEDED,
payload: {
resources: data,
},
});
} catch (error) {
dispatch({
type: LOAD_RESOURCES_FAILED,
payload: {
error,
},
});
}
}
};
const initialState = {
isFetching: false,
data: [],
error: null,
};
export default function resourcesState(state = initialState, action) {
switch (action.type) {
case LOAD_RESOURCES_REQUEST:
return {
...state,
isFetching: true,
error: null,
};
case LOAD_RESOURCES_SUCCEEDED:
return {
data: action.payload.resources,
isFetching: false,
};
case LOAD_RESOURCES_FAILED:
return {
...state,
isFetching: false,
error: action.payload.error,
};
default:
return state;
}
}
Но почему-то, при загрузке компонента Artobjects, первым из actions вызывается getArtObjects, а потом уже loadUser. Из-за этого, action getArtObjects не может получить данные о юзера из глобального стейта, тк. появляются они позже.
const store = configureStore();
store.dispatch(clientInit()); // тут
const Root = () => (
<Provider store={store}>
<Router>
<App />
</Router>
</Provider>
);
{isInitialDataFetching ? <Preloader /> : this.renderContent()}
const AuthRoute = ({ component: Component, render, isSignedIn, ...rest }) => (
<Route {...rest} render={props => {
if (!isSignedIn) return (
<Redirect to={{
pathname: "/signin",
state: { referrer: props.history.location.pathname }
}} />
);
if (render) return render({ ...props });
return <Component {...props} />;
}} />
);
const mapStateToProps = state => ({
isSignedIn: isSignedInSelector(state),
});
export default connect(mapStateToProps)(AuthRoute);
<AuthRoute path="/admin" component={Admin} />
<Switch>
{isSignedIn && <Route path="/admin" component={Admin} />}
<Route path="/partner/:name" component={Partner}/>
<Route component={() => <div>page not found</div>} />
</Switch>