reactjs - 在组件内调用多个操作时 Redux Reducer 的行为
问题描述
我最近学习了 MERN 堆栈,目前正在使用它制作一个附带项目。我遇到了一个问题,每次调用不同的操作时,我的 Redux Reducer 都会相互覆盖。这是完整而详细的问题。
问题:
- 在 React 组件上调用操作的行为。假设我们决定创建一个动作并在我们的一个 React 组件中实现它,我们已经完成了所有设置(例如创建 reducer 并更新状态,创建动作本身并使用
connect
from将其连接到反应组件react-redux
) . 我只是想知道当我在我们的 React 组件中调用多个操作时componentDidMount
,为什么状态会相互覆盖。例如
componentDidMount(){
// Action updates 'user: {}' state in our reducer
this.props.fetchUserData();
// Action updates 'clients:{}' state
this.props.fetchClientsData();
}
Reducers 的结果状态:
user: {}, // Overrided by the fetchClientsData()
clients { clientsData }
我们不是在本质上更新特定的 reducer 状态吗(fetchUserData() 更新 'user:{}' 和 fetchClientsData() 更新'clients: {}')。为什么它是压倒一切的?我检查了我的 Redux Devtools 中间件,它实际上是压倒一切的。我如何不覆盖减速器中的其他状态?谢谢!
更新:-这是我的减速器:Index.js
import { combineReducers } from "redux";
import AuthReducer from "./AuthReducer";
import NotificationReducer from "./NotificationReducer";
import { reducer as formReducer } from "redux-form";
import DataReducer from "./DataReducer";
export default combineReducers({
form: formReducer,
auth: AuthReducer,
notification: NotificationReducer,
data: DataReducer,
});
AuthReducer.js
import { FETCH_USER, FETCH_HOSPITAL } from "../actionTypes";
export default (state = null, action) => {
switch (action.type) {
case FETCH_USER:
return action.payload || false;
case FETCH_HOSPITAL:
return action.payload || false;
default:
return false;
}
};
DataReducer.js
import { FETCH_DATA } from "../actionTypes";
export default (state = {}, action) => {
switch (action.type) {
case FETCH_DATA:
return { ...state, data: action.payload };
default:
return state;
}
};
解决方案
错误在于您的AuthReducer
,无论您从这些switch case
语句返回什么都将成为您的新状态。
与您在DataReducer.js
文件中执行的方式相同
因此,您必须更新您的状态,例如:
export default (state = null, action) => {
switch (action.type) {
case FETCH_USER:
return {...state, users: action.payload || false};
case FETCH_HOSPITAL:
return {...state, clients: action.payload || false};
default:
return state;
}
};
如果您初始化您的状态,那将是一件好事
推荐阅读
- r - R中的3个变量与ggplot2的图表
- java - 带有弹簧靴而不是标准方案的 Graphql
- angular-reactive-forms - 如何添加多个字段,即基于使用角度表单控件选择的下拉选项的表单组/表单数组
- jsf - javax.el.PropertyNotFoundException:目标不可达,标识符“IndexBacking”解析为空
- java - JMS 健康检查失败:javax.jms.JMSException:无法将使用者添加到尚未注册的连接:ID:b60b8dda5452-40739-1621954316
- python - 如何根据背景更改条形标签颜色
- python - PermissionError: [Errno 13] Permission denied: '/opt/root/6.22.02-install/etc/notebook/migrated'
- latex - 如何在 LaTex 中对齐有和没有项目符号的句子的编号
- java - 如何在 Spring 的另一个配置中使用默认配置?
- reactjs - 在 .env 文件 React 应用程序中设置 PUBLIC-URL