Ссылка указывает действительную причину,
Следуя этому правилу, вы гарантируете, что хуки вызываются в одном и том же порядке каждый раз при визуализации компонента.Это то, что позволяет React правильно сохранять состояние хуков между несколькими вызовами useState и useEffect.
и предоставляет пример , показывающий, почему это важно.
Циклы, условия и вложенные функции являются общими местами, где порядок выполнения ловушек может быть нарушен.Если разработчик уверен, что цикл и т. Д. Оправдан и гарантирует порядок, то проблем нет.
Фактически цикл будет считаться действительным пользовательский хук , если он был извлечен в функцию, правило линтера может быть отключено при необходимости ( demo ):
// eslint-disable-next-line react-hooks/rules-of-hooks
const useInputs = n => [...Array(n)].map((_, i) => useState('name' + i));
Приведенный выше пример не вызовет проблем, но цикл не обязательно оправдан;это может быть одно состояние массива:
const App = () => {
const [inputs, setInputs] = useState(Array(10).fill(''));
const setInput = (i, v) => {
setInputs(Object.assign([...inputs], { [i]: v }));
};
return inputs.map((v, i) => (
<div key={i}>
<input value={v} onChange={e => setInput(i, e.target.value)} />
</div>
));
}