Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/popup/popup.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,13 @@ name | params | default | description
-- | -- | -- | --
content | String / Slot / Function | - | required。Typescript:`string \| TNode`[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)
popupProps | Object | - | \-
triggerElement | String | - | required
triggerElement | String | - | required

### PopupInstanceFunctions 组件实例方法

name | params | return | description
-- | -- | -- | --
getOverlay | \- | `HTMLElement \| null` | used to get overly html element
getOverlayState | \- | `{ hover: boolean }` | get mouseover state of overlay
getPopper | \- | `Instance \| null` | get the popup component popper instance。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。<br/>`import { Instance } from '@popperjs/core'`<br/>
update | \- | \- | used to update overlay content
13 changes: 11 additions & 2 deletions src/popup/popup.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,17 @@ visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | 当

同时也支持 `this.$popup`。

参数名称 | 参数类型 | 参数默认值 | 参数说明
名称 | 参数 | 返回值 | 描述
-- | -- | -- | --
content | String / Slot / Function | - | 必需。气泡框的内容。TS 类型:`string \| TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)
popupProps | Object | - | 透传气泡框/浮层的属性
triggerElement | String | - | 必需。触发气泡框/浮层的元素,传入选择器即可
triggerElement | String | - | 必需。触发气泡框/浮层的元素,传入选择器即可

### PopupInstanceFunctions 组件实例方法

名称 | 参数 | 返回值 | 描述
-- | -- | -- | --
getOverlay | \- | `HTMLElement \| null` | 获取浮层元素
getOverlayState | \- | `{ hover: boolean }` | 获取浮层悬浮状态
getPopper | \- | `Instance \| null` | 获取当前组件 popper 实例。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。<br/>`import { Instance } from '@popperjs/core'`<br/>
update | \- | \- | 更新浮层内容
29 changes: 27 additions & 2 deletions src/popup/popup.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { VNodeDirective } from 'vue';
import { createPopper } from '@popperjs/core';
import { createPopper, Instance as PopperInstance } from '@popperjs/core';
import { debounce } from 'lodash-es';
import { on, off, once } from '../utils/dom';
import { renderTNodeJSX, renderContent } from '../utils/render-tnode';
Expand Down Expand Up @@ -49,7 +49,7 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
data() {
return {
/** popperjs instance */
popper: null as ReturnType<typeof createPopper>,
popper: null as PopperInstance,
/** timeout id */
timeout: null,
hasDocumentEvent: false,
Expand All @@ -60,6 +60,8 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
contentClicked: false,
/** is popup leaving */
isLeaving: false,
/** is overlay hover */
isOverlayHover: false,
};
},
computed: {
Expand Down Expand Up @@ -231,6 +233,27 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
this.updateScrollTop?.(overlayEl);
}
},
// PopupInstanceFunctions: 获取浮层元素
getOverlay(): HTMLElement | null {
const overlayEl = this.$refs?.overlay as HTMLElement;
return overlayEl;
},

// PopupInstanceFunctions: 获取浮层悬浮状态
getOverlayState(): { hover: boolean } {
return { hover: this.isOverlayHover };
},

// PopupInstanceFunctions: 获取 Popper 实例
getPopper(): PopperInstance | null {
return this.popper;
},

// PopupInstanceFunctions: 更新浮层内容
update() {
this.updatePopper();
},

getOverlayStyle() {
const { overlayStyle } = this;
const triggerEl = this.$el as HTMLElement;
Expand Down Expand Up @@ -334,6 +357,7 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
}
},
onMouseEnter() {
this.isOverlayHover = true;
if (this.destroyOnClose && this.isLeaving) {
// 如果 popup 在关闭的时候会被销毁,那在它消失的过程中,不响应鼠标进入事件,因为否则不会触发 mouseleave
return;
Expand All @@ -342,6 +366,7 @@ export default mixins(classPrefixMixins, getAttachConfigMixins('popup')).extend(
this.handleOpen({});
},
onMouseLeave(ev: MouseEvent) {
this.isOverlayHover = false;
// 子元素存在打开的 popup 时,ui 可能重叠,而 dom 节点多是并列关系
// 需要做碰撞检测去阻止父级 popup 关闭
if (this.visibleState > 1) {
Expand Down
25 changes: 25 additions & 0 deletions src/popup/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
* */

import { Instance } from '@popperjs/core';
import { TNode, ClassName, Styles, AttachNode } from '../common';

export interface TdPopupProps {
Expand Down Expand Up @@ -89,6 +90,10 @@ export interface TdPopupProps {
* 组件层级,Web 侧样式默认为 5500,移动端和小程序样式默认为 1500
*/
zIndex?: number;
/**
* 内容面板点击时触发
*/
onOverlayClick?: (context: { e: MouseEvent }) => void;
/**
* 下拉选项滚动事件
*/
Expand All @@ -103,6 +108,26 @@ export interface TdPopupProps {
onVisibleChange?: (visible: boolean, context: PopupVisibleChangeContext) => void;
}

/** 组件实例方法 */
export interface PopupInstanceFunctions {
/**
* 获取浮层元素
*/
getOverlay?: () => HTMLElement | null;
/**
* 获取浮层悬浮状态
*/
getOverlayState?: () => { hover: boolean };
/**
* 获取当前组件 popper 实例
*/
getPopper?: () => Instance | null;
/**
* 更新浮层内容
*/
update?: () => void;
}

export type PopupPlacement =
| 'top'
| 'left'
Expand Down
Loading