iter(g173): 上传图片显示缩略图
This commit is contained in:
@@ -36,13 +36,24 @@ export function upload(props: UploadProps): HTMLElement {
|
||||
sync();
|
||||
};
|
||||
|
||||
// —— 图片缩略图:对象 URL 按 File 缓存,文件离场即释放(否则整页存活期都在泄漏) ——
|
||||
const urls = new Map<File, string>();
|
||||
const thumbOf = (file: File): HTMLElement | null => {
|
||||
if (!file.type.startsWith('image/')) return null; // 卫语句:非图片不缩略,只给文件名
|
||||
let url = urls.get(file);
|
||||
if (!url) { url = URL.createObjectURL(file); urls.set(file, url); }
|
||||
return h('img', { class: 'ua-upload-thumb', src: url, alt: '', loading: 'lazy' });
|
||||
};
|
||||
|
||||
/*** 重绘清单并回传(选择/拖拽/移除都走这里,保证单一出口) ***/
|
||||
const sync = (tip = '') => {
|
||||
for (const [file, url] of urls) if (!files.includes(file)) { URL.revokeObjectURL(url); urls.delete(file); } // 已离场的文件先释放
|
||||
listEl.replaceChildren(
|
||||
...files.map((file, i) =>
|
||||
h(
|
||||
'div',
|
||||
{ class: 'ua-upload-item' },
|
||||
thumbOf(file),
|
||||
h('span', { class: 'ua-upload-name' }, file.name),
|
||||
h('span', { class: 'ua-upload-size' }, size(file.size)),
|
||||
h('button', { type: 'button', class: 'ua-upload-remove', 'aria-label': `移除 ${file.name}`, onclick: () => remove(i) }, '×'),
|
||||
|
||||
Reference in New Issue
Block a user