【发布时间】:2019-09-14 05:45:49
【问题描述】:
新手在这里做出反应,使用钩子管理合成事件的状态并从事件处理程序更新状态的正确方法是什么,我浏览了官方的反应文档,找不到具体信息。
这是我迄今为止尝试过的。
第 1 步:声明用于更新状态的钩子变量
const [state, setState] = React.useState(0);
第 2 步:声明处理合成事件和更新状态的函数
const handleCopy = (e) => {
setState(state+1);
e.preventDefault();
};
第 3 步:添加事件侦听器并将事件传递给函数
document.addEventListener('copy', (e) => handleCopy(e));
第 4 步:将状态传递给组件
<Component value={state}/>
我在这里遇到的问题很少
- 状态更新未反映在组件中。但它似乎确实在更新状态,因为 console.log 似乎正确地反映了状态。
- 随着时间的推移,注册的事件侦听器过多。
为了防止太多的事件侦听器,我将 addEventListener 包装为只注册一次的条件
const [syntheticEventRegistered, setSyntheticEventRegistered] = React.useState(false);
if(!syntheticEventRegistered)
{
document.addEventListener('copy', (e) => handleCopy(e));
setSyntheticEventRegistered(true);
}
这确实解决了太多的事件侦听器,但 handleCopy 函数现在只反映默认状态。即 state = 0 而不是最新状态,也不会更新组件值。
【问题讨论】:
标签: reactjs