2016-05-10 4 views
2

У меня возникли проблемы, обертывая вокруг меня голову. В принципе, у меня есть компонент, который тянет isFetching булево из состоянияРеагент Контейнер - состояние доступа от любого редуктора

function mapStateToProps(state){ 
    const {errorMessage,isFetching} = state.signUp 
    const {isAuthenticated,username} = state.login; 
    return { 
    isAuthenticated, 
    errorMessage, 
    isFetching, 
    username 
    } 
} 

У меня есть ниже восстановителей

export const signUp = (state={},action) => { 
    switch(action.type){ 
    case SIGNUP_REQUEST: 
     return Object.assign({},state,{ 
     isFetching: true 
     }) 
    case SIGNUP_FAILURE: 
     return Object.assign({},state,{ 
     isFetching:false, 
     // isAuthenticated: false, 
     errorMessage: action.message 
     }) 
    default: 
     return state 
    } 
} 

export const login = (state={isAuthenticated:false},action) => { 
    switch(action.type){ 
    case LOGIN_REQUEST: 
     return Object.assign({},state,{ 
     isFetching: true, 
     isAuthenticated: false 
     }) 
    case LOGIN_SUCCESS: 
     return Object.assign({},state,{ 
     isFetching:false, 
     isAuthenticated:true, 
     username: action.username 
     }) 
    case LOGIN_FAILURE: 
     return Object.assign({},state,{ 
     isFetching: false, 
     isAuthenticated: false, 
     errorMessage: action.message 
     }) 
    default: 
     return state 
    } 
} 

когда я направить loginRequest - редуктор поворачивает isFetching к истине. но компонент все еще не обновляется, потому что он смотрит на переменную isFetching только из signUp Reducer.

Есть ли способ, которым я могу видеть компонент для обоих редукторов для переменной isFetching?

+0

Предполагая, что вы использовали combineReducers, то 'state' что ваш' mapStateToProps' вызывается это комбинированное состояние, так да, ваш компонент может легко посмотреть состояние 'isLoading' в обоих редукторах. – aarosil

+0

не означает, что состояние имеет два значения isFetching? один для регистрации и для входа? Я хотел бы знать, могу ли я иметь глобальную переменную isFetching, которая возвращает true при отправке запроса signUp или loginRequest. – Kannaj

+0

'state' будет иметь два объекта:' signUp' и 'login', которые оба будут иметь' isFetching' boolean. Если вы хотите избежать этого, я бы просто сохранил все в одном редукторе и, вероятно, назвал новый редуктор «аутентификацией». Кроме того, вы можете иметь простую логику в 'mapStateToProps', например' const isFetching = signUp.isFetching || login.isFetching' и передать его. – Kujira

ответ

1

Есть несколько вариантов:


Создание третьей (загрузка состояния) редуктора

Создайте другой редуктор, который имеет только isFetching в этом состоянии, и слушать одни и те же события.

export const loading = (state={}, action) => { 
    switch(action.type) { 
    case SIGNUP_REQUEST: 
    case LOGIN_REQUEST: 
     return Object.assign({},state,{ 
     isFetching: true 
     }) 
    case SIGNUP_SUCCESS: 
    case SIGNUP_FAILURE: 
    case LOGIN_SUCCESS: 
    case LOGIN_FAILURE: 
     return Object.assign({},state,{ 
     isFetching: false 
     }) 
    default: 
     return state 
    } 
} 

Если есть шанс, эти два запроса может перекрываться, то вы, вероятно, следует иметь независимые переменные isLoading и просто использовать ||.


Проверьте оба isFetching переменные в представлении

{signup.isFetching || login.isFetching} 

Это хорошо, если запросы могут перекрываться.


Положите все это в одном редукторе

не так хорошо ..

+0

пошел с {signup.isFetching || login.isFetching} – Kannaj

Смежные вопросы