我有一個 pimRegistration 狀態初始化,如下面的 chrome redux-devtools 螢屏截圖所示。被參考的嵌套是 pimRegistration (state.domain.patient):

我使用以下擴展運算子陳述句更新了 patient.name 物件:
store.update((state) => ({
...state, ...patientPath,
...{ [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 },
}))
}
}
在 UI 組件 (angular2) 中使用以下陳述句呼叫該函式
if (this.path.includes('patient')) {
this._repo.update( 'name', 'domain.patient', this.name)
}
謝謝
uj5u.com熱心網友回復:
對商店進行深度更新可能會很棘手。在您的功能中,您似乎是在根目錄而不是在您希望更新的級別傳播更新。這個答案在這里概述了更新狀態的通常做法。簡而言之,像
const newState = {
...state,
domain: {
...state.domain,
patient: {
...state.domain.patient,
[property]: value
}
}
}
動態傳遞路徑并更新此狀態可能......很麻煩。有一些庫可以幫助你做到這一點,例如immer,但你可以用普通的 JS/TS 破解你的方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433502.html
標籤:javascript 打字稿 还原 ecmascript-6
