mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-05-20 21:39:15 +08:00
feat(Uploader): add preview-delete slot (#10606)
This commit is contained in:
parent
0a114228a8
commit
726f98027a
@ -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"
|
||||||
>
|
>
|
||||||
|
@ -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
|
||||||
|
@ -363,9 +363,10 @@ export default {
|
|||||||
|
|
||||||
### Slots
|
### Slots
|
||||||
|
|
||||||
| 名称 | 说明 | 参数 |
|
| 名称 | 说明 | 参数 |
|
||||||
| ------------- | ------------------------------ | -------------------- |
|
| --- | --- | --- |
|
||||||
| default | 自定义上传区域 | - |
|
| default | 自定义上传区域 | - |
|
||||||
|
| preview-delete `v3.5.0` | 自定义删除按钮 | - |
|
||||||
| preview-cover | 自定义覆盖在预览区域上方的内容 | _item: FileListItem_ |
|
| preview-cover | 自定义覆盖在预览区域上方的内容 | _item: FileListItem_ |
|
||||||
|
|
||||||
### 回调参数
|
### 回调参数
|
||||||
|
@ -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))}
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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"
|
||||||
>
|
>
|
||||||
|
@ -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">
|
||||||
|
@ -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 () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user