javascript - 如何正确地将事件侦听器添加到 React useEffect 挂钩?
问题描述
我正在尝试将事件侦听器添加到 Autodesk Forge 查看器。这是一个基于 React 构建的应用程序,这是我正在尝试的代码:
const selectEvent = () => {
let viewer = window.NOP_VIEWER;
viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, (e) => {
setSelection(e.dbIdArray);
});
};
当从按钮调用时,它会完美运行onClick
:
<Button onClick={() => selectEvent()}>Add</Button>
但是,我希望在加载页面时打开事件侦听器,所以我尝试了useEffect
:
useEffect(() => {
let viewer = window.NOP_VIEWER;
if (viewer) {
selectEvent();
}
}, []);
即使在尝试了一些修改之后,我也无法让它工作。什么都没有发生,所以我怀疑事件监听器永远不会被添加。环顾其他解决方案,事件侦听器通常加载有useEffect
,但我不确定我做错了什么。任何提示将不胜感激!
编辑:它确实输入了if
语句,作为一个console.log
作品
一些背景(可能是相关的):查看器是从useEffect
useEffect(() => {
initializeViewer(props);
}, []);
并且可以如上面的代码所示访问查看器。
解决方案
尝试这样的事情。
当有任何变化viewer
并且查看器可用时,您就可以注册该事件。
将事件处理程序取消注册为挂钩的返回函数
useEffect(() => {
if (viewer) {
viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, (e) => {
setSelection(e.dbIdArray);
});
}
return () => { /* do the removeEventLister */ }
}, [viewer]);
推荐阅读
- html - 我想更改选择框的背景颜色
- java - 高分排行榜系统问题
- c# - 类方法内的随机整数保持不变
- php - SonarQube:删除打开标签前的多余字符
- apache-kafka - 如何在 kafka 消费者中使用 kafka avro 序列化程序编写骆驼路由器
- javascript - 设置 webpack 以在最终用户应用程序中需要文件
- java - 如何将大字符串拆分为两个不同的数组?
- jdbc - 如何关闭对logstash输出结果集中有多少行的预检查
- docker - Docker 容器保持正常运行
- oracle - 参数值 [100] 与预期类型不匹配 [java.time.LocalDateTime (n/a)]