拉比的诺比。因此,我面临一些深度状态更新问题。有人推荐拉姆达。现在,我需要一些帮助。 这是我的反应状态
steps: {
currentStep: 1,
step1: {
data: {},
apiData: null,
comments:[],
reviewStatus: '',
reviewFeedback: ''
},
step2: {
data: {},
apiData: null,
comments:[],
reviewStatus: '',
reviewFeedback: ''
}
}
我为data
,apiData,comments
,reviewStatus
,reviewFeedback
的每一步制作了镜片。
const step1ApiDataLens = lensPath(['steps', 'step1', 'apiData'])
const step1DataLens = lensPath(['steps', 'step1', 'data'])
const step1Status = lensPath(['steps','step1','reviewStatus'])
const step1Feedback = lensPath(['steps','step1','reviewFeedback'])
有时我有时需要像apiData
一样单独更新reviewStatus,reviewFeedback
。目前我正在通过setState
回调进行处理。它可以工作,但有3到4个回调看起来很奇怪。还有其他方法可以同时设置多个镜头吗?。
this.setState((state) => {
return set(step1ApiDataLens, response.data, state)
}, () => {
if (push) {
this.setState({
currentStatus: view(step1Status, this.state),
currentFeedback: view(step1Feedback, this.state)
}, () => {
this.setState((state)=>{
return set(currentStepLens,currentStep,state)
},()=>{
this.setState({
stepReady: true
})
})
})
}
});
答案 0 :(得分:1)
您不应对单个更新使用异步设置后状态回调。
this.setState(state => {
const upd1 = set(step1ApiDataLens, response.data, state);
if (push) {
const upd2 = {
...upd1,
currentStatus: view(step1Status, upd1),
currentFeedback: view(step1Feedback, upd1),
stepReady: true,
};
return set(currentStepLens, currentStep, upd2);
}
return upd1;
});
如果您没有在其上使用over
,则可能不需要带ramda的镜头,除非您要进行类型检查/选择器抽象化。 Ramda.path和Ramda.assocPath可以很好地工作。