Таким образом, для этого требуется очень простое введение в поток Redux с «побочными эффектами».
Поток Redux
- [View] Ваш вид реагирует по-разному.
- [Действия] Мы создаем абстракцию над этими реакциями, называемой «действиями».
- [Диспетчер] Эти действия отправляются в магазин.
- [Редуктор] В магазинеу нас есть логика, написанная на «редукторах», которая просматривает действия и выполняет манипуляции с хранилищем для обновления состояния хранилища.
- [State] Это состояние загружается в дерево состояний реакции.
Определение оповещения!В Redux такие вещи, как вызовы API, называются побочными эффектами.Это потому, что вы делаете что-то вне типичного однонаправленного потока данных.
Надеюсь, вы поняли этот поток.Я особенно обеспокоен конкретной частью, в которой вы, кажется, запутались.Итак, в вашем коде вы пытались это сделать.
then(response => {
return dispatch(getAddress());
})
То, что ваш код пытается сделать здесь, это то, что он пытается «устранить» побочный эффект.Это неправильно!
Диспетчеризация - это почти всегда простой старый объект JS, который можно сериализировать.Как правило, у вас будет стереотипная структура, как это.Что вы, кажется, имеете в своем другом вызове get get.
{
type: 'GET_ADDRESS_REQUEST_SUCCESS',
payload: {}
}
Таким образом, правильный подход к вашей задаче такой:Думайте о таких действиях, как испускание сигналов, когда происходят разные вещи.
export const login = (value, history) => dispatch => {
Axios.post('/api/users/login', value)
.then(response => {
//Send out a success signal
dispatch({
type: 'loginSuccess',
payload: response.data
});
//Now that I have logged in successfully I can call for my address
//This is simply how you call an action within an action!
getAddress();
}).catch(error => {
//login failed signal
dispatch({
type: 'loginFailed',
payload: response
}); // I am calling like this
});
}
export const getAddress = () => dispatch => {
Axios.get('/api/address')
.then(response => {
//Get address success signal
dispatch({
type: 'getAddressSuccess',
payload: response.data
});
}).catch(function (error) {
//Get addresses failed signal
dispatch({
type: 'getAddressFailed',
payload: error
});
});
}
Следующая важная часть - это редуктор, который вы здесь не включили!Если действия излучают сигналы, думайте о редукторах как о приемнике, который получает и обрабатывает этот сигнал.Редуктор обновит существующее состояние в зависимости от развернутого действия.
export default function appReducer(state, action) {
switch (action.type) {
case 'getAddressSuccess': //Waiting on the signal!
return Object.assign({},state,{address : action.payload}
//Set the proper address based on your payload from the api call
default:
return state
}
}
Вы также должны правильно настроить конфигурацию Thunk-редукса, чтобы это полностью работало.Ура!
============ РЕДАКТИРОВАТЬ =============
Так что после проверкиcodebase, вы использовали комбинированный редуктор для объединения нескольких редукторов.
import { combineReducers } from 'redux';
import authReducer from './authReducer';
import addressReducer from './addressReducer';
const rootReducer = combineReducers({
authReducer,
addressReducer
});
export default rootReducer;
Итак, в mapsStateToProps состояние вашего магазина будет выглядеть следующим образом
{
authReducer: {
// state managed by the authReducer
},
addressReducer: {
address: 'Test Streat, London'
}
}
Поэтому измените ваш mapStateToProps так, чтобы он выглядел следующим образом
const mapStateToProps = state => ({
addresses: state.addressReducer.address
});
export default connect(mapStateToProps)(Dashboard);