文档管理中心

Popup如何实现点击按钮不关闭气泡,点击按钮外部关闭气泡

问题现象

如何实现点击按钮展示气泡,点击按钮不关闭气泡,仍保持展示状态,但是点击非按钮区域关闭气泡?

背景知识

  • bindPopup为组件绑定Popup气泡,并设置气泡内容、交互逻辑和显示状态。参数show控制气泡显示状态。Popup气泡必须等待页面全部构建完成才能展示,因此show不能在页面构建中设置为true,否则会导致Popup气泡显示位置及形状错误。
  • onTouch触摸事件由手指在组件上按下、滑动或抬起时触发。

解决方案

Popup气泡弹出时,默认有遮罩层(即参数mask默认为true),且页面有操作时气泡自动关闭(即参数autoCancel默认为true)。因此在点击按钮弹出气泡后,遮罩层覆盖整个页面,再次点击按钮,触发气泡自动关闭。

要实现点击按钮气泡不关闭保持展示状态,点击非按钮区域关闭气泡,可以禁用气泡遮罩层,通过为非按钮区域绑定onTouch事件自行处理气泡关闭逻辑。

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. struct PopupForClickButtonNotClose {
  4. @State handlePopup: boolean = false;
  5. @Builder
  6. popupBuilder() {
  7. Row({ space: 2 }) {
  8. Text('这里是自定义气泡的内容')
  9. .textAlign(TextAlign.Center)
  10. .fontSize(10);
  11. }.height(40).padding({ left: 10, right: 10 });
  12. }
  13. build() {
  14. Column({ space: 100 }) {
  15. Button('PopupOptions').margin({ top: 100 })
  16. .onClick(() => {
  17. this.handlePopup = true;
  18. })
  19. .onTouch((e) => {
  20. e.stopPropagation();
  21. }) // 阻止事件传递,避免气泡有关闭再打开的效果
  22. .bindPopup(this.handlePopup, {
  23. builder: this.popupBuilder,
  24. placement: Placement.Bottom,
  25. enableArrow: false, // 气泡弹出时不显示箭头
  26. targetSpace: '15vp',
  27. mask: false,
  28. autoCancel: false,
  29. onStateChange: (e) => {
  30. if (!e.isVisible) {
  31. this.handlePopup = false;
  32. }
  33. }
  34. });
  35. }
  36. .width('100%')
  37. .height('100%')
  38. .onTouch(() => {
  39. this.handlePopup = false;
  40. });
  41. }
  42. }