mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
fix(Uploader): failed to resetInput
This commit is contained in:
parent
632a54d672
commit
b0ca6a997b
@ -22,7 +22,7 @@ export default {
|
|||||||
emits: ['delete', 'preview'],
|
emits: ['delete', 'preview'],
|
||||||
|
|
||||||
setup(props, { emit, slots }) {
|
setup(props, { emit, slots }) {
|
||||||
const renderPreviewMask = () => {
|
const renderMask = () => {
|
||||||
const { status, message } = props.item;
|
const { status, message } = props.item;
|
||||||
|
|
||||||
if (status === 'uploading' || status === 'failed') {
|
if (status === 'uploading' || status === 'failed') {
|
||||||
@ -46,7 +46,6 @@ export default {
|
|||||||
|
|
||||||
const onDelete = (event) => {
|
const onDelete = (event) => {
|
||||||
const { name, item, index, beforeDelete } = props;
|
const { name, item, index, beforeDelete } = props;
|
||||||
|
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
callInterceptor({
|
callInterceptor({
|
||||||
interceptor: beforeDelete,
|
interceptor: beforeDelete,
|
||||||
@ -71,7 +70,7 @@ export default {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderPreviewCover = () => {
|
const renderCover = () => {
|
||||||
if (slots['preview-cover']) {
|
if (slots['preview-cover']) {
|
||||||
const { index, item } = props;
|
const { index, item } = props;
|
||||||
return (
|
return (
|
||||||
@ -96,7 +95,7 @@ export default {
|
|||||||
lazyLoad={props.lazyLoad}
|
lazyLoad={props.lazyLoad}
|
||||||
onClick={onPreview}
|
onClick={onPreview}
|
||||||
>
|
>
|
||||||
{renderPreviewCover()}
|
{renderCover()}
|
||||||
</Image>
|
</Image>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -107,7 +106,7 @@ export default {
|
|||||||
<div class={[bem('file-name'), 'van-ellipsis']}>
|
<div class={[bem('file-name'), 'van-ellipsis']}>
|
||||||
{item.file ? item.file.name : item.url}
|
{item.file ? item.file.name : item.url}
|
||||||
</div>
|
</div>
|
||||||
{renderPreviewCover()}
|
{renderCover()}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@ -115,7 +114,7 @@ export default {
|
|||||||
return () => (
|
return () => (
|
||||||
<div class={bem('preview')}>
|
<div class={bem('preview')}>
|
||||||
{renderPreview()}
|
{renderPreview()}
|
||||||
{renderPreviewMask()}
|
{renderMask()}
|
||||||
{renderDeleteIcon()}
|
{renderDeleteIcon()}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -3,7 +3,13 @@ import { ref } from 'vue';
|
|||||||
// Utils
|
// Utils
|
||||||
import { bem, createComponent } from './shared';
|
import { bem, createComponent } from './shared';
|
||||||
import { isPromise, getSizeStyle, pick } from '../utils';
|
import { isPromise, getSizeStyle, pick } from '../utils';
|
||||||
import { toArray, isOversize, isImageFile, readFileContent } from './utils';
|
import {
|
||||||
|
toArray,
|
||||||
|
isOversize,
|
||||||
|
filterFiles,
|
||||||
|
isImageFile,
|
||||||
|
readFileContent,
|
||||||
|
} from './utils';
|
||||||
|
|
||||||
// Composition
|
// Composition
|
||||||
import { usePublicApi } from '../composition/use-public-api';
|
import { usePublicApi } from '../composition/use-public-api';
|
||||||
@ -98,52 +104,28 @@ export default createComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const findOversizeFiles = (files) => {
|
|
||||||
const valid = [];
|
|
||||||
const oversize = [];
|
|
||||||
|
|
||||||
files.forEach((item) => {
|
|
||||||
if (item.file && item.file.size > props.maxSize) {
|
|
||||||
oversize.push(item);
|
|
||||||
} else {
|
|
||||||
valid.push(item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return { valid, oversize };
|
|
||||||
};
|
|
||||||
|
|
||||||
const onAfterRead = (items) => {
|
const onAfterRead = (items) => {
|
||||||
resetInput();
|
resetInput();
|
||||||
|
|
||||||
let validFiles = items;
|
if (isOversize(items, props.maxSize)) {
|
||||||
|
|
||||||
const hasOversize = isOversize(items, props.maxSize);
|
|
||||||
|
|
||||||
if (hasOversize) {
|
|
||||||
if (Array.isArray(items)) {
|
if (Array.isArray(items)) {
|
||||||
const result = findOversizeFiles(items);
|
const result = filterFiles(items, props.maxSize);
|
||||||
validFiles = result.valid;
|
items = result.valid;
|
||||||
emit('oversize', result.oversizeFiles, getDetail());
|
emit('oversize', result.invalid, getDetail());
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
emit('oversize', items, getDetail());
|
emit('oversize', items, getDetail());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const isValidFiles = Boolean(
|
emit('update:modelValue', [...props.modelValue, ...toArray(items)]);
|
||||||
Array.isArray(validFiles) ? validFiles.length : validFiles
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isValidFiles) {
|
if (props.afterRead) {
|
||||||
emit('update:modelValue', [
|
props.afterRead(items, getDetail());
|
||||||
...props.modelValue,
|
|
||||||
...toArray(validFiles),
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (props.afterRead) {
|
|
||||||
props.afterRead(validFiles, getDetail());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -289,7 +271,7 @@ export default createComponent({
|
|||||||
|
|
||||||
const Input = (
|
const Input = (
|
||||||
<input
|
<input
|
||||||
ref="input"
|
ref={inputRef}
|
||||||
type="file"
|
type="file"
|
||||||
class={bem('input')}
|
class={bem('input')}
|
||||||
accept={props.accept}
|
accept={props.accept}
|
||||||
|
@ -29,13 +29,6 @@ export function readFileContent(file: File, resultType: ResultType) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isOversize(
|
|
||||||
items: FileListItem | FileListItem[],
|
|
||||||
maxSize: number | string
|
|
||||||
): boolean {
|
|
||||||
return toArray(items).some((item) => item.file && item.file.size > maxSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
export type FileListItem = {
|
export type FileListItem = {
|
||||||
url?: string;
|
url?: string;
|
||||||
file?: File;
|
file?: File;
|
||||||
@ -45,6 +38,28 @@ export type FileListItem = {
|
|||||||
message?: string;
|
message?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function isOversize(
|
||||||
|
items: FileListItem | FileListItem[],
|
||||||
|
maxSize: number | string
|
||||||
|
): boolean {
|
||||||
|
return toArray(items).some((item) => item.file && item.file.size > maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function filterFiles(items: FileListItem[], maxSize: number | string) {
|
||||||
|
const valid: FileListItem[] = [];
|
||||||
|
const invalid: FileListItem[] = [];
|
||||||
|
|
||||||
|
items.forEach((item) => {
|
||||||
|
if (item.file && item.file.size > maxSize) {
|
||||||
|
invalid.push(item);
|
||||||
|
} else {
|
||||||
|
valid.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return { valid, invalid };
|
||||||
|
}
|
||||||
|
|
||||||
const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
|
const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
|
||||||
|
|
||||||
export function isImageUrl(url: string): boolean {
|
export function isImageUrl(url: string): boolean {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user