Как получить доступ к состоянию изнутри mapDispatchToProps - PullRequest
0 голосов
/ 05 ноября 2018

Необходимо отправить действие на основе реквизита компонента состояния или представления.

const mapDispatchToProps = (dispatch) => {
  return {
    onClick: () => {
       if (state.someValue || this.props.someValue){
          dispatch({type: DO_SOMETHING})   
       }
    }

  }
} 

и предполагается, что это действие будет перехвачено redux-saga для выполнения некоторых задач удаленной выборки, поэтому я не могу переместить это условие в редуктор, например:

const reducer = (state, action) => {
    switch (action.type){
       case DO_SOMETHING:
          if(state.someValue){
             return {...state, //do something}
             //I need to fetch some api here, so this won't be a valid way 
          }
    }
}

Может ли отправление изнутри редуктора? так что новая отправленная отправка может быть перехвачена сагой redux.

1 Ответ

0 голосов
/ 06 ноября 2018

Отправление не может быть запущено от редуктора

Если компонент должен выполнить проверку состояния, тогда используйте третий параметр connect, он же mergeProps :

const mapStateToProps = state => ({
    someValue: // ...,
    // ...
})

const mapDispatchToProps = dispatch => {
  return {
    onClick: () => dispatch({type: DO_SOMETHING}),
    // ...
  }
}

const mergeProps = (stateProps, dispatchProps, ownProps) => {
    const onClick = () => {
        if (stateProps.someValue) {
            dispatchProps.onClick();
        }
    }

    return ({
        ...stateProps,
        ...dispatchProps,
        onClick
    })
}

export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(MyComponent)

Если проверка состояния не обязательно должна быть частью компонента, проверьте состояние в саге:

компонент:

const mapDispatchToProps = dispatch => {
  return {
    onClick: () => dispatch({type: MAYBE_DO_SOMETHING}),
    // ...
  }
}

сага:

function* onMaybeDoSomething(action) {
    const someValue = yield select(getSomeValue)

    if (someValue) {
        yield put({ type: DO_SOMETHING })
    }
}

export default function* () {
    takeLatest(MAYBE_DO_SOMETHING, onMaybeDoSomething)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...