reactjs - 反应嵌套在另一个和单击事件中的useRef
问题描述
我正在使用 useRef 来定义单击事件何时发生,如果在我设置的搜索输入之外没有聚焦(这使得结果容器隐藏)和一些特定的样式。
这通常有效,但是我添加了一个清除输入按钮,带有 ref searchClear。问题是,因为这是在 wrapper ref 之上,所以它认为单击 this 而不是单击 wrapper,我不确定如何解决逻辑。
下面代码的问题是,当没有文本输入时,我也会隐藏清除按钮。所以 setWhatFocused(false); 当我有一些输入时触发,结果容器在单击任意位置时显示/隐藏。但如果没有输入(因此没有清除按钮),则 (searchClear.current && !searchClear.current.contains(e.target)) 失败。
const wrapper = useRef(null);
const searchInput = useRef(null);
const searchClear = useRef(null);
useEffect(() => {
document.addEventListener("click", handleClickOutside, false);
return () => {
document.removeEventListener("click", handleClickOutside, false);
};
}, []);
const handleClickOutside = (e) => {
if (wrapper.current && !wrapper.current.contains(e.target)) {
if (searchClear.current && !searchClear.current.contains(e.target)) {
setWhatFocused(false);
}
}
};
我尝试添加以下内容,但它失去了重点样式。
if (!searchClear.current){
setWhatFocused(false);
}
希望我已经添加了足够的细节来解释。
解决的简单方法是回答以下任何问题:
当一个参考位于我需要检测的参考之上时,我可以检测到点击吗?我可以多次使用相同的参考而不出现问题(如果我可以的话)?
上面没有正面回答,有什么建议吗?
解决方案
我没有找到确切的解决方案,但最后我改变了它,使元素可见:隐藏并切换它,而不是有条件地渲染实际元素。
推荐阅读
- java - 从蓝牙插座读取
- java - 为什么progress drawable在以编程方式设置后会改变它的大小?
- c# - Blazor,如果加载则从/停止渲染返回
- flutter - Flutter,如何将exist Bloc用于其他屏幕?
- git - 从 Git Bash 在 sublime 3 中打开和查看 Git 存储库
- reactjs - 当检测到 Redux 状态没有变化时响应 useMemo 触发
- python - 查找重复行并替换一列中的值
- php - 数据库中的数据只显示一个数据,它不显示
- asp.net - 如何使用 Google AMP 实现 amp-from 标记
- javascript - res.json 不返回数组成员(简单登录代码)