需求
- 一个div弹框,点击按钮时显示,点击空白处隐藏
- 在document上绑定隐藏事件
- 点击显示的按钮需要阻止冒泡
- 使用e.stopPropagation();失效
代码
javascript
// 对应的按钮添加阻止冒泡
<div onClick={(e) => {
e.nativeEvent.stopImmediatePropagation();
handleSetActiveBtn(item)
}}></div>;
封装hooks
javascript
import { RefObject, useEffect } from "react";
const useClickOutside = (ref: RefObject<HTMLElement>, handler: Function) => {
useEffect(() => {
const listener = (event: MouseEvent) => {
if (!ref.current || ref.current.contains(event.target as HTMLElement)) {
return;
}
handler(event);
};
document.addEventListener("click", listener);
return () => {
document.removeEventListener("click", listener);
};
}, [ref, handler]);
};
export default useClickOutside;
需要显示/隐藏的div
javascript
{
backgroundColorVisible &&
<div onClick={e => e.nativeEvent.stopImmediatePropagation()} ref={bgColorRef}>
<SketchPicker className="stage-color-setting"}
color={backgroundColor}
onChangeComplete={onHandleBackgroundColor} />
</div>
}
const bgColorRef = useRef<HTMLDivElement>(null);
useClickOutside(bgColorRef, () => {
setBackgroundColorVisible(false);
});