reactjs - 无法在 Redux 中更新对象而不覆盖它或丢失状态中的其他项目
问题描述
简要概述..
我的状态如下所示:
isAuthenticated: true
user: {
avatar: 'avatar.jpg'
name: 'John Doe'
username: 'johndoe'
id: '6dHjStye45fds885'
}
而且我试图只在减速器中更新avatar
属性Redux
,但我尝试过的任何东西都没有按预期工作。我一定做错了,但我只是不知道是什么。我已经阅读了有关该主题的尽可能多的内容,但似乎没有任何工作正常。
如果我这样做:
return {
...state,
user: {
...state.user,
avatar: action.payload
}
};
它完全清除并仅用化身isAuthenticated
替换对象,破坏之前状态下的所有其他东西。user
我想我正在用avatar: action.payload
?
如果这样做:
return {
...state,
...state.user,
avatar: action.payload
};
它也清除了isAuthenticated
,但这次将所有用户数据(包括 new avatar
)置于状态的顶层(不再在对象中)。
有人可以告诉我哪里出错了吗?
编辑添加相关文件
authReducer.js(截断删除不相关的代码)
import isEmpty from '../../functions/isEmpty';
import { SET_CURRENT_USER, SET_AVATAR } from '../actionTypes';
const initialState = {
isAuthenticated: false,
user: {}
};
export default function(state = initialState, action) {
switch (action.type) {
case SET_CURRENT_USER:
return {
...state,
isAuthenticated: !isEmpty(action.payload),
user: action.payload
};
case SET_AVATAR:
return {
...state,
user: {
...state,
avatar: action.payload
}
};
default:
return state;
}
}
rootReducer.js
import { combineReducers } from 'redux';
import authReducer from './reducers/authReducer';
import errorReducer from './reducers/errorReducer';
export default combineReducers({
auth: authReducer,
errors: errorReducer
});
store.js
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './rootReducer';
const initialState = {};
const middleware = [thunk];
const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(...middleware),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
);
export default store;
解决方案
更改authReducer.js文件中的代码,
由此
case SET_AVATAR:
return {
...state,
user: {
...state,
avatar: action.payload
}
};
对此
case SET_AVATAR:
return {
...state,
user: {
...state.user,
avatar: action.payload
}
};
或这个
case SET_AVATAR:
return {
isAuthenticated: state.isAuthenticated,
user: {
...state.user,
avatar: action.payload
},
};
推荐阅读
- google-cloud-platform - 查询计数的 GCP BQ 指标未反映正确 否
- apache-flink - flink 工作效率低下,例如: INSERT INTO hive_table select orgId, 2.0 , pdate, '02' from users limit 10000 where user is a kafka table
- reactjs - Heroku“找不到所需的文件。名称:index.html”
- remote-access - 告诉 x2goclient 捕获 windows 密钥?
- python - 在 DataFrame 中找不到列名 - 无法删除它们 - “...在轴中找不到”
- c++ - 代码供用户从 3 个公式中选择来计算三角形的面积
- r - 将分隔字符串拆分为新行,类型转换设置为 TRUE
- jsonschema - JSON Schema 验证器兼容性
- google-oauth - Google 的 OAuth 同意屏幕不允许用户拒绝请求的范围?
- c# - C#:将 iText7 PDF 保存到用户通过对话框选择的文件夹中