#javascript #reactjs #react-hooks #next.js
Вопрос:
Я вызываю функцию, чтобы определить, допустим ли набор полей формы. У меня есть набор переменных состояния, которые должны сработать useEffect()
, но, по-видимому, я не могу создать массив заранее, как это, не получив предупреждения:
const states = [name, email, password]
useEffect(() => {
someFunction({ states })
}, states)
Вместо этого я должен сделать это:
useEffect(() => {
someFunction({ states: [name, email, password] })
}, [name, email, password])
Это раздражает, потому что я планирую использовать этот шаблон в других формах, в которых будет 10-20 полей, поэтому я ненавижу загромождать его, каждый раз создавая весь этот массив. Есть ли лучший способ?
Комментарии:
1. Однако это должно быть возможно. С какой проблемой вы сталкиваетесь конкретно? Покажи это.
2. вы можете использовать оператор распространения
[...states]
, имо есть случаи, когда вы хотите прослушать изменение массива3. Оператор распространения выдает мне то же самое предупреждение eslint.
Ответ №1:
Технически, да, это возможно. То, что вы видите, — это предупреждение от eslint, и вы можете отключить его в строке/файле. Проверьте документы здесь: https://eslint.org/docs/user-guide/configuring/rules#disabling-rules
const states = [name, email, password]
useEffect(() => {
someFunction({ states })
}, states) // eslint-disable-line <eslint-error-id>
Редко бывает хорошей идеей иметь такую переменную, так как eslint не сможет сказать вам, отсутствует ли у вас зависимость.
Комментарии:
1. Это имеет смысл для eslint. Не очень хорошо для того, чтобы сделать его СУХИМ, так как я также использовал бы этот же массив в функции отправки, но я понимаю.
2. @Glenn Вы можете отключить это правило, если хотите. Подумайте о том, что это дает вам, и соответствует ли это вашему стилю кода. В конце концов, это зависит от тебя. На мой взгляд, это просто незначительная проблема (иногда не принято делиться всеми зависимостями). Но он может обнаружить важные труднодоступные для вас ошибки
3. в конечном счете я решил отключить предупреждение и использовать переменную из-за необходимости в нескольких длинных списках, но я определяю массив чуть выше вызова useEffect (), поэтому легко увидеть, что там происходит. Я думаю, это хороший компромисс.
4. P.S. Я на самом деле думаю, что это правило линтинга не очень хорошо продумано. Есть много случаев, когда я устанавливаю один параметр состояния с помощью оператора распространения, потому что изменился другой параметр состояния. Правило компоновки часто считает, что мне нужно включить и то, и другое в список зависимостей, что, конечно, приводит к бесконечному циклу.
5. Если это компонент, подобный форме, я бы рассмотрел наличие данных формы в объекте в качестве опоры, а не каждое поле в качестве опоры. Но, в общем, все зависит от