首页 > 其他分享 >你肯定不知道:Vue多文件上传时拖放操作的优雅处理

你肯定不知道:Vue多文件上传时拖放操作的优雅处理

时间:2024-11-05 09:46:19浏览次数:5  
标签:文件 Vue binding element file 上传 拖放

        多文件上传是Vue应用的常见操作。操作要求:(1)允许反复拖放多个文件到待上传区域(2)自动过滤掉重复拖放的文件(3)拖放后,形成待上传文件列表的简易缩略图(4)双击文件名,可移去某个文件。具体效果,如下图所示。

        我们可将拖放操作设计为一个插件指令dragDropFile,以供全局使用:

import {h, render} from 'vue'
import {filter, fromEvent, mergeWith, Observable, scan, switchMap, tap} from 'rxjs'


export default {
    name: 'app.plugins',
    install: (app, _) => {
        app.directive('dragDropFile', {  //定义dragDropFile指令
            mounted: (element, binding) => {
                binding.value.splice(0)  //清空数组中的旧文件数据
                new Observable().pipe(
                    //合并拖、放事件
                    mergeWith(fromEvent(element, 'dragover'), fromEvent(element,'drop')),     
                    tap(event => event.preventDefault()), //阻止浏览器默认的打开文件行为
                    switchMap(event => event.dataTransfer.files), //获取拖放的文件
                    //过滤掉重复拖放的文件
                    filter(file => binding.value.every(f => f.name !== file.name)),
                    scan((_, file) => {  //扫描用户拖放的所有文件
                        binding.value.push(file) //当前文件加入到待上传文件数组中
                        //创建一个虚拟的节点对象
                        const fragment = document.createDocumentFragment()
                        render(h('div', [  //用div在页面上构建待上传文件的简易缩略图
                            h('img', {     //在待上传文件前面放置一个小图标
                                src: 'image/file.gif',
                                style: {verticalAlign: 'middle'}
                            }),
                            h('span', {  //显示待上传文件的文件名、文件大小
                                innerText: `${file.name}\u3000\u3000${(file.size / 1024).toFixed(2) + 'KB'}`,
                                style: {cursor: 'pointer'},
                                ondblclick: () => { //添加双击事件,双击时移去该文件
                                    let index = binding.value.indexOf(file)
                                    element.removeChild(element.children[index])
                                    binding.value.splice(index, 1)  //删除
                                }
                            })
                        ]), fragment) //将div层渲染到虚拟节点fragment
                        element.appendChild(fragment) //将fragment添加到element
                    }, 0)
                ).subscribe()
            }
        })
    }
}

该指令的应用形式为:v-drag-drop-file,在需要使用的地方直接使用即可:

        <div id="files-list" v-drag-drop-file="myFiles"></div>

这么优雅的处理方式,知道的人,极少!

标签:文件,Vue,binding,element,file,上传,拖放
From: https://blog.csdn.net/acoease/article/details/143460694

相关文章

  • vue项目接入CDN域名:你可能会碰到的问题
    背景项目需要接入cdn加速域名,但只能在生产环境验证。所以发版之前本地先准备好cdn的包,然后发版的时候部署到生产环境,结果发现,点击菜单后页面的URL不对了,静态资源加载是可以的。本来页面URL是这样的:test.com/app/xpg/ind…但点击菜单后,把cdn的域名加上去了:test.com/https://c......
  • 基于SpringBoot + Vue的在线学习平台(角色:学生、教师、管理员)
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......
  • 基于SpringBoot + Vue的社区智慧医疗养老系统(角色:老人、老人家属、管理员)
    文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言......
  • git原理与上传
    言:git是一个软件,gitee/github是一个网站,这里有什么联系吗?我们身为一个程序员不可能不知道github,但是毕竟这是外国的网站,我们不翻墙的情况下,是无法访问的(或者就是太慢了,或者就是英语不好的同学不想使用),所以可以使用中国的平替gitee。我们一般通过它用来上传代码,但是各位可能......
  • 基于SpringBoot+Vue的可盈保险合同管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的可盈保险合同管理系统,项目源码请点击文章末尾联系我哦~目前有各类......
  • 基于SpringBoot+Vue的纺织品企业财务管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的纺织品企业财务管理系统,项目源码请点击文章末尾联系我哦~目前有各......
  • (开题报告)django+vue超市销售系统管理源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于超市销售管理系统的研究,现有研究多侧重于传统管理模式或单一功能模块的优化。例如,一些研究主要以提升收银效率或库存管理为主[1][......
  • 基于java+SpringBoot+Vue的大学生就业招聘系统设计与实现
    项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot+mybatis+Maven+mysql5.7或8.0等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个......
  • 基于java+SpringBoot+Vue的校园资料分享平台设计与实现
    项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot+mybatis+Maven+mysql5.7或8.0等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个......