当前位置: 首页 > news >正文

react控制react Popover组件显示隐藏

1.antd版本

"antd": "^3.26.16",

2.完整代码(因为要使用Modal.confirm,不使用e.target.closest查找class不太好控制)

import React, { Component } from "react";
import { Select, Popover, DatePicker, Button, Modal } from "antd";// 在不使用React.createRef的情况下,点击外层气泡外层隐藏,内层保持显示
export default class TestPopover extends Component {constructor(...args) {super(...args);this.state = {isShow: false}this.popoverRef = null; // 用于存储 Popover 内容区域的 DOMthis.triggerRef = null; // 用于存储触发按钮的 DOM}componentWillMount() {// 使用mousedown速度比click快document.addEventListener("mousedown", this.onOutsideClick);}componentWillReceiveProps(nextProps) {}componentWillUnmount() {document.removeEventListener("mousedown", this.onOutsideClick);}// 全局点击处理onOutsideClick = (e) => {// 是否点击了【操作日志】按钮if (this.triggerRef?.contains(e.target)) {return;}// 是否点击了内容if (this.popoverRef?.contains(e.target)){return;}// e.target.closest是查找当前级和父级dom是否存在// antd弹窗(试了只能匹配class才比较好控制)if(e.target.closest(".ant-modal-wrap")){return;}// 其他情况 → 关闭this.setState({ isShow: false });};onDelete = ()=>{Modal.confirm({title: `确认删除吗?`,content: "",// centered: true,zIndex: 1500,okText: "确认",cancelText: "取消",onOk: () => {}})}togglePopover = ()=>{this.setState({isShow:!this.state.isShow})}render() {const content =  (<div style={{ width: "1100px"}} ref={(node) => (this.popoverRef = node)}><div><div><div><Selectstyle={{width:"200px"}}allowClear placeholder={"请选择"}{/*下拉列表默认添加到body,绑定到父组件,避免点击下拉框隐藏当前content*/}getPopupContainer={triggerNode => triggerNode.parentNode}><Select.Option value="all" key="all">全部</Select.Option></Select></div><div><DatePicker{/*下拉列表默认添加到body,绑定到父组件,避免点击下拉框隐藏当前content*/}getCalendarContainer={triggerNode => triggerNode.parentNode}allowClear placeholder={"请选择"}/></div></div></div><div><Button onClick={this.onDelete} type="danger">删除</Button><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div><div><Button>测试</Button></div></div></div>);return (<Popoverplacement="bottomRight"content={content}visible={this.state.isShow}trigger="click"><div  ref={(node) => (this.triggerRef = node)}><Button onClick={this.togglePopover}>切换气泡</Button></div></Popover>)}
}

http://www.dtcms.com/a/285825.html

相关文章:

  • Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框
  • WAF 能防御哪些攻击?
  • logback日志控制服务器日志输出
  • Leetcode刷题营第三十三题:对称二叉树
  • Gitee 远程库多人如何协作?
  • gitlab-runner配置问题记录
  • hive分区表临时加载日批数据文件
  • TapData 出席 2025 MongoDB 用户大会新加坡站,分享构建实时统一数据平台最佳实践
  • day24 力扣93.复原IP地址 力扣78.子集 力扣90.子集II
  • 【基座模型】Qwen3报告总结
  • 告别 addEventListener
  • effective python 条款11 学会对序列做切片
  • 人脸检测算法——SCRFD
  • 智能Agent场景实战指南 Day 16:Agent记忆系统设计
  • 解决 Selenium 页面跳转过快导致的内容获取问题:从原理到实践
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • 大模型格式
  • (一)Eshop(异常处理中间件)
  • 工业数据集成中间件工具OPC Router详细介绍
  • Prompt:开启与AI高效对话的钥匙
  • pycharm windows/linux/mac快捷键
  • Ubuntu18.04开机启动执行脚本
  • 算法-查找算法
  • Git分支管理与Stash技巧:从基础到高级工作流详解
  • C++ - 仿 RabbitMQ 实现消息队列--需求分析与模块设计
  • # Redis-stable 如何在Linux系统上安装和配置
  • 文件流导出文件
  • 小米深圳大厦正式开园,为全球化竞争注入新动能
  • Golang 中 JSON 和 XML 解析与生成的完全指南
  • 一段黄昏小感