Reactjs React Redux商店更新不';t触发器组件重新加载
我是Redux的新手,在商店变更后重新招标有问题。我在这里发现了很多类似的问题,但仍然无法解决我的问题 我有一个包含多个任务的月度任务(事件)日历。Reactjs React Redux商店更新不';t触发器组件重新加载,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我是Redux的新手,在商店变更后重新招标有问题。我在这里发现了很多类似的问题,但仍然无法解决我的问题 我有一个包含多个任务的月度任务(事件)日历。日历是主要组件,在更深的层次上有多个任务项组件。在第一次渲染时,日历和任务被渲染得很好(在本例中没有员工姓名)。在日历组件中,我触发使用useEffect挂钩加载员工。我可以在控制台上看到网络请求。除此之外,控制台会记录操作,并且在reducer中还会显示员工列表。Redux devtool还显示加载的员工。仍然TaskItem上的MapStateT
日历
是主要组件,在更深的层次上有多个任务项
组件。在第一次渲染时,日历和任务被渲染得很好(在本例中没有员工姓名)。在日历
组件中,我触发使用useEffect挂钩加载员工。我可以在控制台上看到网络请求。除此之外,控制台会记录操作,并且在reducer中还会显示员工列表。Redux devtool还显示加载的员工。仍然TaskItem
上的MapStateTrops
显示完全为空的状态
我做错了什么
这是我的相关代码:
日历:
const Calendar = ({startDay, tasks, loadEmployeesAction}) => {
useEffect(()=>{
loadEmployeesAction();
},[]);
...
}
export default connect(null, {loadEmployeesAction})(Calendar);
任务项:
const TaskItem = ({task, onTextEdit, onTaskView, saveTask, employees }) => {
...
}
const mapStateToProps = (state) => {
console.log('Actual state is: ', state);
return {
employees: state.employees
}
}
export default connect(mapStateToProps)(TaskItem);
减速器:
export const employeeReducer = (state = [], action) => {
switch (action.type) {
case actionType.EMPLOYEES_LOADED:
console.log('Reducer - Employees loaded:', action );
return action.payload.employees;
default :
return state;
}
}
行动:
const employeesLoaded = (employees) => {
return {type: actionType.EMPLOYEES_LOADED, payload: {
employees
}
}
}
export const loadEmployeesAction = () => {
return (dispatch) => {
return employeeApi.getAllEmployees().then(emps => {
console.log('Action - Employees loaded: ', emps);
dispatch(employeesLoaded(emps));
})
}
}
根部异径管:
export const rootReduxReducer = combineReducers({
employees: employeeReducer
});
reducer代码似乎与redux模式不同。因此,通常状态对象不会直接替换为其他对象。取而代之的是,只有需要改变的部分状态才需要使用一些非变异操作,比如spread操作符 所以我认为reducer代码应该像
export const employeeReducer = (state = [], action) => {
switch (action.type) {
case actionType.EMPLOYEES_LOADED:
return {...state,employees:action.payload.employees}
default :
return state;
}
}
如果来自API的响应为
[{“员工姓名”:“姓名”、“员工年龄”:24},…]
我发现了错误。这是一个非常笨拙的错误
我发布的所有代码都很好,但我将商店创建放在了一个组件中,该组件被一次又一次地重新引用,因此我的商店被一次又一次地重新创建。谢谢!你的解决方案更好,我将来会用它。然而,目前(只有员工在店里)这并不能解决问题。幸运的是,我找到了根本原因。见下面我的答案。