当前位置: 首页 > 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.lryc.cn/news/592814.html

相关文章:

  • Agent AI(3):Agent分类
  • Jenkins pipeline 部署docker通用模板
  • 网关-微服务网关入门
  • 《Qt数据库》知识点实践
  • VisualXML全新升级 | 新增BusLoad计算
  • 在 OpenSUSE Tumbleweed 和 Leap 上安装 VirtualBox
  • ChatGPT Agent:统一端到端Agentic模型的技术革新与行业影响
  • Sui 在非洲增长最快的科技市场开设 SuiHub Lagos 以推动创新
  • 质变科技亮相可信数据库发展大会,参编《数据库发展研究报告2025》
  • 读书笔记:《动手做AI Agent》
  • 飞算科技:以创新科技引领数字化变革,旗下飞算 JavaAI 成开发利器
  • 软件工程中的《资本论》
  • KRaft 角色状态设计模式:从状态理解 Raft
  • Redis学习其二(事务,SpringBoot整合,持久化RDB和AOF)
  • java基础——面向对象04(继承)
  • 通俗易懂:什么是决策树?
  • STM32-第七节-TIM定时器-3(输入捕获)
  • STL—— list迭代器封装的底层讲解
  • 小白学Python,网络爬虫篇(2)——selenium库
  • 2025年Flutter开发主流技术栈
  • Windows发现可疑的svchost程序
  • 怎么自己搭建云手机
  • Hive 向量化执行引擎 Vectorized Execution 常见 NPE 报错分析及解决
  • 域名WHOIS信息查询免费API使用指南
  • HIVE实战处理(二十四)留存用户数
  • 专题:2025智能体研究报告|附70份报告PDF、原数据表汇总下载
  • 线程控制:互斥与同步
  • math.h函数
  • 深度学习零基础入门(3)-图像与神经网络
  • 需求变更频繁?构建动态估算机制四大要点