使用带状态对象的展开 (...) 运算符实现所需结果的问题
Problems achieving required result of using the spread (...) operator with state object
我有一个 pimRegistration 状态初始化,如下面的 chrome redux-devtools 屏幕截图所示。被引用的嵌套是 pimRegistration
(state.domain.patient
):
我用以下扩展运算符语句更新了 patient.name
对象:
store.update((state) => ({
...state,
...patientPath,
...{ [property]: value },
}));
...其中 property
是具有 value
的患者对象的“名称”属性。更新后,以下截图显示了新的状态:
请注意,原始患者对象(屏幕截图中的紫色)已使用姓名对象更新、复制并放置在状态的根目录(屏幕截图中的黄色)。
我想覆盖 pimRegistration(state).domain.patient
对象的属性,而不是 来创建新的患者对象。
调用状态更新如下所示。
store.update((state) => ({
...state,
...patientPath, // state.domain.patient
...{ [property]: value },
}));
我尝试了不同的组合,但没有达到预期的效果。
完整的更新功能如下图
update(property: string, path: string, value: any) {
const paths: string[] = path.split(".");
const pathReducer = (state: IRegistrationState, path_: string) => {
if (paths.length <= 0) {
return state.domain;
}
return state[path_];
};
const domainPath = state.domain;
let patientPath, nokPath, referrerPath;
if (path.includes("patient")) {
patientPath = paths.reduce(pathReducer, state);
}
if (path.includes("nok")) {
nokPath = paths.reduce(pathReducer, state);
}
if (path.includes("referrer")) {
referrerPath = paths.reduce(pathReducer, state);
}
store.update((state) => ({
...state,
...patientPath,
...{ [property]: value },
}));
}
上面的函数在Angular2.
中用下面的语句调用
if (this.path.includes("patient")) {
this._repo.update("name", "domain.patient", this.name);
}
谢谢
商店的深度更新可能很棘手。在您的函数中,您似乎在根目录而不是在您希望更新的级别传播更新。 概述了更新状态的通常做法。简而言之,类似于
const newState = {
...state,
domain: {
...state.domain,
patient: {
...state.domain.patient,
[property]: value
}
}
}
动态传递路径并更新此状态可能……很麻烦。有一些库可以帮助您做到这一点,例如 immer,但您可以使用普通的 JS/TS.
来解决问题。
我有一个 pimRegistration 状态初始化,如下面的 chrome redux-devtools 屏幕截图所示。被引用的嵌套是 pimRegistration
(state.domain.patient
):
我用以下扩展运算符语句更新了 patient.name
对象:
store.update((state) => ({
...state,
...patientPath,
...{ [property]: value },
}));
...其中 property
是具有 value
的患者对象的“名称”属性。更新后,以下截图显示了新的状态:
请注意,原始患者对象(屏幕截图中的紫色)已使用姓名对象更新、复制并放置在状态的根目录(屏幕截图中的黄色)。
我想覆盖 pimRegistration(state).domain.patient
对象的属性,而不是 来创建新的患者对象。
调用状态更新如下所示。
store.update((state) => ({
...state,
...patientPath, // state.domain.patient
...{ [property]: value },
}));
我尝试了不同的组合,但没有达到预期的效果。
完整的更新功能如下图
update(property: string, path: string, value: any) {
const paths: string[] = path.split(".");
const pathReducer = (state: IRegistrationState, path_: string) => {
if (paths.length <= 0) {
return state.domain;
}
return state[path_];
};
const domainPath = state.domain;
let patientPath, nokPath, referrerPath;
if (path.includes("patient")) {
patientPath = paths.reduce(pathReducer, state);
}
if (path.includes("nok")) {
nokPath = paths.reduce(pathReducer, state);
}
if (path.includes("referrer")) {
referrerPath = paths.reduce(pathReducer, state);
}
store.update((state) => ({
...state,
...patientPath,
...{ [property]: value },
}));
}
上面的函数在Angular2.
中用下面的语句调用if (this.path.includes("patient")) {
this._repo.update("name", "domain.patient", this.name);
}
谢谢
商店的深度更新可能很棘手。在您的函数中,您似乎在根目录而不是在您希望更新的级别传播更新。
const newState = {
...state,
domain: {
...state.domain,
patient: {
...state.domain.patient,
[property]: value
}
}
}
动态传递路径并更新此状态可能……很麻烦。有一些库可以帮助您做到这一点,例如 immer,但您可以使用普通的 JS/TS.
来解决问题。