Использование перечислений в React select

Я хочу показать раскрывающийся список в React, используя следующее перечисление. Идея состоит в том, чтобы предотвратить использование случайных строк в качестве ключей в моем <select>. Ключи должны быть ограничены Stooges.larry, Stooges.curly и Stooges.moe:

const Stooges = {
  larry: "Larry Fine",
  curly: "Curly Howard",
  moe: "Moe Howard"
};

Вот код для моего выбора, который отлично работает:

<select value = {stooge} onChange = {handleChangeEvent}>
  {Object.keys(Stooges).map(key => (
    <option key = {key} value = {key}>
      {Stooges[key]}
    </option>
  ))}
</select>

Проблема возникает, когда я пытаюсь установить начальное значение раскрывающегося списка - мне нужно использовать жестко закодированный ключ:

const [stooge, setStooge] = React.useState('larry');

Я могу немного смягчить это, выбрав первый ключ:

const keys = Object.keys(Stooges);
const [stooge, setStooge] = React.useState(keys[0]);

Тем не менее, это все еще кажется неправильным. Я не могу отличить от key[0] кого я выбираю.

Есть ли лучший способ справиться с перечислениями в этом случае использования? Я пробовал строковые перечисления в TypeScript, но у них та же проблема:

enum Stooges {
  larry = "Larry Fine",
  curly = "Curly Howard",
  moe = "Moe Howard"
}

Пожалуйста, смотрите мой CodeSandbox здесь.

Я узнал, что keyof Stooges будет работать только для type Stooges = {...}, поэтому удалил свой ответ :(

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

Ответы 1

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

Из-за отсутствия лучшего решения я выбрал следующий подход. По крайней мере, я могу выбрать правильное перечисление по имени: Stooges.larry.id:

const Stooges = {
  larry: {
    id: "larry",
    name: "Larry Fine"
  },
  curly: {
    id: "curly",
    name: "Curly Howard"
  },
  moe: {
    id: "moe",
    name: "Moe Howard"
  }
};

function App() {
  const [stooge, setStooge] = React.useState(Stooges.larry.id);

  const handleChangeEvent = (event: React.ChangeEvent<HTMLSelectElement>) => {
    setStooge(event.target.value);
  };

  return (
    <div className = "App">
      <select value = {stooge} onChange = {handleChangeEvent}>
        {Object.keys(Stooges).map(key => (
          <option key = {key} value = {key}>
            {Stooges[key].name}
          </option>
        ))}
      </select>
    </div>
  );
}

Вот новая CodeSandbox: https://codesandbox.io/embed/wqj2q94o2k

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