Проблема в том, что при первом рендеринге было вызвано 3 useState
хука - name
, age
и license
, но после того, как возраст был изменен на значение ниже 16, useState
для license
больше не вызывается, в результате чего вызываются только первые 2 хука.Поскольку React docs заявляет :
Не вызывайте Hooks внутри циклов, условий или вложенных функций.Вместо этого всегда используйте Hooks на верхнем уровне вашей функции React.Следуя этому правилу, вы гарантируете, что хуки вызываются в одном и том же порядке каждый раз при рендеринге компонента.Это то, что позволяет React правильно сохранять состояние хуков между несколькими вызовами useState
и useEffect
.
Порядок вызываемых хуков важен, и если мы напишем код, который вызывает хуки дляне вызывается, React не сможет сопоставить вызов ловушки со своими значениями.
Решение состоит в том, чтобы переместить ловушку license
вверх в верхнюю часть функции, чтобы она вызывалась независимо от того,нужен или нет.
const {useState} = React;
function App() {
const [name, setName] = useState('Mary');
const [age, setAge] = useState(16);
const [license, setLicense] = useState('A123456');
return (
<div>
Name:{' '}
<input
value={name}
onChange={e => {
setName(e.target.value);
}}
/>
<br />
Age:{' '}
<input
value={age}
type="number"
onChange={e => {
setAge(+e.target.value);
}}
/>
{age >= 16 && <span>
<br />
Driver License:{' '}
<input
value={license}
onChange={e => {
setLicense(e.target.value);
}}
/></span>
}
</div>
);
}
ReactDOM.render(<App />, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>