Tengo una inicialización del estado de pimRegistration como se muestra en la captura de pantalla de Chrome redux-devtools a continuación. El anidamiento al que se hace referencia es pimRegistration ( state.domain.patient ):
Actualicé el patient.name con la siguiente declaración del operador de propagación:
store.update((state) => ({ ...state, ...patientPath, ...{ [property]: value }, })); ...donde property es la propiedad "name" del objeto del paciente con value . Después de la actualización, la siguiente captura de pantalla muestra el nuevo estado:
Tenga en cuenta que el objeto del paciente original (púrpura en la captura de pantalla) se actualiza con el nombre del objeto, se duplica y se coloca en la raíz del estado (amarillo en la captura de pantalla).
Me gustaría sobrescribir las propiedades del pimRegistration(state).domain.patient , no para crear un nuevo objeto de paciente.
La actualización de estado se llama como se muestra a continuación.
store.update((state) => ({ ...state, ...patientPath, // state.domain.patient ...{ [property]: value }, }));He probado mis diferentes combinaciones sin conseguir el resultado deseado.
La función de actualización completa se muestra a continuación.
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 }, })); }La función anterior se invoca con la siguiente declaración en Angular 2.
if (this.path.includes("patient")) { this._repo.update("name", "domain.patient", this.name); }Gracias
Las actualizaciones profundas de una tienda pueden ser complicadas. En su función, parece estar difundiendo las actualizaciones en la raíz en lugar de en el nivel en el que desea la actualización. Esta respuesta aquí describe la práctica habitual para actualizar el estado. En resumen, algo como
const newState = { ...state, domain: { ...state.domain, patient: { ...state.domain.patient, [property]: value } } }Pasar dinámicamente una ruta y actualizar este estado puede ser... engorroso. Hay bibliotecas que pueden ayudarlo a hacerlo, como immer , pero posiblemente pueda abrirse camino con JS / TS normal.