Основываясь на разговоре с OP, этот код размещается в его редукторе, и, таким образом, приведенное ниже решение было обновлено, чтобы отразить рабочее решение, позволяя OP обновлять состояние на основе action.type
внутри его редуктора.
Внутри вашего редуктора вместо использования Object.assign
, а затем ничего с ним не делать, вы можете просто перевести его в состояние, которое вы возвращаете, используя деструктурирующее назначение
Смена ключа следующая:
let phase = '';
if (otherState1 < otherState2) phase = 'START';
return {
...state,
phase
}
Решение
const { createStore } = Redux;
const { connect, Provider } = ReactRedux;
// Create RootContainer of App
class RootContainer extends React.Component {
render () {
return (
<div>
<button onClick={this.props.onStarting}>Set Phase to STARTING</button>
<p>Phase: {this.props.phase}</p>
</div>
)
}
}
// Functions for ReactRedux.connect
const mapStateToProps = (state) => {
return {
phase: state.phase
}
}
const mapDispatchToProps = (dispatch) => {
return {
onStarting: () => {
dispatch({type: 'STARTING'})
}
}
}
// Connect React Component to Redux
const ConnRootContainer =
connect(mapStateToProps, mapDispatchToProps)
(RootContainer);
// Setup Initial State
const INITIAL_STATE = {
otherState1: 1,
otherState2: 2,
phase: 'NOT SET'
};
// Define Reducer
function myReducer(state = INITIAL_STATE, action) {
switch (action.type) {
case 'STARTING':
const { otherState1, otherState2 } = state;
let phase = '';
if (otherState1 < otherState2) phase = 'START';
return {
...state,
phase
}
}
return state
}
// Connect reducer to Redux
const store = createStore(myReducer);
// Pass store to ReactRedux.Provider
class App extends React.Component {
render () {
return (
<Provider store={store}>
<ConnRootContainer />
</Provider>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/6.0.0/react-redux.min.js"></script>
<div id="root"></div>
Я не совсем уверен, что Object.assign
делает для вас.В одной функции вы возвращаете объект, но в другой функции вы пытаетесь получить доступ к свойству из состояния.
Я бы посоветовал вам сохранить stage
в состоянии, чтобы вы могли получить к нему доступ.оттуда позже.Вот решение:
Примечание: Во второй функции вы пытаетесь получить доступ к state.phase
, даже если вы сказали, что хотите получить доступ к state.stage
Оригинальное решение
class App extends React.Component {
constructor(props){
super(props);
this.state = {
otherState1: 1,
otherState2: 2
}
this.getState = this.getState.bind(this);
this.doSomething = this.doSomething.bind(this);
}
getState() {
const { otherState1, otherState2 } = this.state;
if (otherState1 < otherState2) {
this.setState({stage : "START"})
}
}
doSomething(data, otherData) {
const { stage } = this.state;
if (stage === "START"){
console.log('phase is START');
}
if (stage === "STOP"){
console.log('phase is STOP');
}
}
render() {
return (
<div>
<button onClick={this.getState}>
Get State
</button>
<p>{JSON.stringify(this.state)}</p>
<button onClick={this.doSomething}>
Do Something
</button>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>