Reactjs React Redux商店更新不';t触发器组件重新加载

Reactjs React Redux商店更新不';t触发器组件重新加载,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我是Redux的新手,在商店变更后重新招标有问题。我在这里发现了很多类似的问题,但仍然无法解决我的问题 我有一个包含多个任务的月度任务(事件)日历。日历是主要组件,在更深的层次上有多个任务项组件。在第一次渲染时,日历和任务被渲染得很好(在本例中没有员工姓名)。在日历组件中,我触发使用useEffect挂钩加载员工。我可以在控制台上看到网络请求。除此之外,控制台会记录操作,并且在reducer中还会显示员工列表。Redux devtool还显示加载的员工。仍然TaskItem上的MapStateT

我是Redux的新手,在商店变更后重新招标有问题。我在这里发现了很多类似的问题,但仍然无法解决我的问题

我有一个包含多个任务的月度任务(事件)日历。
日历
是主要组件,在更深的层次上有多个
任务项
组件。在第一次渲染时,日历和任务被渲染得很好(在本例中没有员工姓名)。在
日历
组件中,我触发使用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},…]

我发现了错误。这是一个非常笨拙的错误


我发布的所有代码都很好,但我将商店创建放在了一个组件中,该组件被一次又一次地重新引用,因此我的商店被一次又一次地重新创建。

谢谢!你的解决方案更好,我将来会用它。然而,目前(只有员工在店里)这并不能解决问题。幸运的是,我找到了根本原因。见下面我的答案。