реагировать на собственное обновление состояния редукса mapStateToProps, но не перерисовывать компонент презентатора - PullRequest
0 голосов
/ 30 ноября 2018

Возникла проблема, когда состояние в mapDispatchToProps, по-видимому, обновляется, однако компонент не выполняет повторную визуализацию, чтобы отразить эти изменения, даже если ...

  • компонент презентатора правильно подключен кдействия избыточности (может успешно инициализировать реквизиты через mapDispatchToProps и вызывать функции mapDispatchToProps, в любом случае)
  • редуктор редуктора, который обрабатывает вызванное действие избыточности, постоянно обновляет состояние (делаяя сомневаюсь, что это проблема (https://github.com/reduxjs/redux/issues/2190#issuecomment-271109542)), т.е. код редуктора выглядит так:
const initialState = {
    session: {
        ...
        toUpdate: {success: false, processing: false, message: ''},
        ...
    },
    someOtherStateSections: {...},
    ...
}

const sessionReducer = (state=initialState.session, action) => {
    switch (action.type) {
        ...
        case Types.ACTION_TO_HANDLE:
                console.log(`REDUCER: ACTION_TO_HANDLE: check that state is being updating with intended values:\n${JSON.stringify(action, null, 2)}`)
                return Object.assign({}, state, {toUpdate: {
                    success: action.success,
                    processing: action.processing,
                    message: action.message,
                }})
        ...
    }
}

const rootReducer = combineReducers({
    session: sessionReducer,
    ...
})

export default rootReducer;
  • После обновления с редуктора операторы логирования показывают, что state аргумент в функции mapStateToProps обновляется, чтобы отразить эти изменения. Фрагмент кода выглядит как
const mapStateToProps = (state, ownProps) => {
    console.log(`PickupLocationAnchorFormContainer: mapStateToProps: ${JSON.stringify(state.session.pickupLocationAnchorChangeStatus, null, 2)}`)
    return {
        toUpdate: state.session.toUpdate,
        ownProps: ownProps,
    }
}

const mapDispatchToProps = (dispatch,) => {
  return {
    someThunk: (some, inputs) => {
      dispatch(someThunk(some, inputs))
    },
  }
}

const MyComponentContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(MyComponent)

export default MyComponentContainer

, но MyComponent, похоже, не обновляет свой this.props.toUpdate для обработкиобновленные значения хранилища редуксов.

  • И обновленные значения состояния отличаются от старых значений (в этом примере toUpdate.success устанавливается от false до true), из-за чего я сомневаюсь, чтоппроблема связана с мелкой проверкой равенства (см. https://redux.js.org/faq/reactredux#why-isnt-my-component-re-rendering-or-my-mapstatetoprops-running) (хотя до сих пор не удалось устранить ошибку, так что я знаю, верно?)

Любые дальнейшие предложения по отладкеили рекомендованные решения будут оценены.

1 Ответ

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

Попробуйте вместо этого написать в редукторе:

const sessionReducer = (state=initialState, action) => {
    switch (action.type) {
        ...
        case Types.ACTION_TO_HANDLE:
                return Object.assign({}, state, {
                    ...state,
                    session: {
    ...state.session,
   toUpdate: {
                    success: action.success,
                    processing: action.processing,
                    message: action.message,
                },
           }
       })

    }
}
...