[英]Unable to toggle a component for a second time using event listeners
我有一個執行以下操作的組件:
問題在於,單擊該圖標后,搜索輸入確實顯示,單擊搜索輸入之外的任何位置再次顯示該圖標。 但是,如果你再次點擊該圖標第二次,搜索輸入不顯示。
我嘗試將 ref 附加到圖標並評估單擊圖標時是否包含該事件,但該條件語句沒有幫助。 如何確保當我再次單擊該圖標時,輸入再次顯示? 謝謝!
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
函數。
我剛剛刪除了用於刪除click
事件的另一個useEffect
函數。
我還將once
選項傳遞給事件偵聽器,因此事件將在運行一次后被刪除。
useEffect(() => {
const handleClickOutside = () => document.addEventListener("click", ({ target }) => {
if (searchInputRef.current?.contains(target) === false && showSearch === true) setShowSearch(false);
else handleClickOutside();
}, { once: true });
handleClickOutside();
}, [showSearch]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.