Обновление настройки нескольких объективов Ramda один раз - PullRequest
0 голосов
/ 29 сентября 2018

Нуби Рамде.Итак, я столкнулся с некоторыми проблемами глубокого обновления.Кто-то рекомендовал Рамду.Теперь мне нужна помощь с этим.Вот мое состояние реакции

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

1 Ответ

0 голосов
/ 29 сентября 2018

Вы не должны использовать 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.path и Ramda.assocPath могут работать достаточно хорошо.

...