javascript - 无法使用事件侦听器第二次切换组件
问题描述
您可以在此处找到代码和框。
我有一个执行以下操作的组件:
- 显示一个图标
- 如果单击该图标,则在其位置显示搜索输入。
- 如果用户在显示时单击搜索输入之外的任何位置,请隐藏搜索输入并再次显示该图标。
问题是,在您单击图标后,搜索输入确实会显示,并且单击搜索输入之外的任何位置都会再次显示该图标。但是,如果您再次单击该图标,则不会显示搜索输入。
我尝试将引用附加到图标并评估单击图标时是否包含事件,但该条件语句没有帮助。如何确保当我再次单击该图标时,输入再次显示?谢谢!
import ReactDOM from "react-dom";
import "@elastic/eui/dist/eui_theme_amsterdam_light.css";
import React, { useEffect, useRef, useState } from "react";
import { EuiButtonIcon, EuiFieldText } from "@elastic/eui";
const App = () => {
const [showSearch, setShowSearch] = useState(false);
const searchInputRef = useRef(null);
useEffect(() => {
document.addEventListener(
"click",
(event) => handleClickOutside(event, showSearch),
false
);
}, [showSearch]);
useEffect(
() => () => {
document.removeEventListener(
"click",
(event) => handleClickOutside(event, false),
false
);
},
[]
);
const handleClickOutside = (event, showSearch) => {
if (
searchInputRef.current &&
!searchInputRef.current.contains(event.target) &&
showSearch
) {
setShowSearch(false);
}
};
if (showSearch) {
return (
<EuiFieldText
icon="search"
placeholder="Sample Search Placeholder ..."
inputRef={searchInputRef}
/>
);
}
return (
<EuiButtonIcon
aria-label="button"
iconType="search"
iconSize="xxl"
onClick={() => setShowSearch(true)}
/>
);
};
export default App;
解决方案
我认为你的方法是正确的,我改变的只是useEffect
功能。
我刚刚删除了useEffect
您用于删除click
事件的其他功能。
我还将该once
选项传递给事件侦听器,因此该事件将在运行一次后被删除。
useEffect(() => {
const handleClickOutside = () => document.addEventListener("click", ({ target }) => {
if (searchInputRef.current?.contains(target) === false && showSearch === true) setShowSearch(false);
else handleClickOutside();
}, { once: true });
handleClickOutside();
}, [showSearch]);
推荐阅读
- java - 我需要一些方法来快速将 BigInt 转换为 Bytes 数组,就像在 java 中一样
- google-maps - 到最近的火车站的距离
- google-maps-api-3 - 谷歌地图方向服务给出错误的结果
- javascript - 刷新页面后如何保持 JS 变量不变?
- swift - Swift:在另一个 switch 语句中重构 switch 语句
- python - 运行时如何更改 LightGBM 参数?
- javascript - 用同一行开头的匹配替换一行上的所有斜杠
- java - spring boot+netflix zuul 应用程序给出 java.lang.ClassNotFoundException: com.netflix.zuul.monitoring.CounterFactory
- css - Streamlabs 自定义 CSS 事件列表 - 为新条目添加延迟
- javascript - 当我添加计时器功能时,它不会画出我的“点”