一次更新设置多个Ramda镜头

时间:2018-09-29 12:25:33

标签: javascript reactjs immutability ramda.js

拉比的诺比。因此,我面临一些深度状态更新问题。有人推荐拉姆达。现在,我需要一些帮助。 这是我的反应状态

steps: {
        currentStep: 1,
        step1:  {
          data: {},
          apiData: null,
          comments:[],
          reviewStatus: '',
          reviewFeedback: ''
        },
        step2:  {
          data: {},
          apiData: null,
          comments:[],
          reviewStatus: '',
          reviewFeedback: ''
        }
    }

我为dataapiData,commentsreviewStatusreviewFeedback的每一步制作了镜片。

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
                                  })
                                })
                            })
                        }
                    });

1 个答案:

答案 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可以很好地工作。