Я думаю, вам стоит взглянуть на еще документацию , редуктор похож на ... кусок вашего магазина, содержащий данные и изменяющий эти данные в зависимости от ваших действий.скажем, у вас есть только один редуктор, ваши данные о состоянии будут жить только внутри него (state.reducer).В противном случае он будет распространен на все созданные вами редукторы (при использовании ОбъединитьReducers )Этот слегка измененный пример взят из документации по редукционным редукторам:
const initialState = {
todo: null,
showTodo: false,
}
function todoAppReducer(state = initialState, action) { // state is equal to initialState if null
switch (action.type) { // switch is like if/else if, up to you which to use
case SET_MY_TODO:
return Object.assign({}, state, { // Here they use object assign,
todo: action.todo, // but you can use the new spread operators if you want.
}) // the next case is an example of this.
case SHOW_MY_TODO:
return {
...state, // this will make a new object, containing all of what
showTodo: true, // state contained with the exeption of setting showTodo
} // to true
case HIDE_MY_TODO:
return {
todo: state.todo,
showTodo: false, // this is what both of those methods do in an explicit way
}
case CLEAR_MY_TODO:
return Object.assign({}, state, {
todo: null,
})
default:
return state
}
}
их примеры используют переключатель / регистр, это больше, чем я знаю, но когда дело доходит до того, как изменить состояние, они нена самом деле не вызывайте setState (), им нужно только вернуть объект состояния NEW для этого конкретного редуктора (в вашем случае это называется редуктор) на основе того, что такое action.type и action.xxx (потенциальные параметры).В вашем коде вам нужно только вернуть новое состояние!
// Here I recommend you use constants for your action types,
// ex: export const TIMEOUT = 'TIMEOUT'; in an actionsTypes.js file for example
// That way if you modify ^^^ it will propagate to all files everywhere,
function reducer(state, action) {
if(action.type === 'timeOut'){ // using what I showed in the
loggedIn : false, // example, you need
logoutMessage : 'Your session has timed out',// to return objects for each
errorOpen : true, // if/else if that define the
}); // NEW state for this reducer!
}else if(action.type === 'error'){
this.setState({
loggedIn : false,
logoutMessage : 'An error has occured',
errorOpen : true,
});
}else if(action.type === 'logout'){
this.setState({ loggedIn : false });
}
}
Затем, используя response-redux , вы подключаете свой компонент React к своему магазину (то, что содержит ваше состояние),И это дает вам доступ ко всему дереву состояний (используя mapStateToProps ) и доступ к вашим действиям (чтобы их можно было вызывать по реакции) с помощью mapDispatchToProps !
Это мой первый ответ, надеюсь, это не слишком грязно!Извините!