Skip to content

Commit 8b53f51

Browse files
authored
feat(ImageViewer): add trigger source for close event (#811)
* feat(ImageViewer): add trigger source for close event * docs: update
1 parent 70a0599 commit 8b53f51

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

src/image-viewer/_example/base.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ export default function BaseDemo() {
1010
const [visible, setVisible] = useState(false);
1111

1212
const onIndexChange = (...args) => {
13-
console.log('[onIndexChange]', args);
13+
console.log('onIndexChange', args);
14+
};
15+
16+
const handleClose = (...args) => {
17+
console.log('onClose', args);
18+
setVisible(false);
1419
};
1520

1621
return (
@@ -19,7 +24,7 @@ export default function BaseDemo() {
1924
基础图片预览
2025
</Button>
2126

22-
<ImageViewer images={images} visible={visible} onClose={() => setVisible(false)} onIndexChange={onIndexChange} />
27+
<ImageViewer images={images} visible={visible} onClose={handleClose} onIndexChange={onIndexChange} />
2328
</div>
2429
);
2530
}

src/image-viewer/image-viewer.en-US.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ deleteBtn | TNode | false | Typescript:`boolean \| TNode`。[see more ts defin
1313
images | Array | [] | Typescript:`Array<string \| ImageInfo>` `interface ImageInfo { url: string; align: 'start' \| 'center' \| 'end' }`[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/image-viewer/type.ts) | N
1414
index | Number | 0 | \- | N
1515
defaultIndex | Number | 0 | uncontrolled property | N
16-
maxZoom | Number | 3 | Typescript:`number` | N
16+
maxZoom | Number | 3 | \- | N
1717
showIndex | Boolean | false | \- | N
1818
visible | Boolean | false | hide or show image viewer | N
1919
defaultVisible | Boolean | false | hide or show image viewer。uncontrolled property | N
20-
onClose | Function | | Typescript:`(context: { trigger: 'overlay' \| 'close-btn', visible: boolean, index: number }) => void`<br/> | N
20+
onClose | Function | | Typescript:`(context: { trigger: ImageViewerCloseTrigger, visible: boolean, index: number }) => void`<br/>[see more ts definition](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/image-viewer/type.ts)。<br/>`type ImageViewerCloseTrigger = 'image' \| 'overlay' \| 'close-btn'`<br/> | N
2121
onDelete | Function | | Typescript:`(index: number) => void`<br/> | N
22-
onIndexChange | Function | | Typescript:`(index: number, context: { trigger: 'prev' \| 'next' }) => void`<br/> | N
22+
onIndexChange | Function | | Typescript:`(index: number, context: { trigger: 'prev' \| 'next' \| 'current' }) => void`<br/> | N
2323

2424
### CSS Variables
2525

src/image-viewer/image-viewer.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ deleteBtn | TNode | false | 是否显示删除操作,前提需要开启页码
1313
images | Array | [] | 图片数组。TS 类型:`Array<string \| ImageInfo>` `interface ImageInfo { url: string; align: 'start' \| 'center' \| 'end' }`[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/image-viewer/type.ts) | N
1414
index | Number | 0 | 当前预览图片所在的下标 | N
1515
defaultIndex | Number | 0 | 当前预览图片所在的下标。非受控属性 | N
16-
maxZoom | Number | 3 | 【开发中】最大放大比例。TS 类型:`number` | N
16+
maxZoom | Number | 3 | 【开发中】最大放大比例 | N
1717
showIndex | Boolean | false | 是否显示页码 | N
1818
visible | Boolean | false | 隐藏/显示预览 | N
1919
defaultVisible | Boolean | false | 隐藏/显示预览。非受控属性 | N
20-
onClose | Function | | TS 类型:`(context: { trigger: 'overlay' \| 'close-btn', visible: boolean, index: number }) => void`<br/>关闭时触发 | N
20+
onClose | Function | | TS 类型:`(context: { trigger: ImageViewerCloseTrigger, visible: boolean, index: number }) => void`<br/>关闭时触发[详细类型定义](https://github.com/Tencent/tdesign-mobile-react/tree/develop/src/image-viewer/type.ts)。<br/>`type ImageViewerCloseTrigger = 'image' \| 'overlay' \| 'close-btn'`<br/> | N
2121
onDelete | Function | | TS 类型:`(index: number) => void`<br/>点击删除操作按钮时触发 | N
22-
onIndexChange | Function | | TS 类型:`(index: number, context: { trigger: 'prev' \| 'next' }) => void`<br/>预览图片切换时触发,`context.prev` 切换到上一张图片,`context.next` 切换到下一张图片 | N
22+
onIndexChange | Function | | TS 类型:`(index: number, context: { trigger: 'prev' \| 'next' \| 'current' }) => void`<br/>预览图片切换时触发,`context.prev` 切换到上一张图片,`context.next` 切换到下一张图片 | N
2323

2424
### CSS Variables
2525

src/image-viewer/image-viewer.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { MouseEvent, useRef, useEffect } from 'react';
22
import { CloseIcon, DeleteIcon } from 'tdesign-icons-react';
33
import { CSSTransition } from 'react-transition-group';
44
import { CSSTransitionClassNames } from 'react-transition-group/CSSTransition';
5-
import { TdImageViewerProps, ImageInfo } from './type';
5+
import { TdImageViewerProps, ImageInfo, ImageViewerCloseTrigger } from './type';
66
import { StyledProps } from '../common';
77
import { usePrefixClass } from '../hooks/useClass';
88
import useDefault from '../_util/useDefault';
@@ -64,11 +64,22 @@ const ImageViewer: React.FC<ImageViewerProps> = (props) => {
6464
}, [show]);
6565

6666
const imageViewerClass = usePrefixClass('image-viewer');
67-
const handleClose = (e: MouseEvent, trigger: 'overlay' | 'close-btn') => {
67+
const handleClose = (e: MouseEvent, trigger: ImageViewerCloseTrigger) => {
6868
e.stopPropagation();
6969
setShow(false);
70-
onClose?.({ trigger, visible: false, index });
70+
onClose?.({ trigger, visible: false, index: currentIndex });
7171
};
72+
73+
// 通过(事件委托)将点击事件绑定到组件根,判断点击目标
74+
const handleClick = (e: MouseEvent) => {
75+
const target = e.target as HTMLElement;
76+
if (target.tagName === 'IMG') {
77+
handleClose(e, 'image');
78+
} else {
79+
handleClose(e, 'overlay');
80+
}
81+
};
82+
7283
const handleDelete = () => {
7384
onDelete?.(currentIndex ?? 0);
7485
};
@@ -207,8 +218,8 @@ const ImageViewer: React.FC<ImageViewerProps> = (props) => {
207218
classNames={animationClassNames}
208219
nodeRef={rootRef}
209220
>
210-
<div ref={rootRef} className={imageViewerClass}>
211-
<div className={`${imageViewerClass}__mask`} onClick={(e) => handleClose(e, 'overlay')}></div>
221+
<div ref={rootRef} className={imageViewerClass} onClick={handleClick}>
222+
<div className={`${imageViewerClass}__mask`}></div>
212223
<TSwiper
213224
ref={swiperRootRef}
214225
autoplay={false}

src/image-viewer/type.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,20 @@ export interface TdImageViewerProps {
5555
/**
5656
* 关闭时触发
5757
*/
58-
onClose?: (context: { trigger: 'overlay' | 'close-btn'; visible: boolean; index: number }) => void;
58+
onClose?: (context: { trigger: ImageViewerCloseTrigger; visible: boolean; index: number }) => void;
5959
/**
6060
* 点击删除操作按钮时触发
6161
*/
6262
onDelete?: (index: number) => void;
6363
/**
6464
* 预览图片切换时触发,`context.prev` 切换到上一张图片,`context.next` 切换到下一张图片
6565
*/
66-
onIndexChange?: (index: number, context: { trigger: 'prev' | 'next' }) => void;
66+
onIndexChange?: (index: number, context: { trigger: 'prev' | 'next' | 'current' }) => void;
6767
}
6868

6969
export interface ImageInfo {
7070
url: string;
7171
align: 'start' | 'center' | 'end';
7272
}
73+
74+
export type ImageViewerCloseTrigger = 'image' | 'overlay' | 'close-btn';

0 commit comments

Comments
 (0)