feat(Uploader): add preview-delete slot (#10606)

This commit is contained in:
neverland 2022-05-14 10:58:57 +08:00 committed by GitHub
parent 0a114228a8
commit 726f98027a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 70 additions and 90 deletions

View File

@ -460,7 +460,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >

View File

@ -344,7 +344,8 @@ export default {
| Name | Description | SlotProps | | Name | Description | SlotProps |
| --- | --- | --- | | --- | --- | --- |
| default | Custom icon | - | | default | Custom upload area | - |
| preview-delete `v.3.5.0` | Custom delete icon | `item: FileListItem` |
| preview-cover | Custom content that covers the image preview | `item: FileListItem` | | preview-cover | Custom content that covers the image preview | `item: FileListItem` |
### Parameters of before-read、after-read、before-delete ### Parameters of before-read、after-read、before-delete

View File

@ -363,9 +363,10 @@ export default {
### Slots ### Slots
| 名称 | 说明 | 参数 | | 名称 | 说明 | 参数 |
| ------------- | ------------------------------ | -------------------- | | --- | --- | --- |
| default | 自定义上传区域 | - | | default | 自定义上传区域 | - |
| preview-delete `v3.5.0` | 自定义删除按钮 | - |
| preview-cover | 自定义覆盖在预览区域上方的内容 | _item: FileListItem_ | | preview-cover | 自定义覆盖在预览区域上方的内容 | _item: FileListItem_ |
### 回调参数 ### 回调参数

View File

@ -280,7 +280,7 @@ export default defineComponent({
return ( return (
<UploaderPreviewItem <UploaderPreviewItem
v-slots={{ 'preview-cover': slots['preview-cover'] }} v-slots={pick(slots, ['preview-cover', 'preview-delete'])}
item={item} item={item}
index={index} index={index}
onClick={() => emit('click-preview', item, getDetail(index))} onClick={() => emit('click-preview', item, getDetail(index))}

View File

@ -73,15 +73,20 @@ export default defineComponent({
const renderDeleteIcon = () => { const renderDeleteIcon = () => {
if (props.deletable && props.item.status !== 'uploading') { if (props.deletable && props.item.status !== 'uploading') {
const slot = slots['preview-delete'];
return ( return (
<div <div
role="button" role="button"
class={bem('preview-delete')} class={bem('preview-delete', { shadow: !slot })}
tabindex={0} tabindex={0}
aria-label={t('delete')} aria-label={t('delete')}
onClick={onDelete} onClick={onDelete}
> >
<Icon name="cross" class={bem('preview-delete-icon')} /> {slot ? (
slot()
) : (
<Icon name="cross" class={bem('preview-delete-icon')} />
)}
</div> </div>
); );
} }

View File

@ -108,10 +108,13 @@
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
width: var(--van-uploader-delete-icon-size);
height: var(--van-uploader-delete-icon-size); &--shadow {
background: var(--van-uploader-delete-background-color); width: var(--van-uploader-delete-icon-size);
border-radius: 0 0 0 12px; height: var(--van-uploader-delete-icon-size);
background: var(--van-uploader-delete-background-color);
border-radius: 0 0 0 12px;
}
&-icon { &-icon {
position: absolute; position: absolute;

View File

@ -30,7 +30,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -50,7 +50,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -126,7 +126,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -160,7 +160,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -195,7 +195,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -258,7 +258,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -294,7 +294,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -359,7 +359,7 @@ exports[`should render demo and match snapshot 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >

View File

@ -17,7 +17,7 @@ exports[`delete preview image 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -66,7 +66,7 @@ exports[`disable preview image 2`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -116,68 +116,7 @@ exports[`image-fit prop 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" 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[`preview-cover slot 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://cdn.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 class="van-uploader__preview-cover">
Custom Preview Cover
</div>
</div>
<div role="button"
class="van-uploader__preview-delete"
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://cdn.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 class="van-uploader__preview-cover">
Custom Preview Cover
</div>
</div>
<div role="button"
class="van-uploader__preview-delete"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -212,7 +151,7 @@ exports[`render preview image 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -229,7 +168,7 @@ exports[`render preview image 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -246,7 +185,7 @@ exports[`render preview image 1`] = `
</div> </div>
</div> </div>
<div role="button" <div role="button"
class="van-uploader__preview-delete" class="van-uploader__preview-delete van-uploader__preview-delete--shadow"
tabindex="0" tabindex="0"
aria-label="Delete" aria-label="Delete"
> >
@ -277,6 +216,22 @@ exports[`should not render upload input when using readonly prop 1`] = `
</div> </div>
`; `;
exports[`should render preview-cover slot correctly 1`] = `
<div class="van-uploader__preview-cover">
Custom Preview Cover
</div>
`;
exports[`should render preview-delete slot correctly 1`] = `
<div role="button"
class="van-uploader__preview-delete"
tabindex="0"
aria-label="Delete"
>
Custom Preview Delete
</div>
`;
exports[`upload-icon prop 1`] = ` exports[`upload-icon prop 1`] = `
<div class="van-uploader"> <div class="van-uploader">
<div class="van-uploader__wrapper"> <div class="van-uploader__wrapper">

View File

@ -627,17 +627,32 @@ test('multiFile upload filter max-size file', async () => {
expect(wrapper.emitted<[File]>('oversize')![0]).toBeTruthy(); expect(wrapper.emitted<[File]>('oversize')![0]).toBeTruthy();
}); });
test('preview-cover slot', async () => { test('should render preview-cover slot correctly', async () => {
const wrapper = mount(Uploader, { const wrapper = mount(Uploader, {
props: { props: {
modelValue: [{ url: IMAGE }, { url: IMAGE }], modelValue: [{ url: IMAGE }],
}, },
slots: { slots: {
'preview-cover': 'Custom Preview Cover', 'preview-cover': 'Custom Preview Cover',
}, },
}); });
expect(wrapper.html()).toMatchSnapshot(); expect(wrapper.find('.van-uploader__preview-cover').html()).toMatchSnapshot();
});
test('should render preview-delete slot correctly', async () => {
const wrapper = mount(Uploader, {
props: {
modelValue: [{ url: IMAGE }],
},
slots: {
'preview-delete': 'Custom Preview Delete',
},
});
expect(
wrapper.find('.van-uploader__preview-delete').html()
).toMatchSnapshot();
}); });
test('should not render upload input when using readonly prop', async () => { test('should not render upload input when using readonly prop', async () => {