diff --git a/packages/vant/src/image-preview/ImagePreview.tsx b/packages/vant/src/image-preview/ImagePreview.tsx index d17949d58..7f30f1357 100644 --- a/packages/vant/src/image-preview/ImagePreview.tsx +++ b/packages/vant/src/image-preview/ImagePreview.tsx @@ -157,6 +157,9 @@ export default defineComponent({ rootHeight={state.rootHeight} onScale={emitScale} onClose={emitClose} + v-slots={{ + image: slots.image, + }} /> ))} diff --git a/packages/vant/src/image-preview/ImagePreviewItem.tsx b/packages/vant/src/image-preview/ImagePreviewItem.tsx index f60f4935b..49cb45e8c 100644 --- a/packages/vant/src/image-preview/ImagePreviewItem.tsx +++ b/packages/vant/src/image-preview/ImagePreviewItem.tsx @@ -47,7 +47,7 @@ export default defineComponent({ emits: ['scale', 'close'], - setup(props, { emit }) { + setup(props, { emit, slots }) { const state = reactive({ scale: 1, moveX: 0, @@ -293,14 +293,20 @@ export default defineComponent({ onTouchend={onTouchEnd} onTouchcancel={onTouchEnd} > - + {slots.image ? ( +
+ {slots.image({ src: props.src })} +
+ ) : ( + + )} ); }; diff --git a/packages/vant/src/image-preview/README.md b/packages/vant/src/image-preview/README.md index 3a197a02a..f70dfad66 100644 --- a/packages/vant/src/image-preview/README.md +++ b/packages/vant/src/image-preview/README.md @@ -118,6 +118,42 @@ export default { }; ``` +### Component Call use image slot + +```html + + + +``` + +```js +import { ref } from 'vue'; + +export default { + setup() { + const show = ref(false); + const index = ref(0); + const images = [ + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + ]; + const onChange = (newIndex) => { + index.value = newIndex; + }; + + return { + show, + index, + images, + onChange, + }; + }, +}; +``` + ## API ### Options @@ -218,6 +254,7 @@ imagePreviewRef.value?.swipeTo(1); | --- | --- | --- | | index | Custom index | { index: index of current image } | | cover | Custom content that covers the image preview | - | +| image | Custom image slot | { src: current image src } | ### onClose Parameters diff --git a/packages/vant/src/image-preview/README.zh-CN.md b/packages/vant/src/image-preview/README.zh-CN.md index 05516c3d2..b429b02e2 100644 --- a/packages/vant/src/image-preview/README.zh-CN.md +++ b/packages/vant/src/image-preview/README.zh-CN.md @@ -172,6 +172,42 @@ export default { }; ``` +### 组件调用 - 使用 image 插槽 + +```html + + + +``` + +```js +import { ref } from 'vue'; + +export default { + setup() { + const show = ref(false); + const index = ref(0); + const images = [ + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + ]; + const onChange = (newIndex) => { + index.value = newIndex; + }; + + return { + show, + index, + images, + onChange, + }; + }, +}; +``` + ## API ### Options @@ -279,6 +315,7 @@ imagePreviewRef.value?.swipeTo(1); | ----- | ------------------------------ | ------------------------- | | index | 自定义页码内容 | { index: 当前图片的索引 } | | cover | 自定义覆盖在图片预览上方的内容 | - | +| image | 自定义图片插槽 | { src: 当前资源地址 } | ### onClose 回调参数 diff --git a/packages/vant/src/image-preview/demo/index.vue b/packages/vant/src/image-preview/demo/index.vue index daf0a02b7..83baf00d2 100644 --- a/packages/vant/src/image-preview/demo/index.vue +++ b/packages/vant/src/image-preview/demo/index.vue @@ -17,6 +17,7 @@ const t = useTranslate({ customConfig: '传入配置项', startPosition: '指定初始位置', componentCall: '组件调用', + componentImage: '组件调用使用image插槽', index: (index: number) => `第${index + 1}页`, }, 'en-US': { @@ -28,6 +29,7 @@ const t = useTranslate({ customConfig: 'Custom Config', startPosition: 'Set Start Position', componentCall: 'Component Call', + componentImage: 'Component Call use image slot', index: (index: number) => `Page: ${index}`, }, }); @@ -39,9 +41,19 @@ const images = [ cdnURL('apple-4.jpeg'), ]; +const imagesSlot = [ + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', + 'https://www.w3school.com.cn/i/movie.ogg', +]; + const show = ref(false); const index = ref(0); +const showSlot = ref(false); +const indexSlot = ref(0); + const onClose = () => Toast(t('closed')); const beforeClose = () => @@ -59,6 +71,14 @@ const onChange = (newIndex: number) => { index.value = newIndex; }; +const showComponentCallSlot = () => { + showSlot.value = true; +}; + +const onChangeSlot = (newIndex: number) => { + indexSlot.value = newIndex; +}; + const showImagePreview = (options: Partial = {}) => { const instance = ImagePreview({ images, @@ -110,4 +130,21 @@ const showImagePreview = (options: Partial = {}) => { + + + + + + + diff --git a/packages/vant/src/image-preview/index.less b/packages/vant/src/image-preview/index.less index fa500f7e7..d1d114c83 100644 --- a/packages/vant/src/image-preview/index.less +++ b/packages/vant/src/image-preview/index.less @@ -38,7 +38,8 @@ left: 0; } - &__image { + &__image, + &__image-wrap { width: 100%; transition-property: transform; @@ -47,7 +48,8 @@ height: 100%; } - img { + img, + video { // disable desktop browser image drag -webkit-user-drag: none; } diff --git a/packages/vant/src/image-preview/test/index.spec.ts b/packages/vant/src/image-preview/test/index.spec.ts index dd8467685..da6151a14 100644 --- a/packages/vant/src/image-preview/test/index.spec.ts +++ b/packages/vant/src/image-preview/test/index.spec.ts @@ -254,3 +254,36 @@ test('zoom out', async () => { restore(); }); + +test('should render image slot correctly', async () => { + const wrapper = mount(ImagePreviewComponent, { + props: { + show: true, + images, + }, + slots: { + image: ({ src }) => ``, + }, + }); + + await later(); + + expect(wrapper.html().includes('test-img')).toBeTruthy(); +}); + +test('should render image slot correctly 2', async () => { + const wrapper = mount(ImagePreviewComponent, { + props: { + show: true, + images, + }, + slots: { + image: ({ src }) => + ``, + }, + }); + + await later(); + + expect(wrapper.html().includes('video')).toBeTruthy(); +});