【发布时间】:2021-11-28 20:10:54
【问题描述】:
我找不到页面加载时我的redux状态没有被调度的原因,即使组件挂载时有调度事件
这是我的问题的一个基本示例:
export const SET_SITE_NAME = "SET_SITE_NAME";
动作:
import {SET_SITE_NAME} from "./AppBarTypes";
export const setSiteName = (state) => dispatch => {
dispatch({
type: SET_SITE_NAME,
payload: state
})
}
减速机:
import {SET_SITE_NAME} from "./AppBarTypes";
const initialState = {
state: "Dashboard"
}
export const appBarReducer = (state = initialState, action) => {
switch(action.type) {
case SET_SITE_NAME:
return {
...state,
state: action.payload
};
default:
return state;
}
}
基本用法:
function ProjectsList(props) {
useEffect(() => {
props.setSiteName("Projects");
}, []);
return (
<Main open={props.drawer.state}>
</Main>
);
}
ProjectsList.propTypes = {
setSiteName: PropTypes.func.isRequired
};
const mapStateToProps = state => ({
projects: state.projects,
drawer: state.drawer
});
export default connect(mapStateToProps, {
getProjects,
setSiteName
})(withRouter(ProjectsList));
根据我能够调试的情况,setSiteName 函数运行并且它始终接收正确的状态。 另外,如果我导航到站点上的其他组件并返回到该组件,它会完美地加载状态,因此我认为实现是正确的。
编辑
我创建了一个可以追溯问题的工作示例。 https://stackblitz.com/edit/react-sf1fmj?file=src%2FApp.js
问题与useMediaQuery 有关。正如您在示例中看到的那样,如果您取消注释该部分,将显示默认的 redux 状态“仪表板”而不是设置的“项目”状态。
虽然我不知道为什么会导致这个问题以及如何解决它。正如你所看到的,在这个例子中我什至没有使用那个值,只是查询它......
【问题讨论】:
-
你能在stackblitz.com 上创建一个最小的工作示例吗?如果可能的话。这对跑步和回答很有帮助。
-
我尝试过重新创建相同的应用程序,但它甚至不会从这里开始:stackblitz.com/edit/react-ix62ac?file=src/Demo.js 虽然您可以清楚地看到状态设置为减速器状态
-
好吧,我已经解决了 stackblitz.io 上的问题,并且它在那里完美地工作......虽然在我的项目中它要复杂得多,所以我不知道什么会导致这样的副作用.
-
我找到了错误,但我不知道为什么会这样:stackblitz.com/edit/react-sf1fmj?file=src%2FApp.js 如果我使用
useMediaQuery来检查暗模式,您可以在示例中看到返回“Hello Dashboard” (默认的 redux 状态)。如果你删除它,它就可以正常工作。
标签: reactjs redux react-redux