#javascript #reactjs #typescript #react-hooks
Вопрос:
Я совсем новичок в реагировании и задавался вопросом, как правильно инициализировать пустые переменные состояния в react. В настоящее время у меня есть форма в машинописном виде, в которой есть несколько полей для заполнения. Большинство из этих полей являются выпадающими, и я инициализировал некоторые статические данные в виде массива объектов примерно так.
export const options = [ { id : 0, name : "Setting 1" }, { id : 1, name : "Setting 2" }, { id : 2, name : "Setting 3" } ];
Поэтому я могу отобразить эти параметры в раскрывающемся списке формы, и все работает так, как ожидалось. Проблема возникает, когда я пытаюсь инициализировать состояние, которое я использую для проверки обновлений в этом поле.
const [myForm, setMyForm] = React.useState({ dropdown : options[0], dropdown1 : options1[0] });
Поэтому для меня в myForm
объекте, который я зарегистрировал для отслеживания состояния, я по умолчанию выбираю первый вариант, как я указал. Я не могу инициализировать его null
, так как typescript требует типа для любого объявления. Как лучше всего изначально использовать значение в качестве пустого объекта и установить его позже, когда пользователь проверит параметр в раскрывающемся списке. Потому что, если я установлю его в пустой объект, как {}
в options
, я не смогу получить доступ id
name
к полям и в коде. Может ли кто-нибудь сказать мне, как это правильно сделать
Комментарии:
1. Учитывая, что в любом случае существует начальный шаг рендеринга, какие значения по умолчанию
id
иname
ожидает ли он?2. @zerkms я просто хочу, чтобы он был пустым, должен ли я добавить дополнительный объект в
options
массив, который имеетid
значение -1 и имя «-1», или есть способ установить состояние равным нулю и использовать поля объекта(id
иname
) или мне нужно добавить дополнительный объект?3. Что именно означает «пустой»? Если вы читаете
id
свойство — какое значение вы ожидаете там по умолчанию ?4. Пусто, как и в, ничего не выбрано, скажем, для объяснения
id = -1
иname = "-1"
в выпадающем списке5. Любой крючок реакции является общим. Таким образом, вы можете использовать generic для описания типа состояния. Нравится
useStatelt;{} | nullgt;(null);
Ответ №1:
useState
можно взять один тип. Это хорошо для случаев, когда Typescript не может определить тип по типу начального значения. Это часто происходит с любым null
значением по умолчанию. Вам нужно сообщить typescript, каким может быть значение, когда его нет null
.
Например:
const [name, setName] = useStatelt;string | nullgt;(null) // name is of type: string | null if (name != null) console.log(name.toUpperCase())
Я не совсем понимаю ваш код здесь, но я думаю, что вы, возможно, захотите установить тип вашего состояния таким образом, со значением в качестве необязательного. Это означает, что он может отсутствовать или быть неопределенным.
interface State { dropdown: FormField dropdown1: FormField } interface FormField { id: number name: string value?: string }
А затем используйте этот тип:
const [myForm, setMyForm] = React.useStatelt;Stategt;({ dropdown : options[0], dropdown1 : options1[0] }); myForm.dropdown.name // allowed, and type is: string | undefined
Комментарии:
1. Спасибо, это именно то, что я искал, правильный способ сделать это.