React - Как правильно обрабатывать данные флажка

Пока я изучаю React, я начал создавать довольно простой проект. Планировщик поездок для TFL (транспорт для Лондона). Приложение получает некоторые параметры, такие как От, К и Режим (Tube, Bus, Overground), и отправляет запрос API в TFL API.

Данные режима объединяются тремя флажками: трубка, автобус и надземный. Он должен быть отправлен в виде строки с запятыми между каждым словом. Что-то вроде метро, ​​автобуса, надземного или только автобусного, надземного и т. д.

Вот как я обрабатываю значения флажка:

// Handling checkboxes
    const tubeVal = e.target.elements.tube.checked === true ? "tube" : "";
    const busVal = e.target.elements.bus.checked === true ? "bus" : "";
    const overgroundVal = e.target.elements.overground.checked === true ? "overground" : "";

    let mode = "";
    if (tubeVal && !busVal && !overgroundVal) {
      mode = tubeVal;
    }
    if (!tubeVal && busVal && !overgroundVal) {
      mode = busVal;
    }
    if (!tubeVal && !busVal && overgroundVal) {
      mode = overgroundVal;
    }
    if (tubeVal && busVal && !overgroundVal) {
      mode = tubeVal + "," + busVal;
    }
    if (tubeVal && !busVal && overgroundVal) {
      mode = tubeVal + "," + overgroundVal;
    }
    if (!tubeVal && busVal && overgroundVal) {
      mode = busVal + "," + overgroundVal;
    }
    if (tubeVal && busVal && overgroundVal) {
      mode = tubeVal + "," + busVal + "," + overgroundVal;
    }

Это правильный способ обработки данных флажка в React? Мне это кажется неправильным.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы создал массив имен полей, которые я хочу, затем отфильтровал бы проверенные, а затем добавил бы их значения в массив и присоединился бы к ,.

Что-то вроде этого

function handleCheckboxes(e) {
  e.preventDefault();
  // Handling checkboxes
  const checkboxes = ['tube', 'bus', 'overground'];
  const nodes = checkboxes.map(name => e.target.elements[name]);
  const values = nodes.filter(node => node.checked).map(node => node.value);
  const mode = values.join(',');
  alert(mode);
}

// for demo
document.querySelector('form').addEventListener('submit', handleCheckboxes);
<form>
  <input type = "checkbox" name = "tube" value = "tube" />
  <input type = "checkbox" name = "bus" value = "bus" />
  <input type = "checkbox" name = "overground" value = "overground" />

  <button type = "submit" id = "check">check</button>
</form>

В частности, для React у вас может быть компонент-контейнер, который отображает и контролирует три флажка и их состояние (проверено или нет), сохраняя его в state. Затем вы можете получить эти значения и снова создать из них массив и присоединиться к нему с помощью ,.

Ответ принят как подходящий

Ваш код можно сильно сократить до одной строки:

const mode = ['tube', 'bus', 'overground'].filter(key => e.target.elements[key].checked).join(',');

Сначала мы создаем массив с именами всех элементов, которые вы хотите взять, фильтр из тех, которые не проверены, и составляем наши окончательные строки со всеми оставшимися именами, объединенными ,, используя join.

Теперь вы можете сохранить переменную mode в своем состоянии для последующего использования в рендере.

Рабочая демонстрация:

function test(e) {
    const mode = ['tube', 'bus', 'overground'].filter(key => e.target.elements[key].checked).join(',');

    console.info('Mode : ', mode);
    return mode;
}

test({ target: { elements: { 
    tube: { checked: true },
    bus: { checked: false },
    overground: { checked: true }
} } })

test({ target: { elements: { 
    tube: { checked: true },
    bus: { checked: true },
    overground: { checked: true }
} } })

test({ target: { elements: { 
    tube: { checked: true },
    bus: { checked: true },
    overground: { checked: false }
} } })

test({ target: { elements: { 
    tube: { checked: false },
    bus: { checked: false },
    overground: { checked: false }
} } })

Боже мой! Как это круто? Спасибо @Treycos. Мне действительно нужно сохранить режим в состоянии? В этом простом проекте мне не нужно передавать их никакому другому компоненту. Должен ли я сохранить его в магазине?

user1941537 23.02.2019 13:13

Ну, вас ничто не заставляет, это полностью зависит от того, чего вы хотите с его помощью достичь. Поскольку вы используете магазин избыточности, вы можете поместить его туда.

Treycos 23.02.2019 13:44

Другие вопросы по теме