Я следую курсу Удеми о том, как регистрировать события с помощью хуков, инструктор дал следующий код:
const [userText, setUserText] = useState('');
const handleUserKeyPress = event => {
const { key, keyCode } = event;
if (keyCode === 32 || (keyCode >= 65 && keyCode <= 90)) {
setUserText(`${userText}${key}`);
}
};
useEffect(() => {
window.addEventListener('keydown', handleUserKeyPress);
return () => {
window.removeEventListener('keydown', handleUserKeyPress);
};
});
return (
<div>
<h1>Feel free to type!</h1>
<blockquote>{userText}</blockquote>
</div>
);
Теперь это прекрасно работает, но я не уверен, что это правильный путь.Причина в том, что, если я правильно понимаю, при каждом повторном рендеринге события будут регистрироваться и отменяться каждый раз, и я просто не думаю, что это правильный путь.
Так что ясделана небольшая модификация хуков useEffect
ниже
useEffect(() => {
window.addEventListener('keydown', handleUserKeyPress);
return () => {
window.removeEventListener('keydown', handleUserKeyPress);
};
}, []);
Имея пустой массив в качестве второго аргумента, позволяя компоненту запускать эффект только один раз, имитируя componentDidMount
.И когда я проверяю результат, странно, что при каждом вводе ключа вместо добавления он перезаписывается.
Я ожидал, что setUserText (${userText}${key}
); добавит новый типизированный ключ к текущему состоянию и установит как новое состояние, но вместо этого он забывает старое состояние и переписывает с новымсостояние.
Действительно ли это был правильный способ, которым мы должны регистрировать и отменять регистрацию события при каждом повторном рендеринге?