diff --git a/src/date-picker/DatePicker.tsx b/src/date-picker/DatePicker.tsx index b74afdd69..fe6b5583d 100644 --- a/src/date-picker/DatePicker.tsx +++ b/src/date-picker/DatePicker.tsx @@ -41,6 +41,7 @@ export default defineComponent({ time, inputRef, onChange, + closePopup, } = useSingle(props, { emit }); const formatRef = computed(() => getDefaultFormat({ @@ -103,7 +104,7 @@ export default defineComponent({ } // 日期点击 - function onCellClick(date: Date) { + function onCellClick(date: Date, { e }: { e: MouseEvent }) { isHoverCell.value = false; // date 模式自动切换年月 if (props.mode === 'date') { @@ -133,7 +134,7 @@ export default defineComponent({ trigger: 'pick', }, ); - popupVisible.value = false; + closePopup({ e }); } props.onPick?.(date); @@ -219,7 +220,7 @@ export default defineComponent({ format: formatRef.value.format, }); } - popupVisible.value = false; + closePopup({ e }); } // 预设 @@ -237,7 +238,7 @@ export default defineComponent({ ); props.onPresetClick?.(context); emit('preset-click', context); - popupVisible.value = false; + closePopup({ e: context?.e }); } function onYearChange(nextYear: number) { @@ -290,7 +291,7 @@ export default defineComponent({ const onTagClearClick = ({ e }: { e: MouseEvent }) => { e.stopPropagation(); - popupVisible.value = false; + closePopup({ e }); onChange?.([], { dayjsValue: dayjs(), trigger: 'clear' }); }; diff --git a/src/date-picker/DateRangePicker.tsx b/src/date-picker/DateRangePicker.tsx index d6e6c85e8..7c1e72105 100644 --- a/src/date-picker/DateRangePicker.tsx +++ b/src/date-picker/DateRangePicker.tsx @@ -46,6 +46,7 @@ export default defineComponent({ isHoverCell, isFirstValueSelected, onChange, + closePopup, } = useRange(props, { emit }); const formatRef = computed(() => getDefaultFormat({ @@ -189,7 +190,7 @@ export default defineComponent({ activeIndex.value = nextIndex; isFirstValueSelected.value = true; } else { - popupVisible.value = false; + closePopup({ e }); } } @@ -307,7 +308,7 @@ export default defineComponent({ activeIndex.value = nextIndex; isFirstValueSelected.value = true; } else if (nextValue.length === 2) { - popupVisible.value = false; + closePopup({ e }); } } @@ -331,7 +332,7 @@ export default defineComponent({ trigger: 'preset', }, ); - popupVisible.value = false; + closePopup({ e: context?.e }); props.onPresetClick?.(context); emit('preset-click', context); } diff --git a/src/date-picker/__tests__/index.test.jsx b/src/date-picker/__tests__/index.test.jsx index c2517e454..bb7a7c2e8 100644 --- a/src/date-picker/__tests__/index.test.jsx +++ b/src/date-picker/__tests__/index.test.jsx @@ -238,4 +238,137 @@ describe('DatePicker', () => { expect(blurFn).toBeCalledTimes(1); }); }); + + // test popupProps.onVisibleChange + describe('popupProps.onVisibleChange', () => { + afterEach(() => { + document.querySelectorAll('.t-popup').forEach((node) => node?.remove()); + }); + + const getLatestPanel = () => { + const panels = document.querySelectorAll('.t-date-picker__panel-container'); + return panels[panels.length - 1]; + }; + + it('点击清除按钮关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-input').trigger('click'); + await nextTick(); + // hover 输入框以显示清除按钮 + wrapper.find('.t-input').trigger('mouseenter'); + await nextTick(); + // 触发清除 + wrapper.find('.t-input__suffix-clear').trigger('click'); + await nextTick(); + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close, 且带事件对象 + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + + it('选日期后关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-input').trigger('click'); + await nextTick(); + await nextTick(); + await nextTick(); // 等待面板完全打开 + onVisibleChange.mockClear(); + // 点击日期 + const cell = getLatestPanel()?.querySelector( + '.t-date-picker__panel-date .t-date-picker__cell:not(.t-is-disabled)', + ); + if (cell) { + cell.click(); + } + await nextTick(); + await nextTick(); // 等待面板关闭动画完成 + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + + it('点击预设按钮关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const presets = { + 昨天: dayjs().subtract(1, 'day').format('YYYY-MM-DD'), + }; + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-input').trigger('click'); + await nextTick(); + await nextTick(); + onVisibleChange.mockClear(); + // 点击预设按钮 + const presetButton = getLatestPanel()?.querySelector('.t-date-picker__presets .t-button'); + if (presetButton) { + presetButton.click(); + } + await nextTick(); + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + + it('readonly 状态下不触发关闭事件', async () => { + const onVisibleChange = vi.fn(); + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-input').trigger('click'); + await nextTick(); + // hover 输入框以显示清除按钮 + wrapper.find('.t-input').trigger('mouseenter'); + await nextTick(); + // 触发清除 + wrapper.find('.t-input__suffix-clear').trigger('click'); + await nextTick(); + // 验证 onVisibleChange 没有被调用(readonly 状态) + expect(onVisibleChange).not.toHaveBeenCalled(); + }); + }); }); diff --git a/src/date-picker/__tests__/rangepicker.test.jsx b/src/date-picker/__tests__/rangepicker.test.jsx index 0ac163770..6cf3fe6db 100644 --- a/src/date-picker/__tests__/rangepicker.test.jsx +++ b/src/date-picker/__tests__/rangepicker.test.jsx @@ -3,7 +3,7 @@ import MockDate from 'mockdate'; import { nextTick } from 'vue'; import { BrowseIcon, LockOnIcon } from 'tdesign-icons-vue'; import dayjs from 'dayjs'; -import DateRangePicker from '@/src/date-picker/index.ts'; +import DateRangePicker, { DateRangePicker as RealDateRangePicker } from '@/src/date-picker/index.ts'; import DateRangePickerPanel from '@/src/date-picker/DateRangePickerPanel'; // 固定时间,当使用 new Date() 时,返回固定时间,防止“当前时间”的副作用影响,导致 snapshot 变更,mockdate 插件见 https://github.com/boblauer/MockDate @@ -276,4 +276,126 @@ describe('DateRangePicker', () => { expect(panels.length).toBe(2); }); }); + + // test popupProps.onVisibleChange + describe('popupProps.onVisibleChange', () => { + afterEach(() => { + document.querySelectorAll('.t-popup').forEach((node) => node?.remove()); + }); + + const getLatestPanel = () => { + const panels = document.querySelectorAll('.t-date-picker__panel-container, .t-date-range-picker__panel'); + return panels[panels.length - 1]; + }; + + it('点击清除按钮关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const wrapper = mount( + { + render() { + return ( + + ); + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-range-input').trigger('click'); + await nextTick(); + // hover 输入框以显示清除按钮 + wrapper.find('.t-range-input').trigger('mouseenter'); + await nextTick(); + // 触发清除 + wrapper.find('.t-range-input__suffix-clear').trigger('click'); + await nextTick(); + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close, 且带事件对象 + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + + it('选完日期范围后关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-range-input').trigger('click'); + await nextTick(); + await nextTick(); + await nextTick(); // 等待面板完全打开 + onVisibleChange.mockClear(); + // 点击第一个日期 + const panel = getLatestPanel(); + expect(panel).toBeTruthy(); + let cells = panel.querySelectorAll('.t-date-picker__panel-date .t-date-picker__cell:not(.t-is-disabled)'); + if (cells.length >= 2) { + cells[5].click(); // 选择第一个日期 + await nextTick(); + await nextTick(); // 等待第一个日期选择完成 + cells = panel.querySelectorAll('.t-date-picker__panel-date .t-date-picker__cell:not(.t-is-disabled)'); + cells[12].click(); // 选择第二个日期 + await nextTick(); + await nextTick(); // 等待面板关闭动画完成 + } + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + + it('点击预设按钮关闭面板时触发 onVisibleChange,visible=false 且 trigger=trigger-element-close', async () => { + const onVisibleChange = vi.fn(); + const presets = { + 昨天: [dayjs().subtract(7, 'day').format('YYYY-MM-DD'), dayjs().subtract(1, 'day').format('YYYY-MM-DD')], + }; + const wrapper = mount( + { + render() { + return ; + }, + }, + { attachTo: document.body }, + ); + // 打开面板 + wrapper.find('.t-range-input').trigger('click'); + await nextTick(); + await nextTick(); + await nextTick(); // 等待面板完全打开 + onVisibleChange.mockClear(); + // 点击预设按钮 + const presetButton = getLatestPanel()?.querySelector('.t-date-picker__presets .t-button'); + if (presetButton) { + presetButton.click(); + await nextTick(); + await nextTick(); // 等待面板关闭动画完成 + } + // 验证 onVisibleChange 被调用过:visible=false, trigger=trigger-element-close + expect(onVisibleChange).toHaveBeenCalledWith( + false, + expect.objectContaining({ + trigger: 'trigger-element-close', + e: expect.anything(), + }), + ); + }); + }); }); diff --git a/src/date-picker/hooks/usePopupVisibleChange.ts b/src/date-picker/hooks/usePopupVisibleChange.ts new file mode 100644 index 000000000..96927a9f9 --- /dev/null +++ b/src/date-picker/hooks/usePopupVisibleChange.ts @@ -0,0 +1,46 @@ +import { ref } from '@vue/composition-api'; +import type { PopupProps, PopupVisibleChangeContext } from '../../popup'; + +export interface UsePopupVisibleChangeParams { + readonly?: boolean; + popupProps?: PopupProps; +} + +// 兼容模板 kebab-case 写法(与 Popup / Dropdown 一致) +type KebabPopupProps = PopupProps & { 'on-visible-change'?: PopupProps['onVisibleChange'] }; + +/** + * 统一通知 popupProps.onVisibleChange 并完成受控关闭。 + * 底层 Popup 仅在用户交互时 emit visible-change,程序化关闭不会触发,故此处主动补发,保持单选/范围一致。 + * popupVisible 由本 hook 内部持有(closePopup 直接改写),避免外部传入 ref 后被重新赋值; + * 程序化关闭(选日期/确认/预设/清除)统一标记 trigger: 'trigger-element-close',消费方可据此区分关闭来源。 + */ +export default function usePopupVisibleChange({ readonly, popupProps }: UsePopupVisibleChangeParams) { + // popupVisible 由本 hook 持有,供调用方读写(打开面板、受控同步等) + const popupVisible = ref(false); + + /** + * 通知 popupProps.onVisibleChange + * @param visible 当前是否可见 + * @param context 触发上下文 + */ + const notifyPopupVisibleChange = (visible: boolean, context?: PopupVisibleChangeContext) => { + if (readonly) return; + // 兼容模板 kebab-case 写法(与 Popup / Dropdown 一致),优先 camelCase + const kebabHandler = (popupProps as KebabPopupProps | undefined)?.['on-visible-change']; + const handler = popupProps?.onVisibleChange ?? kebabHandler; + handler?.(visible, context); + }; + + /** + * 关闭面板 + * @param context 触发上下文,用于通知 popupProps.onVisibleChange + */ + const closePopup = (context?: PopupVisibleChangeContext) => { + if (!popupVisible.value || readonly) return; + notifyPopupVisibleChange(false, { trigger: 'trigger-element-close', ...context }); + popupVisible.value = false; + }; + + return { popupVisible, notifyPopupVisibleChange, closePopup }; +} diff --git a/src/date-picker/hooks/useRange.ts b/src/date-picker/hooks/useRange.ts index a36a485f4..f8c5723c0 100644 --- a/src/date-picker/hooks/useRange.ts +++ b/src/date-picker/hooks/useRange.ts @@ -6,6 +6,7 @@ import { isValidDate, formatDate, getDefaultFormat, parseToDayjs, } from '../../_common/js/date-picker/format'; import useRangeValue from './useRangeValue'; +import usePopupVisibleChange from './usePopupVisibleChange'; export const PARTIAL_MAP = { first: 'start', second: 'end' }; @@ -27,11 +28,15 @@ export default function useRange(props: TdDateRangePickerProps, { emit }: any) { enableTimePicker: props.enableTimePicker, })); - const popupVisible = ref(false); const isHoverCell = ref(false); const activeIndex = ref(0); // 确定当前选中的输入框序号 const inputValue = ref(formatDate(value.value, { format: formatRef.value.format })); // 未真正选中前可能不断变更输入框的内容 + const { popupVisible, notifyPopupVisibleChange, closePopup } = usePopupVisibleChange({ + readonly: props.readonly, + popupProps: props.popupProps, + }); + // input 设置 const rangeInputProps = computed(() => ({ ...props.rangeInputProps, @@ -52,7 +57,7 @@ export default function useRange(props: TdDateRangePickerProps, { emit }: any) { }, onClear: ({ e }: { e: MouseEvent }) => { e.stopPropagation(); - popupVisible.value = false; + closePopup({ e }); onChange?.([], { dayjsValue: [], trigger: 'clear' }); emit('clear', [], { dayjsValue: [], trigger: 'clear' }); }, @@ -86,7 +91,7 @@ export default function useRange(props: TdDateRangePickerProps, { emit }: any) { onEnter: (newVal: string[]) => { if (!isValidDate(newVal, formatRef.value.format) && !isValidDate(value.value, formatRef.value.format)) return; - popupVisible.value = false; + closePopup(); if (isValidDate(newVal, formatRef.value.format)) { onChange?.( formatDate(newVal, { @@ -117,7 +122,7 @@ export default function useRange(props: TdDateRangePickerProps, { emit }: any) { overlayClassName: [props.popupProps?.overlayClassName, `${COMPONENT_NAME.value}__panel-container`], onVisibleChange: (visible: boolean, context: any) => { // 这里劫持了进一步向 popup 传递的 onVisibleChange 事件,为了保证可以在 Datepicker 中使用 popupProps.onVisibleChange,故此处理 - props.popupProps?.onVisibleChange?.(visible, context); + notifyPopupVisibleChange(visible, context); // 输入框点击不关闭面板 if (context.trigger === 'trigger-element-click') { const indexMap = { 0: 'first', 1: 'second' }; @@ -172,5 +177,6 @@ export default function useRange(props: TdDateRangePickerProps, { emit }: any) { isFirstValueSelected, cacheValue, onChange, + closePopup, }; } diff --git a/src/date-picker/hooks/useSingle.ts b/src/date-picker/hooks/useSingle.ts index 1f759f021..d968c2c03 100644 --- a/src/date-picker/hooks/useSingle.ts +++ b/src/date-picker/hooks/useSingle.ts @@ -12,6 +12,7 @@ import { parseToDayjs, } from '../../_common/js/date-picker/format'; import useSingleValue from './useSingleValue'; +import usePopupVisibleChange from './usePopupVisibleChange'; import { TdInputProps } from '../../input/type'; export default function useSingle(props: TdDatePickerProps, { emit }: any) { @@ -30,8 +31,11 @@ export default function useSingle(props: TdDatePickerProps, { emit }: any) { enableTimePicker: props.multiple ? false : props.enableTimePicker, })); - const popupVisible = ref(false); const isHoverCell = ref(false); + // DatePicker 无 readonly 概念,省略 readonly(undefined 即非只读) + const { popupVisible, notifyPopupVisibleChange, closePopup } = usePopupVisibleChange({ + popupProps: props.popupProps, + }); // 未真正选中前可能不断变更输入框的内容 const inputValue = ref(formatDate(value.value, { format: formatRef.value.format })); @@ -48,9 +52,9 @@ export default function useSingle(props: TdDatePickerProps, { emit }: any) { [`${COMPONENT_NAME.value}__input--placeholder`]: isHoverCell.value, }, ], - onClear: (context: { e: InputEvent }) => { + onClear: (context: { e: MouseEvent }) => { context?.e?.stopPropagation(); - popupVisible.value = false; + closePopup({ e: context.e }); onChange?.('', { dayjsValue: dayjs(), trigger: 'clear' }); emit('clear', '', { dayjsValue: dayjs(), trigger: 'clear' }); }, @@ -79,13 +83,13 @@ export default function useSingle(props: TdDatePickerProps, { emit }: any) { onEnter: (val: string) => { if (!val) { onChange?.('', { dayjsValue: dayjs(), trigger: 'enter' }); - popupVisible.value = false; + closePopup(); return; } if (!isValidDate(val, formatRef.value.format) && !isValidDate(value.value, formatRef.value.format)) return; - popupVisible.value = false; + closePopup(); if (isValidDate(val, formatRef.value.format)) { onChange?.( formatDate(val, { format: formatRef.value.format, targetFormat: formatRef.value.valueType }) as DateValue, @@ -115,7 +119,7 @@ export default function useSingle(props: TdDatePickerProps, { emit }: any) { overlayClassName: [props.popupProps?.overlayClassName, `${COMPONENT_NAME.value}__panel-container`], onVisibleChange: (visible: boolean, context: any) => { // 这里劫持了进一步向 popup 传递的 onVisibleChange 事件,为了保证可以在 Datepicker 中使用 popupProps.onVisibleChange,故此处理 - props.popupProps?.onVisibleChange?.(visible, context); + notifyPopupVisibleChange(visible, context); // 输入框点击不关闭面板 if (context.trigger === 'trigger-element-click') { popupVisible.value = true; @@ -154,5 +158,6 @@ export default function useSingle(props: TdDatePickerProps, { emit }: any) { cacheValue, isHoverCell, onChange, + closePopup, }; } diff --git a/src/date-picker/type.ts b/src/date-picker/type.ts index dd8994c52..60c69b26c 100644 --- a/src/date-picker/type.ts +++ b/src/date-picker/type.ts @@ -209,7 +209,7 @@ export interface TdDateRangePickerProps { /** * 是否只读 */ - readonly?: Boolean; + readonly?: boolean; /** * 是否显示时间选择 * @default false diff --git a/src/popup/popup.en-US.md b/src/popup/popup.en-US.md index da6341ac9..fa8340190 100644 --- a/src/popup/popup.en-US.md +++ b/src/popup/popup.en-US.md @@ -6,29 +6,29 @@ name | type | default | description | required -- | -- | -- | -- | -- -attach | String / Function | 'body' | Typescript:`AttachNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -content | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -default | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -delay | Number / Array | - | delay to show or hide popover。Typescript:`number \| Array` | N +attach | String / Function | 'body' | Typescript: `AttachNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +content | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +default | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +delay | Number / Array | - | delay to show or hide popover。Typescript: `number \| Array` | N destroyOnClose | Boolean | false | \- | N disabled | Boolean | - | \- | N hideEmptyPopup | Boolean | false | \- | N -overlayClassName | String / Object / Array | - | Typescript:`ClassName`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -overlayInnerClassName | String / Object / Array | - | Typescript:`ClassName`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -overlayInnerStyle | Boolean / Object / Function | - | Typescript:`Styles \| ((triggerElement: HTMLElement, popupElement: HTMLElement) => Styles)`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -overlayStyle | Boolean / Object / Function | - | Typescript:`Styles \| ((triggerElement: HTMLElement, popupElement: HTMLElement) => Styles)`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -placement | String | top | Typescript:`PopupPlacement` `type PopupPlacement = 'top'\|'left'\|'right'\|'bottom'\|'top-left'\|'top-right'\|'bottom-left'\|'bottom-right'\|'left-top'\|'left-bottom'\|'right-top'\|'right-bottom'`。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts) | N +overlayClassName | String / Object / Array | - | Typescript: `ClassName`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +overlayInnerClassName | String / Object / Array | - | Typescript: `ClassName`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +overlayInnerStyle | Boolean / Object / Function | - | Typescript: `Styles \| ((triggerElement: HTMLElement, popupElement: HTMLElement) => Styles)`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +overlayStyle | Boolean / Object / Function | - | Typescript: `Styles \| ((triggerElement: HTMLElement, popupElement: HTMLElement) => Styles)`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +placement | String | top | Typescript: `PopupPlacement` `type PopupPlacement = 'top'\|'left'\|'right'\|'bottom'\|'top-left'\|'top-right'\|'bottom-left'\|'bottom-right'\|'left-top'\|'left-bottom'\|'right-top'\|'right-bottom'`。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts) | N popperOptions | Object | - | popper initial options,details refer to https://popper.js.org/docs | N showArrow | Boolean | false | \- | N trigger | String | hover | options: hover/click/focus/mousedown/context-menu | N -triggerElement | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -visible | Boolean | - | `v-model` is supported。Typescript:`boolean` | N -defaultVisible | Boolean | - | uncontrolled property。Typescript:`boolean` | N +triggerElement | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +visible | Boolean | - | `v-model` is supported。Typescript: `boolean` | N +defaultVisible | Boolean | - | uncontrolled property。Typescript: `boolean` | N zIndex | Number | - | \- | N -onOverlayClick | Function | | Typescript:`(context: { e: MouseEvent }) => void`
trigger on popup content click | N -onScroll | Function | | Typescript:`(context: { e: WheelEvent }) => void`
| N -onScrollToBottom | Function | | Typescript:`(context: { e: WheelEvent }) => void`
| N -onVisibleChange | Function | | Typescript:`(visible: boolean, context: PopupVisibleChangeContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'context-menu' \| 'keydown-esc'`
| N +onOverlayClick | Function | | Typescript: `(context: { e: MouseEvent }) => void`
trigger on popup content click | N +onScroll | Function | | Typescript: `(context: { e: WheelEvent }) => void`
| N +onScrollToBottom | Function | | Typescript: `(context: { e: WheelEvent }) => void`
| N +onVisibleChange | Function | | Typescript: `(visible: boolean, context: PopupVisibleChangeContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'trigger-element-close' \| 'context-menu' \| 'keydown-esc'`
| N ### Popup Events @@ -37,17 +37,7 @@ name | params | description overlay-click | `(context: { e: MouseEvent })` | trigger on popup content click scroll | `(context: { e: WheelEvent })` | \- scroll-to-bottom | `(context: { e: WheelEvent })` | \- -visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'context-menu' \| 'keydown-esc'`
- -### PopupPlugin - -support `this.$popup` - -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 +visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'trigger-element-close' \| 'context-menu' \| 'keydown-esc'`
### PopupInstanceFunctions 组件实例方法 diff --git a/src/popup/popup.md b/src/popup/popup.md index 705302399..94d471e3a 100644 --- a/src/popup/popup.md +++ b/src/popup/popup.md @@ -38,7 +38,7 @@ zIndex | Number | - | 组件层级,Web 侧样式默认为 5500,移动端和 onOverlayClick | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
内容面板点击时触发 | N onScroll | Function | | TS 类型:`(context: { e: WheelEvent }) => void`
下拉选项滚动事件 | N onScrollToBottom | Function | | TS 类型:`(context: { e: WheelEvent }) => void`
下拉滚动触底事件,常用于滚动到底执行具体业务逻辑 | N -onVisibleChange | Function | | TS 类型:`(visible: boolean, context: PopupVisibleChangeContext) => void`
当浮层隐藏或显示时触发,`trigger=document` 表示点击非浮层元素触发;`trigger=context-menu` 表示右击触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'context-menu' \| 'keydown-esc'`
| N +onVisibleChange | Function | | TS 类型:`(visible: boolean, context: PopupVisibleChangeContext) => void`
当浮层隐藏或显示时触发,`trigger=document` 表示点击非浮层元素触发;`trigger=context-menu` 表示右击触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'trigger-element-close' \| 'context-menu' \| 'keydown-esc'`
| N ### Popup Events @@ -47,17 +47,7 @@ onVisibleChange | Function | | TS 类型:`(visible: boolean, context: PopupVi overlay-click | `(context: { e: MouseEvent })` | 内容面板点击时触发 scroll | `(context: { e: WheelEvent })` | 下拉选项滚动事件 scroll-to-bottom | `(context: { e: WheelEvent })` | 下拉滚动触底事件,常用于滚动到底执行具体业务逻辑 -visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | 当浮层隐藏或显示时触发,`trigger=document` 表示点击非浮层元素触发;`trigger=context-menu` 表示右击触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'context-menu' \| 'keydown-esc'`
- -### PopupPlugin - -同时也支持 `this.$popup`。 - -名称 | 参数 | 返回值 | 描述 --- | -- | -- | -- -content | String / Slot / Function | - | 必需。气泡框的内容。TS 类型:`string \| TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) -popupProps | Object | - | 透传气泡框/浮层的属性 -triggerElement | String | - | 必需。触发气泡框/浮层的元素,传入选择器即可 +visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | 当浮层隐藏或显示时触发,`trigger=document` 表示点击非浮层元素触发;`trigger=context-menu` 表示右击触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/popup/type.ts)。
`interface PopupVisibleChangeContext { e?: PopupTriggerEvent; trigger?: PopupTriggerSource }`

`type PopupTriggerEvent = MouseEvent \| FocusEvent \| KeyboardEvent`

`type PopupTriggerSource = 'document' \| 'trigger-element-click' \| 'trigger-element-hover' \| 'trigger-element-blur' \| 'trigger-element-focus' \| 'trigger-element-mousedown' \| 'trigger-element-close' \| 'context-menu' \| 'keydown-esc'`
### PopupInstanceFunctions 组件实例方法 diff --git a/src/popup/type.ts b/src/popup/type.ts index 8b3817b9d..79ab3c3f9 100644 --- a/src/popup/type.ts +++ b/src/popup/type.ts @@ -5,7 +5,7 @@ * */ import { Instance } from '@popperjs/core'; -import { TNode, ClassName, Styles, AttachNode } from '../common'; +import type { TNode, ClassName, Styles, AttachNode } from '../common'; export interface TdPopupProps { /** @@ -156,5 +156,6 @@ export type PopupTriggerSource = | 'trigger-element-blur' | 'trigger-element-focus' | 'trigger-element-mousedown' + | 'trigger-element-close' | 'context-menu' | 'keydown-esc'; diff --git a/src/tree-select/tree-select.en-US.md b/src/tree-select/tree-select.en-US.md index 957240042..f03d04348 100644 --- a/src/tree-select/tree-select.en-US.md +++ b/src/tree-select/tree-select.en-US.md @@ -10,52 +10,52 @@ autoWidth | Boolean | false | \- | N autofocus | Boolean | false | \- | N borderless | Boolean | false | \- | N clearable | Boolean | false | \- | N -collapsedItems | Slot / Function | - | Typescript:`TNode<{ value: DataOption[]; collapsedSelectedItems: DataOption[]; count: number; onClose: (context: { index: number, e?: MouseEvent }) => void }>`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -data | Array | [] | Typescript:`Array` | N -disabled | Boolean | - | \- | N -empty | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -filter | Function | - | Typescript:`(filterWords: string, option: DataOption) => boolean` | N +collapsedItems | Slot / Function | - | Typescript: `TNode<{ value: DataOption[]; collapsedSelectedItems: DataOption[]; count: number; onClose: (context: { index: number, e?: MouseEvent }) => void }>`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +data | Array | [] | Typescript: `Array` | N +disabled | Boolean | undefined | \- | N +empty | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +filter | Function | - | Typescript: `(filterWords: string, option: DataOption) => boolean` | N filterable | Boolean | false | \- | N -inputProps | Object | - | Typescript:`InputProps`,[Input API Documents](./input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -inputValue | String / Number | - | input value。`.sync` is supported。Typescript:`InputValue`,[Input API Documents](./input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -defaultInputValue | String / Number | - | input value。uncontrolled property。Typescript:`InputValue`,[Input API Documents](./input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -keys | Object | - | alias filed name in data。Typescript:`TreeKeysType`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -label | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +inputProps | Object | - | Typescript: `InputProps`,[Input API Documents](./input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +inputValue | String / Number | - | input value。`.sync` is supported。Typescript: `string` | N +defaultInputValue | String / Number | - | input value。uncontrolled property。Typescript: `string` | N +keys | Object | - | alias filed name in data。Typescript: `TreeKeysType`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +label | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N loading | Boolean | false | \- | N -loadingText | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +loadingText | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N max | Number | 0 | \- | N minCollapsedNum | Number | 0 | \- | N multiple | Boolean | false | \- | N -panelBottomContent | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -panelTopContent | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +panelBottomContent | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +panelTopContent | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N placeholder | String | undefined | \- | N -popupProps | Object | - | Typescript:`PopupProps`,[Popup API Documents](./popup?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +popupProps | Object | - | Typescript: `PopupProps`,[Popup API Documents](./popup?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N popupVisible | Boolean | undefined | show popup。`.sync` is supported | N defaultPopupVisible | Boolean | undefined | show popup。uncontrolled property | N prefixIcon | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N readonly | Boolean | false | \- | N reserveKeyword | Boolean | false | \- | N -selectInputProps | Object | - | Typescript:`SelectInputProps`,[SelectInput API Documents](./select-input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +selectInputProps | Object | - | Typescript: `SelectInputProps`,[SelectInput API Documents](./select-input?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N size | String | medium | options: small/medium/large | N status | String | default | options: default/success/warning/error | N -suffix | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -suffixIcon | Slot / Function | - | Typescript:`TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -tagProps | Object | - | Typescript:`TagProps`,[Tag API Documents](./tag?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -tips | String / Slot / Function | - | Typescript:`string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N -treeProps | Object | - | Typescript:`TreeProps`,[Tree API Documents](./tree?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -value | String / Number / Object / Array | - | `v-model` is supported。Typescript:`TreeValueType` `type TreeSelectValue = string \| number \| TreeOptionData \| Array`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -defaultValue | String / Number / Object / Array | - | uncontrolled property。Typescript:`TreeValueType` `type TreeSelectValue = string \| number \| TreeOptionData \| Array`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N -valueDisplay | Slot / Function | - | Typescript:`string \| TNode<{ value: TreeOptionData \| TreeOptionData[]; onClose: (index: number) => void }>`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +suffix | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +suffixIcon | Slot / Function | - | Typescript: `TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +tagProps | Object | - | Typescript: `TagProps`,[Tag API Documents](./tag?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +tips | String / Slot / Function | - | Typescript: `string \| TNode`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N +treeProps | Object | - | Typescript: `TreeProps`,[Tree API Documents](./tree?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +value | String / Number / Object / Array | - | `v-model` is supported。Typescript: `TreeValueType` `type TreeSelectValue = string \| number \| TreeOptionData \| Array`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +defaultValue | String / Number / Object / Array | - | uncontrolled property。Typescript: `TreeValueType` `type TreeSelectValue = string \| number \| TreeOptionData \| Array`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts) | N +valueDisplay | Slot / Function | - | Typescript: `string \| TNode<{ value: TreeOptionData \| TreeOptionData[]; onClose: (index: number) => void }>`。[see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N valueType | String | value | options: value/object | N -onBlur | Function | | Typescript:`(context: SelectInputBlurContext & { value: TreeSelectValue }) => void`
| N -onChange | Function | | Typescript:`(value: TreeValueType, context: TreeSelectChangeContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`interface TreeSelectChangeContext { node: TreeNodeModel; data: DataOption; index?: number; trigger: TreeSelectValueChangeTrigger; e?: MouseEvent \| KeyboardEvent \| Event }`

`type TreeSelectValueChangeTrigger = 'clear' \| 'tag-remove' \| 'backspace' \| 'check' \| 'uncheck'`
| N -onClear | Function | | Typescript:`(context: { e: MouseEvent }) => void`
| N -onEnter | Function | | Typescript:`(context: { inputValue: string; e: KeyboardEvent; value: TreeValueType }) => void`
| N -onFocus | Function | | Typescript:`(context: { value: TreeSelectValue; e: FocusEvent }) => void`
| N -onInputChange | Function | | Typescript:`(value: InputValue, context: SelectInputValueChangeContext) => void`
| N -onPopupVisibleChange | Function | | Typescript:`(visible: boolean, context: TreeSelectPopupVisibleContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent \| Event; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
| N -onRemove | Function | | Typescript:`(options: RemoveOptions) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`export interface RemoveOptions { value: N; data: T; index: number; node: TreeNodeModel; e?: MouseEvent \| KeyboardEvent; trigger: 'tag-remove' \| 'backspace'; }`
| N -onSearch | Function | | Typescript:`(filterWords: string, context: { e: KeyboardEvent \| SelectInputValueChangeContext['e'] }) => void`
| N +onBlur | Function | | Typescript: `(context: SelectInputBlurContext & { value: TreeSelectValue }) => void`
| N +onChange | Function | | Typescript: `(value: TreeValueType, context: TreeSelectChangeContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`interface TreeSelectChangeContext { node: TreeNodeModel; data: DataOption; index?: number; trigger: TreeSelectValueChangeTrigger; e?: MouseEvent \| KeyboardEvent \| Event }`

`type TreeSelectValueChangeTrigger = 'clear' \| 'tag-remove' \| 'backspace' \| 'check' \| 'uncheck'`
| N +onClear | Function | | Typescript: `(context: { e: MouseEvent }) => void`
| N +onEnter | Function | | Typescript: `(context: { inputValue: InputValue; e: KeyboardEvent; value: TreeValueType }) => void`
| N +onFocus | Function | | Typescript: `(context: { value: TreeSelectValue; e: FocusEvent }) => void`
| N +onInputChange | Function | | Typescript: `(value: InputValue, context: SelectInputValueChangeContext) => void`
| N +onPopupVisibleChange | Function | | Typescript: `(visible: boolean, context: TreeSelectPopupVisibleContext) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
| N +onRemove | Function | | Typescript: `(options: RemoveOptions) => void`
[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`export interface RemoveOptions { value: N; data: T; index: number; node: TreeNodeModel; e?: MouseEvent \| KeyboardEvent; trigger: 'tag-remove' \| 'backspace'; }`
| N +onSearch | Function | | Typescript: `(filterWords: string, context: { e: KeyboardEvent \| SelectInputValueChangeContext['e'] }) => void`
| N ### TreeSelect Events @@ -67,6 +67,6 @@ clear | `(context: { e: MouseEvent })` | \- enter | `(context: { inputValue: string; e: KeyboardEvent; value: TreeValueType })` | \- focus | `(context: { value: TreeSelectValue; e: FocusEvent })` | \- input-change | `(value: InputValue, context: SelectInputValueChangeContext)` | \- -popup-visible-change | `(visible: boolean, context: TreeSelectPopupVisibleContext)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent \| Event; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
+popup-visible-change | `(visible: boolean, context: TreeSelectPopupVisibleContext)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
remove | `(options: RemoveOptions)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`export interface RemoveOptions { value: N; data: T; index: number; node: TreeNodeModel; e?: MouseEvent \| KeyboardEvent; trigger: 'tag-remove' \| 'backspace'; }`
search | `(filterWords: string, context: { e: KeyboardEvent \| SelectInputValueChangeContext['e'] })` | \- diff --git a/src/tree-select/tree-select.md b/src/tree-select/tree-select.md index 87c9aaf1b..fa5dc0bb3 100644 --- a/src/tree-select/tree-select.md +++ b/src/tree-select/tree-select.md @@ -53,7 +53,7 @@ onClear | Function | | TS 类型:`(context: { e: MouseEvent }) => void`
onEnter | Function | | TS 类型:`(context: { inputValue: string; e: KeyboardEvent; value: TreeValueType }) => void`
回车键按下时触发。`inputValue` 表示输入框的值,`value` 表示选中值。泛型 `TreeValueType` 继承 `TreeSelectValue` | N onFocus | Function | | TS 类型:`(context: { value: TreeSelectValue; e: FocusEvent }) => void`
输入框获得焦点时触发 | N onInputChange | Function | | TS 类型:`(value: InputValue, context: SelectInputValueChangeContext) => void`
输入框值发生变化时触发,`context.trigger` 表示触发输入框值变化的来源:文本输入触发、清除按钮触发、失去焦点等 | N -onPopupVisibleChange | Function | | TS 类型:`(visible: boolean, context: TreeSelectPopupVisibleContext) => void`
下拉框显示或隐藏时触发。单选场景,选中某个选项时触发关闭,此时需要添加参数 `node`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent \| Event; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
| N +onPopupVisibleChange | Function | | TS 类型:`(visible: boolean, context: TreeSelectPopupVisibleContext) => void`
下拉框显示或隐藏时触发。单选场景,选中某个选项时触发关闭,此时需要添加参数 `node`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
| N onRemove | Function | | TS 类型:`(options: RemoveOptions) => void`
多选模式下,选中数据被移除时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`export interface RemoveOptions { value: N; data: T; index: number; node: TreeNodeModel; e?: MouseEvent \| KeyboardEvent; trigger: 'tag-remove' \| 'backspace'; }`
| N onSearch | Function | | TS 类型:`(filterWords: string, context: { e: KeyboardEvent \| SelectInputValueChangeContext['e'] }) => void`
输入值变化时,触发搜索事件。主要用于远程搜索新数据。设置 `filterable=true` 开启此功能。优先级高于本地数据搜索 `filter`,即一旦存在这个远程搜索事件 `filter` 失效 | N @@ -67,6 +67,6 @@ clear | `(context: { e: MouseEvent })` | 点击清除按钮时触发 enter | `(context: { inputValue: string; e: KeyboardEvent; value: TreeValueType })` | 回车键按下时触发。`inputValue` 表示输入框的值,`value` 表示选中值。泛型 `TreeValueType` 继承 `TreeSelectValue` focus | `(context: { value: TreeSelectValue; e: FocusEvent })` | 输入框获得焦点时触发 input-change | `(value: InputValue, context: SelectInputValueChangeContext)` | 输入框值发生变化时触发,`context.trigger` 表示触发输入框值变化的来源:文本输入触发、清除按钮触发、失去焦点等 -popup-visible-change | `(visible: boolean, context: TreeSelectPopupVisibleContext)` | 下拉框显示或隐藏时触发。单选场景,选中某个选项时触发关闭,此时需要添加参数 `node`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent \| Event; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
+popup-visible-change | `(visible: boolean, context: TreeSelectPopupVisibleContext)` | 下拉框显示或隐藏时触发。单选场景,选中某个选项时触发关闭,此时需要添加参数 `node`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`import { PopupVisibleChangeContext, PopupTriggerEvent, PopupTriggerSource } from '@Popup'`

`interface TreeSelectPopupVisibleContext { e?: PopupTriggerEvent; node?: TreeNodeModel; trigger?: PopupTriggerSource \| 'clear'; }`
remove | `(options: RemoveOptions)` | 多选模式下,选中数据被移除时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/tree-select/type.ts)。
`export interface RemoveOptions { value: N; data: T; index: number; node: TreeNodeModel; e?: MouseEvent \| KeyboardEvent; trigger: 'tag-remove' \| 'backspace'; }`
search | `(filterWords: string, context: { e: KeyboardEvent \| SelectInputValueChangeContext['e'] })` | 输入值变化时,触发搜索事件。主要用于远程搜索新数据。设置 `filterable=true` 开启此功能。优先级高于本地数据搜索 `filter`,即一旦存在这个远程搜索事件 `filter` 失效 diff --git a/src/tree-select/type.ts b/src/tree-select/type.ts index ba447fe72..5476bbab8 100644 --- a/src/tree-select/type.ts +++ b/src/tree-select/type.ts @@ -124,7 +124,7 @@ export interface TdTreeSelectProps< */ placeholder?: string; /** - * 透传给 popup 组件的全部属性 + * 透传 Popup 组件全部属性 */ popupProps?: PopupProps; /** @@ -251,7 +251,7 @@ export interface TreeSelectChangeContext { export type TreeSelectValueChangeTrigger = 'clear' | 'tag-remove' | 'backspace' | 'check' | 'uncheck'; export interface TreeSelectPopupVisibleContext { - e?: PopupTriggerEvent | Event; + e?: PopupTriggerEvent; node?: TreeNodeModel; trigger?: PopupTriggerSource | 'clear'; }