diff --git a/src/Image.tsx b/src/Image.tsx index 30ab9ce1..91ad16a3 100644 --- a/src/Image.tsx +++ b/src/Image.tsx @@ -175,13 +175,22 @@ const ImageInternal: CompoundedComponent = props => { COMMON_PROPS.map(prop => props[prop]), ); + // `srcSet` & `sizes` describe the thumbnail, and would win over `preview.src` in the preview image + const previewImgCommonProps = useMemo(() => { + if (previewSrc === undefined) { + return imgCommonProps; + } + const { srcSet, sizes, ...rest } = imgCommonProps; + return rest; + }, [previewSrc, imgCommonProps]); + // ========================== Register ========================== const registerData: ImageElementProps = useMemo( () => ({ - ...imgCommonProps, + ...previewImgCommonProps, src, }), - [src, imgCommonProps], + [src, previewImgCommonProps], ); const imageId = useRegisterImage(canPreview, registerData); @@ -307,7 +316,7 @@ const ImageInternal: CompoundedComponent = props => { alt={alt} imageInfo={{ width, height }} fallback={fallback} - imgCommonProps={imgCommonProps} + imgCommonProps={previewImgCommonProps} {...restProps} classNames={classNames?.popup} styles={styles?.popup} diff --git a/tests/preview.test.tsx b/tests/preview.test.tsx index 2d48c43d..619a7f37 100644 --- a/tests/preview.test.tsx +++ b/tests/preview.test.tsx @@ -767,6 +767,60 @@ describe('Preview', () => { expect(document.querySelector('.rc-image-preview-img')).toHaveAttribute('src', previewSrc); }); + it('previewSrc should not use the srcSet and sizes of the thumbnail', () => { + const { container } = render( + , + ); + + expect(container.querySelector('.rc-image-img')).toHaveAttribute('srcset', 'thumb-200.png 2x'); + + fireEvent.click(container.querySelector('.rc-image')); + act(() => { + jest.runAllTimers(); + }); + + const previewImg = document.querySelector('.rc-image-preview-img'); + expect(previewImg).toHaveAttribute('src', 'big-500.png'); + expect(previewImg).not.toHaveAttribute('srcset'); + expect(previewImg).not.toHaveAttribute('sizes'); + }); + + it('previewSrc should not use the srcSet of the thumbnail in PreviewGroup', () => { + const { container } = render( + + + , + ); + + fireEvent.click(container.querySelector('.rc-image')); + act(() => { + jest.runAllTimers(); + }); + + const previewImg = document.querySelector('.rc-image-preview-img'); + expect(previewImg).toHaveAttribute('src', 'big-500.png'); + expect(previewImg).not.toHaveAttribute('srcset'); + }); + + it('should keep srcSet in the preview without previewSrc', () => { + const { container } = render(); + + fireEvent.click(container.querySelector('.rc-image')); + act(() => { + jest.runAllTimers(); + }); + + expect(document.querySelector('.rc-image-preview-img')).toHaveAttribute( + 'srcset', + 'thumb-200.png 2x', + ); + }); + it('Customize preview props', () => { const src = 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png'; render(