调度动作触发,但 redux 存储不更新
dispatch action triggering, but redux store not updating
目前在我的 React-Redux 应用程序中,我想使用 React 将显示状态设置为 false 或 true。设置为 true 时,应用程序将初始化。 (有多个组件,因此使用 react/redux 执行此操作很有意义。)
但是,我当前的问题是,即使我使用 react redux 连接了我的应用程序,并且使用提供者连接了我的商店,但仍会调用分派操作,而不更新商店(我正在使用 redux 开发工具仔细检查,以及在应用程序测试中)。
我附上了我认为相关的代码,但是,整个代码库都可以作为专门为这个问题制作的分支 here。我在这方面花了很多时间(实际上是轻描淡写),任何贡献都将不胜感激。
组件相关代码
hideBlock(){
const{dispatch} = this.props;
dispatch(hideBlock);
}
return(
<div className = "works">
<button id="show-block" type="button" className="show-hide-button" onClick={this.showBlock}>show</button>
<button id="hide-block" type="button" className="show-hide-button" onClick={this.hideBlock}>Hide</button>
</div>
);
function mapStateToProps(state) {
const {environment} = state;
return{
environment
}
}
export default connect(mapStateToProps)(Form);
动作
import * as types from "../constants/ActionTypes";
export function showBlock(show) {
return {
type: types.SHOW,
show: true
};
}
export function hideBlock(hide) {
return {
type: types.HIDE,
show: false
};
}
减速器
import * as types from "../constants/ActionTypes";
const initialState = {
show: false
};
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
return Object.assign({}, state, {
type: types.HIDE
});
case types.SHOW:
return Object.assign({}, state, {
type: types.SHOW
});
default:
return state;
}
}
谢谢,再次感谢您的帮助。
看起来 state.show
是在 initialState 中设置的,但在 reducer 内部的任何情况下都没有修改过。该动作有 show: true
,但减速器从不使用它来更新状态。
这是一个简化的减速器,它根据操作的 show
字段更新 state.show
:
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
case types.SHOW:
return Object.assign({}, state, {
show: action.show
});
default:
return state;
}
}
或者,因为 action.show
和 action.type
具有相同的数据,您可以从操作中删除 show
并依赖于操作类型:
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
return Object.assign({}, state, {
show: false
});
case types.SHOW:
return Object.assign({}, state, {
show: true
});
default:
return state;
}
}
因此,我向一位同事寻求帮助,结果发现我将我的操作作为对象而不是函数返回。因此,例如,更改以下代码:
hideBlock(){
const{dispatch} = this.props;
dispatch(hideBlock);
}
至
hideBlock(){
const{dispatch} = this.props;
//change hideBlock to hideBlock()
dispatch(hideBlock());
}
问题已解决。谢谢安德鲁!
目前在我的 React-Redux 应用程序中,我想使用 React 将显示状态设置为 false 或 true。设置为 true 时,应用程序将初始化。 (有多个组件,因此使用 react/redux 执行此操作很有意义。)
但是,我当前的问题是,即使我使用 react redux 连接了我的应用程序,并且使用提供者连接了我的商店,但仍会调用分派操作,而不更新商店(我正在使用 redux 开发工具仔细检查,以及在应用程序测试中)。
我附上了我认为相关的代码,但是,整个代码库都可以作为专门为这个问题制作的分支 here。我在这方面花了很多时间(实际上是轻描淡写),任何贡献都将不胜感激。
组件相关代码
hideBlock(){
const{dispatch} = this.props;
dispatch(hideBlock);
}
return(
<div className = "works">
<button id="show-block" type="button" className="show-hide-button" onClick={this.showBlock}>show</button>
<button id="hide-block" type="button" className="show-hide-button" onClick={this.hideBlock}>Hide</button>
</div>
);
function mapStateToProps(state) {
const {environment} = state;
return{
environment
}
}
export default connect(mapStateToProps)(Form);
动作
import * as types from "../constants/ActionTypes";
export function showBlock(show) {
return {
type: types.SHOW,
show: true
};
}
export function hideBlock(hide) {
return {
type: types.HIDE,
show: false
};
}
减速器
import * as types from "../constants/ActionTypes";
const initialState = {
show: false
};
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
return Object.assign({}, state, {
type: types.HIDE
});
case types.SHOW:
return Object.assign({}, state, {
type: types.SHOW
});
default:
return state;
}
}
谢谢,再次感谢您的帮助。
看起来 state.show
是在 initialState 中设置的,但在 reducer 内部的任何情况下都没有修改过。该动作有 show: true
,但减速器从不使用它来更新状态。
这是一个简化的减速器,它根据操作的 show
字段更新 state.show
:
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
case types.SHOW:
return Object.assign({}, state, {
show: action.show
});
default:
return state;
}
}
或者,因为 action.show
和 action.type
具有相同的数据,您可以从操作中删除 show
并依赖于操作类型:
export default function environment(state = initialState, action) {
switch(action.type) {
case types.HIDE:
return Object.assign({}, state, {
show: false
});
case types.SHOW:
return Object.assign({}, state, {
show: true
});
default:
return state;
}
}
因此,我向一位同事寻求帮助,结果发现我将我的操作作为对象而不是函数返回。因此,例如,更改以下代码:
hideBlock(){
const{dispatch} = this.props;
dispatch(hideBlock);
}
至
hideBlock(){
const{dispatch} = this.props;
//change hideBlock to hideBlock()
dispatch(hideBlock());
}
问题已解决。谢谢安德鲁!