Есть ли способ избежать вложенных операторов переключения

#javascript #reactjs #switch-statement

Вопрос:

Я работаю над проектом React, используя вложенные инструкции switch для маршрутизации пользователя в зависимости от их выбора. В первом случае есть еще два вложенных оператора switch. Во втором случае есть один вложенный оператор switch. Есть ли другой способ, которым я мог бы сделать это без всех вложенных операторов switch? Мы будем очень признательны за любую помощь.

 clickConfirm = () => {
        switch (this.props.serviceType) {
            case 'car_service':
                switch (this.props.loadType) {
                    case 0: 
                        switch (this.props.photoMode) {
                            case 0:
                                this.props.push('/payment/');
                                break;
                            case 1:
                                this.props.push('/payment/');
                                // capture image here
                                break;
                            case 2:
                                this.props.push('/capture/');
                                break;
                        }
                        break;
                    case 1:
                        switch (this.props.photoMode) {
                            case 0:
                                this.props.history.push('/address/');
                                this.props.setToPhoneNumber(false);
                                break;
                            case 1:
                                this.props.history.push('/address/');
                                this.props.setToPhoneNumber(false);
                                // capture image here
                                break;
                            case 2:
                                this.props.push('/capture/');
                                break;
                        }
                        break;
                    case 2:
                        this.props.history.push('/phone/');
                        this.props.setToPhoneNumber(true);
                        break;
                }
                break;
            case 'phone_service':
                switch (this.props.photoMode) {
                    case 0:
                        this.props.history.push('/address/');
                        break;
                    case 1:
                        this.props.history.push('/address/');
                        // capture image here
                        break;
                    case 2: 
                        this.props.history.push('/capture/');
                        break;
                }
                break;
        }
    };
 

Ответ №1:

Вы можете хранить данные в таком объекте, как этот:

 const SERVICES = {
 'car_service': {
      0: {
          0: ()=> {
              this.props.push('/payment/');
           }
       }
  }
}
 

Затем вы можете заменить switch деталь на:

 clickConfirm = () => {
 SERVICES[this.props.serviceType][this.props.loadType][this.props.photoMode]();
}
 

Комментарии:

1. Это очень чисто. Если бы я переместил СЛУЖБЫ в файл утилиты, потому что объект может быть большим. Как бы я сдал реквизит? Будет ли это в 0: (реквизит) => { реквизит.история.push(‘/оплата/’);? Спасибо, что нашли время ответить на мои вопросы.

Ответ №2:

Я не предлагаю этого, похоже, что ваш компонент, возможно, должен принять этот вариант напрямую или иным образом быть разбит, а не объединен так, как это есть.

Но, не зная вашего варианта использования или того, почему вы «подталкиваете к реквизиту» (?), просто чтобы «сгладить» свое состояние, вы могли бы объединить различные значения и перечислить известные комбинации.

ПРИМЕЧАНИЕ: Я не тестировал это и не пытался точно сопоставить это с вашими условиями, но общая идея…

 const combined = [this.props.serviceType, this.props.photoMode, this.props.loadType || 'NA'].join('|');

switch (combined) {
    case 'car_service|0|0':
        this.props.push('/payment/'); break;
    case 'car_service|1|0':
        this.props.push('/payment/'); break; // capture image here
    case 'car_service|2|0':
        this.props.push('/capture/'); break;
    case 'car_service|0|1':
        this.props.push('/address/'); this.props.setToPhoneNumber(false); break;
    case 'car_service|1|1':
        this.props.push('/address/'); this.props.setToPhoneNumber(false); break;  // capture image here
    case 'car_service|2|1':
        this.props.push('/capture/'); break;
    case 'car_service|0|2':
    case 'car_service|1|2':
    case 'car_service|2|2':
        this.props.history.push('/phone/'); this.props.setToPhoneNumber(true); break;
    case 'phone_service|0|NA':
        this.props.history.push('/address/'); break;
    case 'phone_service|1|NA':
        this.props.history.push('/address/'); break; // capture image here
    case 'phone_service|2|NA':
        this.props.history.push('/address/'); break;
 

Комментарии:

1. Спасибо, что нашли время ответить на мой вопрос. Похоже, ты потратил на это много времени. Я никогда не видел такого заявления о переключении. Сплющить выглядит лучше, чем то, что у меня было. Еще раз спасибо.