Отображение предстоящих параметров выбора с логикой для предыдущего выбранного поля выбора

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

Пример:

const data = [
  {
    id: 1,
    name: 'State One',
    cities: [
      {
        id: 1,
        state: 'State One',
        name: 'City One'
      },
      {
        id: 2,
        state: 'State One',
        name: 'City Two'
      },
      {
        id: 3,
        state: 'State One',
        name: 'City Three'
      }
    ]
  },
  {
    id: 2,
    name: 'State 2',
    cities: [
      {
        id: 4,
        state: 'State 2',
        name: 'City 5'
      }
    ]
  }
]

Я должен указать параметры выбора городов в соответствии с родительским государством. Допустим, пользователь выбрал State One в поле выбора штата, тогда в следующем поле города должны быть только варианты городов State One. Как его настроить?

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

Это текущий код;

<Col lg = "6" md = "12" className = "mb-1">
<Label className = "form-label  py-1" for = "state">
    State
</Label>{' '}
<Row></Row>
<Select
    id = "state"
    options = {stateOptions}
    defaultValue = {stateOptions[0]}
    onChange = {(choice) => console.info(choice.value)}
/>
</Col>
<Col lg = "6" md = "12" className = "mb-1">
<Label className = "form-label  py-1" for = "city">
    City
</Label>{' '}
<Row></Row>
<Select
    id = "city"
    classNamePrefix = "select"
    options = {cityOptions}
    onChange = {(choice) => console.info(choice.value)}
/>
</Col>

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете отслеживать текущее выбранное состояние и обновлять города, которые занимает второй выбор.

Также добавлены некоторые комментарии, поясняющие, что делают функции.

export default function App() {
  const [state, setState] = useState(null);
  const [city, setCity] = useState(null);

  const onStateChange = (option) => {
    setState(option);

    // to remove city if a different state is selected
    if (!option || option?.value !== state?.value) setCity(null);
  };

  const onCityChange = (option) => {
    setCity(option);
  };

  // a separate useState for cities is not needed
  // as cities depend on the selected state, it can be determined when state changes
  const cities = useMemo(() => {
    if (!state) return [];
    return getOptions(data.find((el) => el.id === state.value).cities);
  }, [state]);

  return (
    <div>
      <Select options = {states} value = {state} onChange = {onStateChange} />
      <hr />
      <Select options = {cities} value = {city} onChange = {onCityChange} />
    </div>
  );
}

Edit codesandboxer-example (forked)

Спасибо за ответ, который мне очень помог.

atropa belladona 29.03.2022 16:15

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