Layui上传组件清空需用变量接收upload.render()实例,依次置空files、清空预览DOM并调用reload()。choose回调中应使用obj.pushFile()替换旧队列,勿直接改files。auto:false时,done回调需按字符串键名删除对应文件。
Layui上传组件实现一键清空已上传文件
时间:2026-07-27
浏览:268
文章目录
先问一个关键问题:upload.render()返回的实例对象,你是否用变量接住了?如果只是layui.upload.render({...})走个过场,后续所有清空操作基本都无法生效。
Layui 的 upload.render() 返回的是一个实例,内部维护着 files 属性和 DOM 渲染状态。若不保存这个实例,就等于失去了对上传组件的控制权。
常见错误是在 done 回调里直接写 this.files = []——this 指向的是回调函数上下文,并非 upload 实例本身。
- 正确的做法是:声明一个变量接住它,例如
let uploadInst = layui.upload.render({...}) - 如果有多个上传区域,必须为每个区域分配独立变量名,如
uploadAvatar、uploadCert - 还需确保该变量在
done回调中能被访问到,使用闭包或模块级变量最为稳妥

清空已上传文件队列的核心三步:置空 files + 清空 DOM + reload()
为什么必须三步同时进行?因为只做其中一步,UI 或状态就会不同步。Layui 并未暴露公开的 clear() 方法,只能手动组合这三步:
uploadInst.files = []:清除 JS 内部队列,否则下次点击上传按钮仍会发起请求uploadInst.config.elem.next('.layui-upload-list').html(''):清除预览 DOM,否则缩略图仍挂在页面上uploadInst.reload():触发重绘,让组件恢复“未选中”的初始状态
关键点在于:form.reset() 或手动清空原始 的 value 完全无效。Layui 已接管整个上传流程,状态只存在于 JS 实例中。
choose 回调里不能删 files,但可提前清理上一次残留
如果用户反复点击“选择文件”,且未设置 multiple: false,obj.pushFile() 会不断追加文件,导致重复上传。此时应在 choose 开头就清理旧队列——但不是删除 uploadInst.files,而是用 obj.pushFile() 获取当前队列快照再进行删除。
这里存在一个微妙差别:
- 先声明一个外部变量,比如
let UPLOAD_FILES - 在
choose第一行执行UPLOAD_FILES = obj.pushFile() - 然后遍历
UPLOAD_FILES并delete UPLOAD_FILES[key],只保留最新一个(如果是单图场景) - 切勿在
choose里写uploadInst.files = [],这会导致后续done中的index参数失效
auto: false 场景下,done 回调里删的是 index 键,不是数组下标
当设置了 auto: false 并手动触发上传时,done 的第二个参数 index 是一个字符串类型的 key(例如 "1612418956647-0"),它对应 obj.pushFile() 返回对象的键名,而非数组索引。
- 正确的删除方式:
delete uploadInst.files[index] - 错误写法:
uploadInst.files.splice(index, 1)或uploadInst.files[index] = null - 如果上传失败,
error回调里不要删除files,留给用户重试 multiple: true时,done会触发多次,每次只删除一个 key;multiple: false只触发一次
最后提醒一句:确保 UPLOAD_FILES 或 uploadInst.files 在 done 执行时仍然存在——切勿在其他地方将其重新赋值或导致 GC 回收。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。