From 104c53e828f81d1089dcc9f8310a0fb32b764643 Mon Sep 17 00:00:00 2001 From: wuyuming Date: Thu, 19 Oct 2023 21:11:21 +0800 Subject: [PATCH 1/2] fix: modify invalid image slot scaling --- packages/vant/src/image-preview/ImagePreviewItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vant/src/image-preview/ImagePreviewItem.tsx b/packages/vant/src/image-preview/ImagePreviewItem.tsx index 8ef778164e9..7193de0b852 100644 --- a/packages/vant/src/image-preview/ImagePreviewItem.tsx +++ b/packages/vant/src/image-preview/ImagePreviewItem.tsx @@ -389,7 +389,7 @@ export default defineComponent({ onTouchcancel={onTouchEnd} > {slots.image ? ( -
+
{slots.image({ src: props.src })}
) : ( From 61ac186fe6225df1364ee61cd399729c8e1aa6f3 Mon Sep 17 00:00:00 2001 From: wuyuming Date: Fri, 20 Oct 2023 10:47:38 +0800 Subject: [PATCH 2/2] fix(ImagePreview): incorrect image slot scaling --- .../src/image-preview/ImagePreviewItem.tsx | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/vant/src/image-preview/ImagePreviewItem.tsx b/packages/vant/src/image-preview/ImagePreviewItem.tsx index 7193de0b852..b33f6d8d19a 100644 --- a/packages/vant/src/image-preview/ImagePreviewItem.tsx +++ b/packages/vant/src/image-preview/ImagePreviewItem.tsx @@ -5,6 +5,7 @@ import { reactive, defineComponent, type CSSProperties, + VNode, } from 'vue'; // Utils @@ -118,6 +119,28 @@ export default defineComponent({ return 0; }); + const isImgElm = computed(() => { + if (!slots.image) return false; + const vNodeContent = slots.image({ src: props.src })[0]; + return hasImgNode(vNodeContent); + }); + + const hasImgNode = (vNodeContent: VNode) => { + if (vNodeContent.type === 'img') { + return true; + } else if ( + Array.isArray(vNodeContent.children) && + vNodeContent.children.length !== 0 + ) { + for (const child of vNodeContent.children) { + if (hasImgNode(child as VNode)) { + return true; + } + } + } + return false; + }; + const setScale = (scale: number, center?: { x: number; y: number }) => { scale = clamp(scale, +props.minZoom, +props.maxZoom + 1); @@ -389,7 +412,10 @@ export default defineComponent({ onTouchcancel={onTouchEnd} > {slots.image ? ( -
+
{slots.image({ src: props.src })}
) : (