一次更新设置多个 Ramda 镜头

Updating Setting Multiple Ramda lens once

Noobie 到 Ramda。所以,我面临着一些深度状态更新问题。有人推荐了 Ramda。现在我需要一些帮助。 这是我的反应状态

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'])

有时我需要像 reviewStatus,reviewFeedback 一样单独更新 apiData。目前我正在通过 setState callback.It 处理它,但有 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
                                  })
                                })
                            })
                        }
                    });

您不应该对单个更新使用 async-after-set-state-callback。

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 的镜头,除非你想要 typechecking/selector-abstraction。 Ramda.path 和 Ramda.assocPath 可以很好地工作。