Делай на лот туда-сюда, и, тестируя, я столкнулся со многими стенами, пытаясь выяснить это, но в конце концов понял. Вот что вам нужно сделать.
Примечание. Это не считается частью общедоступного API React Redux и может выйти из строя без уведомления. Мы признаем, что у сообщества есть случаи использования, где это необходимо, и постараемся сделать так, чтобы пользователи могли создавать дополнительные функции поверх React Redux, но наше конкретное использование контекста считается деталью реализации. Если у вас есть дополнительные варианты использования, которые недостаточно охвачены текущими API, пожалуйста, подайте проблему, чтобы обсудить возможные улучшения API. - https://react -redux.js.org / using-реагировать-редуцировать / обращаться к магазину # using-реагировать-reduxcontext-напрямую
Убедитесь, что реагирует Пакет 16.8.3
или позже. Убедитесь, что ваш пакет реаги-редукс 7.1
или выше. Вам нужны эти версии из-за нового способа (в React 16.8.3) React передает Context дочерним компонентам. Мы заботимся о контексте, потому что этот новый API React Context работает так, как работает ReactReduxContext .
ReactReduxContext - это волшебный соус, который нам нужен для того, чтобыполучить текущее состояние магазина в компоненте. Обратите внимание на изменения в нашем компоненте ниже.
import React, { Component } from "react";
import { bindActionCreators } from "redux";
import { connect, ReactReduxContext } from "react-redux"; // CHANGED!
import * as AActions from "../aactions";
import * as BActions from "../bactions";
import * as CActions from "../cactions";
class MyComponent extends Component<Props>{
constructor(props){
super(props);
this.func = this.func.bind(this);
};
func(store){ // CHANGED!
// Add item to A
this.props.addAItem("value");
// Get id of newly added item in A
let addedA = store.getState().A.find(a => a.name === "value"); // CHANGED!
// Insert new items in B with the id of A
this.props.addBItem(addedA.id, "valueB");
// etc...
}
// CHANGED!
render(){
<ReactReduxContext.Consumer>
{({store}) => {
return <div onClick={() => this.func(store)}>click me</div>
}}
</ReactReduxContext.Consumer>
}
}
function mapStateToProps(state, props){
return {
A: state.A,
B: state.B,
C: state.C
};
}
function mapDispatchToProps(dispatch){
return bindActionCreators({...AActions, ...BActions, ...CActions}, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
Магия store.getState()
, которая возвращает обновленное хранилище Redux.
Хочу отметить, что я много смотрелна redux-thunk
, но этот подход не в конечном итоге дает то, что мне нужно. Основной проблемой является использование bindActionCreators в моем компоненте. Поскольку я использую bindActionCreators , любое вызываемое мной действие ожидает пустой объект, который отправляется в хранилище Redux.
Я пытался разными способами попытаться вернуть обновленное состояние Redux в действии, но, поскольку я использовал bindActionCreators, я не смог вернуть значение состояния Redux из данного действия. Единственный способ получить обновленное состояние хранилища Redux без , полагаясь на сам компонент, который будет обновляться / перерисовываться, - это использовать метод, который я описал выше.