Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/vant/src/uploader/Uploader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ export default defineComponent({
return (
<UploaderPreviewItem
v-slots={pick(slots, ['preview-cover', 'preview-delete'])}
key={item.url || item.objectUrl || item.file?.name || index}
item={item}
index={index}
onClick={() =>
Expand Down
82 changes: 82 additions & 0 deletions packages/vant/src/uploader/test/__snapshots__/index.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,88 @@ exports[`render preview image 1`] = `
</div>
`;

exports[`should handle key correctly when delete middle image 1`] = `
<div class="van-uploader">
<div class="van-uploader__wrapper">
<div class="van-uploader__preview">
<div class="van-image van-uploader__preview-image">
<img
src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
class="van-image__img"
style="object-fit: cover;"
>
<div class="van-image__loading">
<i class="van-badge__wrapper van-icon van-icon-photo van-image__loading-icon">
</i>
</div>
</div>
<div
role="button"
class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0"
aria-label="Delete"
>
<i class="van-badge__wrapper van-icon van-icon-cross van-uploader__preview-delete-icon">
</i>
</div>
</div>
<div class="van-uploader__preview">
<div class="van-image van-uploader__preview-image">
<img
src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
class="van-image__img"
style="object-fit: cover;"
>
<div class="van-image__loading">
<i class="van-badge__wrapper van-icon van-icon-photo van-image__loading-icon">
</i>
</div>
</div>
<div
role="button"
class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0"
aria-label="Delete"
>
<i class="van-badge__wrapper van-icon van-icon-cross van-uploader__preview-delete-icon">
</i>
</div>
</div>
<div class="van-uploader__preview">
<div class="van-image van-uploader__preview-image">
<img
src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
class="van-image__img"
style="object-fit: cover;"
>
<div class="van-image__loading">
<i class="van-badge__wrapper van-icon van-icon-photo van-image__loading-icon">
</i>
</div>
</div>
<div
role="button"
class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0"
aria-label="Delete"
>
<i class="van-badge__wrapper van-icon van-icon-cross van-uploader__preview-delete-icon">
</i>
</div>
</div>
<div class="van-uploader__upload">
<i class="van-badge__wrapper van-icon van-icon-photograph van-uploader__upload-icon">
</i>
<input
type="file"
class="van-uploader__input"
accept="image/*"
>
</div>
</div>
</div>
`;

exports[`should not render upload input when using readonly prop 1`] = `
<div class="van-uploader">
<div class="van-uploader__wrapper">
Expand Down
22 changes: 21 additions & 1 deletion packages/vant/src/uploader/test/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,26 @@ test('delete preview image', () => {
expect(wrapper.emitted<[File]>('delete')![0]).toBeTruthy();
});

test('should handle key correctly when delete middle image', () => {
const wrapper = mount(Uploader, {
props: {
modelValue: [
{ url: IMAGE, name: '1' },
{ url: IMAGE, name: '2' },
{ url: IMAGE, name: '3' },
],
},
});

// 删除中间图片
const deleteButtons = wrapper.findAll('.van-uploader__preview-delete');
deleteButtons[1].trigger('click');

expect(wrapper.emitted<[File]>('update:modelValue')![0][0]).toHaveLength(2);
expect(wrapper.html()).toMatchSnapshot();
expect(wrapper.emitted<[File]>('delete')![0]).toBeTruthy();
});

test('before-delete prop return false', () => {
const wrapper = mount(Uploader, {
props: {
Expand Down Expand Up @@ -716,7 +736,7 @@ test('expose reuploadFile method', async () => {
},
});

const {reuploadFile} = (wrapper.vm as UploaderInstance);
const { reuploadFile } = wrapper.vm as UploaderInstance;
expect(reuploadFile).toBeTypeOf('function');

const input = wrapper.find<HTMLInputElement>('.van-uploader__input');
Expand Down