javascript - React removeEventListener 没有被移除
问题描述
我已经浏览了很多谷歌搜索,但仍然无法解决这个问题。
我有一个我希望能够通过按键选择的按钮列表。按“A”时,您会选择“A: Xxxxxxxx” select
。当按下 B 时,您会选择“B: yyyyyyyy” select
。
const d = useDispatch();
const s = useSelector(select);
const [selected, setSelected] = useState(s);
const eventHandler = function (card, i, setSelected, d, set) {
return e => {
if (alphabet.indexOf(e.key) === i) {
setSelected(card.key);
d(set(card.key));
}
};
};
useEffect(() => {
cards.map((card, i) => {
window.addEventListener(
"keypress",
eventHandler(card, i, setSelected, d, set),
false
);
});
return () => {
window.removeEventListener("keypress", eventHandler, false);
};
}, []);
现在,我发现,您需要为它们指定函数引用才能工作,但我不知道如何将这些变量传递到处理按钮按下cards.map
的函数中?eventHandler
我真的迷路了……
解决方案
您正在向窗口添加一堆事件侦听器。您需要将事件存储到某些东西中并引用它们以删除它们。
const myEvents = []
const eventHandler = function (card, i, setSelected, d, set) {
const fnc = e => {
if (alphabet.indexOf(e.key) === i) {
setSelected(card.key);
d(set(card.key));
}
};
myEvents = fnc
return fnc
};
useEffect(() => {
cards.map((card, i) => {
window.addEventListener(
"keypress",
eventHandler(card, i, setSelected, d, set),
false
);
});
return () => {
myEvents.forEach(evt =>
window.removeEventListener("keypress", evt, false))
};
}, []);
最后这段代码效率很低。您应该绑定一个事件处理程序并查看密钥是否与任何卡匹配。
基本想法是
const lookUpCard = e => {
const index = alphabet.indexOf(e.key)
const myCard = cards[index]
})
window.addEventListener("keypress", lookUpCard)
推荐阅读
- c# - ASP.NET 后台线程阻止页面访问
- android - 我的 onClickListener 在 getView 方法中工作。为什么?
- android - ffmpeg 创建的延时摄影不会在 VLC 以外的其他播放器上播放
- python - 在单词的复数或单数之间选择问题
- r - dplyr中select()的contains()和matches()之间的区别
- django - Django任何已安装的应用程序都找不到静态文件
- c++ - 有符号 32 位元素的 AVX __m256i 整数除法
- botframework - 基于 .net 的机器人的“az bot publish”命令中正确的源代码目录位置是什么
- python - Python 测试 - 这是一种安全的方式来编写我的测试以避免在每个测试函数中重复冗长的字典吗
- jquery - 如何将带有 jQuery 选项卡的多个表添加到单个页面?