【发布时间】:2020-09-25 21:22:47
【问题描述】:
我开始在空闲时间学习反应。启动 Hooks 时,两次调用 setState 方法。 实时代码在
https://codesandbox.io/s/elastic-saha-mdwwc?file=/src/App.js
添加按钮工作正常。但是当我按下回车键时,setState 函数被调用了两次。最初的想法是重新呈现内容。但我将 useEffect 依赖项作为空数组。所以没有重新渲染完成,我不知道如何调试它。任何帮助表示赞赏:)
const App = () => {
const [text, setText] = useState('');
const [list, setList] = useState([]);
const addToList = () => {
if (text !== '') {
setList([...list, text]);
setText('');
}
}
const deleteItem = index => {
const deletedList = list.filter((_, i) => i !== index);
setList(deletedList)
}
useEffect(() => {
console.log("Reloaded");
const listener = e => {
if (e.code === 'Enter') {
console.log("event triggered")
setText(text => {
if (text !== '') {
console.log("updating")
setList(a => ([...a, text]));
}
return ''
});
}
}
document.getElementById('textbox').addEventListener('keyup', listener);
console.log('Event registered')
return () => {
document.getElementById('textbox').removeEventListener('keyup', listener);
console.log('Event deregistered')
}
}, [])
return (
<div >
<input type="text" id="textbox" onChange={(e) => setText(e.target.value)} value={text} />
<button id="add" onClick={addToList}> Add</button>
<ul>
{
list.map((a, i) => <li key={i}>{a} <button type="button" onClick={() => deleteItem(i)}>Delete</button></li>)
}
</ul>
</div>
);
}
export default App;
【问题讨论】:
标签: reactjs react-hooks use-effect