图片列表组件用于展示待上传或已上传的图片列表,支持预览、删除、状态显示等功能。
组件本身不负责实际的上传操作和文件选择,只负责展示图片和状态。文件选择和上传由开发者控制。
上传流程如下:
onclickUpload 事件addFiles 方法添加文件onadd 事件value 中对应项的 status 和 progress上传完成后更新 status 为 success 或 error
<script>
let value = $state([]);
let uploadRef;
let fileInput;
// 点击上传按钮时调起文件选择
const handleClickUpload = () => {
fileInput?.click();
};
// 文件选择后添加到组件
const handleFileChange = (e) => {
const files = Array.from(e.target.files || []);
if (files.length > 0) {
uploadRef?.addFiles(files);
}
e.target.value = '';
};
// 文件添加后开始上传
const handleAdd = (files) => {
files.forEach((file) => {
const id = Date.now();
value = [...value, { id, file, status: 'uploading', progress: 0 }];
// 调用上传 API
uploadFile(file, {
onProgress: (progress) => {
value = value.map((v) => (v.id === id ? { ...v, progress } : v));
},
onSuccess: (url) => {
value = value.map((v) => (v.id === id ? { ...v, url, status: 'success' } : v));
},
onError: () => {
value = value.map((v) => (v.id === id ? { ...v, status: 'error' } : v));
}
});
});
};
</script>
<input type="file" accept="image/*" multiple class="hidden" bind:this={fileInput} onchange={handleFileChange} />
<ImageList bind:this={uploadRef} bind:value onadd={handleAdd} onclickUpload={handleClickUpload} />
pending:等待上传uploading:上传中(可显示进度)success:上传成功error:上传失败(点击可重试)组件内置了 ImagePreview,点击图片可直接预览。如需自定义预览行为,可通过 onpreview 事件处理。
URL.createObjectURL 创建临时预览地址max 和 maxSize 限制