当前位置: 首页 > news >正文

产品外贸营销推广方案宁波怎么优化seo关键词

产品外贸营销推广方案,宁波怎么优化seo关键词,网站建设 前后台目录结构,爱写字 wordpress目录 1.拖拽上传的剖析 input的file默认拖动 让其他的盒子成为拖拽对象 2.处理文件的上传 处理数据 上传文件的函数 兼顾点击事件 渲染已处理过的文件 测试效果 3.总结 博客主页:専心_前端,javascript,mysql-CSDN博客 系列专栏:vue3nodejs 实战-…

目录

 1.拖拽上传的剖析

input的file默认拖动

 让其他的盒子成为拖拽对象

2.处理文件的上传

处理数据

上传文件的函数

兼顾点击事件

渲染已处理过的文件

测试效果

3.总结


 博客主页:専心_前端,javascript,mysql-CSDN博客

 系列专栏:vue3+nodejs 实战--文件上传

 前端代码仓库:jiangjunjie666/my-upload: vue3+nodejs 上传文件的项目,用于学习 (github.com)

 后端代码仓库:jiangjunjie666/my-upload-server: nodejs上传文件的后端 (github.com)

 欢迎关注

在上一篇中,我们实现了文件的批量上传以及显示实时的上传进度,Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)_専心的博客-CSDN博客

该篇主要的是探讨拖拽上传的思路以及实现。 

 1.拖拽上传的剖析

input的file默认拖动

其实在我的目前的认知中(当然我不是很成熟,还在努力学习,如有不对请大佬们多包含),上传文件其实主要就是二点,第一个是页面的交互(拖拽的样式,显示的上传进度条等等),第二个就是网络通信将文件通过post请求发送给后端,所以上传文件的接口我们上期中已经写好了,这次主要是完成前端页面的交互逻辑。

拖拽上传其实在原生的input选择框中本来就是支持的。

 

所以我们可以将input铺满整个上传框中,并且将其opacity设置为0,就能达到隐藏的效果,并且既能支持拖拽还能支持点击。

但是一般情况下实际开发中不会这样做,一般都是根据设计稿来具体实现不同的样式,input框都是隐藏状态,隐藏状态就无法做到拖拽文件到其范围里面了。 

 让盒子成为拖拽对象

上面的input之所以支持拖拽效果,因为在原生的html5中他就是被作为一个拖拽对象存在的,但是兼容性可能不是特别好,这时候我们就可以将其他的盒子也变成一个拖拽对象。

 下面是我们存放整个拖拽上传区域的盒子,我们将其设置为拖拽对象。

<div class="container" @dragenter.prevent="handleDragEnter" @dragover.prevent="handleDragOver" @drop.prevent="handleDrop"></div>

我们在他身上绑定了一些事件

  • dragover 事件:当拖拽对象在一个元素上悬停时(即,拖拽对象在元素上移动时),dragover 事件会持续触发。

  • dragenter 事件:当拖拽对象首次进入一个元素时,dragenter 事件会触发。

  • dragleave 事件:当拖拽对象离开一个元素时,dragleave 事件会触发。

  • drop 事件:当拖拽对象在元素上松开鼠标按钮时,drop 事件会触发。

我们这里只需要将enter和over阻止掉就行

// 处理拖拽进入
const handleDragEnter = (e) => {e.preventDefault()console.log('Drag entered')
}
// 处理拖拽过程中
const handleDragOver = (e) => {e.preventDefault() // 阻止默认行为// 处理拖拽过程中的操作console.log('Drag over')
}
// 处理拖拽事件
const handleDrop = (e) => {e.preventDefault()const files = e.dataTransfer.filesconsole.log('上传的文件:', files)
}

现在就可以实现文件的拖拽上传了,只要拖拽到指定的区域就可以,拿到数据使用的是e.dataTransfer.flies

2.处理文件的上传

处理数据

我们可以定义一个数组放至待上传的文件,一个放置已经进行处理过的文件

//存放已经上传的文件的数组
let fileListOver = ref([])
//存放要上传的文件的数组
let fileList = ref([])

在拖拽事件后数据push进数组中

// 处理拖拽事件
const handleDrop = (e) => {e.preventDefault()const files = e.dataTransfer.filesconsole.log('上传的文件:', files)//将要上传的文件放入数组中fileList.value.push(...files)uploadFile()
}

上传文件的函数

这个上传文件的接口使用的是上一个视频写的接口,没看过的可以翻翻前面的Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)_専心的博客-CSDN博客

接下来就可以进行文件的上传,处理上传的数据,因为我们是可以选择多文件的,所以要递归判断上传文件。在这之前别忘了导入axios的构造函数

 

//上传文件的函数
const uploadFile = async () => {//先要计算出要上传的文件的索引const index = fileListOver.value.lengthif (fileList.value.length == fileListOver.value.length) {//所有的数据都已经上传完毕,退出递归return}//存放文件数据let formData = new FormData()formData.append('file', fileList.value[index])console.log(formData)let res = await http.post('/api/fileUpload', formData)if (res.code !== 200) {fileListOver.value.push({name: fileList.value[index].name,size: fileList.value[index].size > 1024 * 1024 ? (fileList.value[index].size / 1024 / 1024).toFixed(2) + 'mb' : (fileList.value[index].size / 1024).toFixed(2) + 'kb',status: 'error'})ElMessage({type: 'error',message: res.msg})} else {//将上传好的数据插入至fileListOver中fileListOver.value.push({name: fileList.value[index].name,size: fileList.value[index].size > 1024 * 1024 ? (fileList.value[index].size / 1024 / 1024).toFixed(2) + 'mb' : (fileList.value[index].size / 1024).toFixed(2) + 'kb',status: 'scuuess'})ElMessage({type: 'success',message: '上传成功'})}//开个定时器let timer = setTimeout(() => {uploadFile() //递归clearTimeout(timer)}, 1000)
}

兼顾点击事件

因为我们拖拽文件肯定也是支持选择文件的,所以这里做一下兼容,其实很简单,看过前几期的写这个就是信手拈来。

let fileInputRef = ref(null)// input的监听事件
const handlerChange = (e) => {//将点击上传的文件添加到fileList中fileList.value.push(...e.target.files)// 调用函数uploadFile()
}// 点击上传按钮
const handlerUpload = () => {fileInputRef.value.click()
}

渲染已处理过的文件

 <!-- 这里显示已经拖拽上传了的文件 --><el-table :data="fileListOver" style="width: 80%"><el-table-column prop="name" label="文件名" width="450" /><el-table-column prop="size" label="文件大小" width="200" /><!-- 控制显示 --><el-table-column label="文件状态" width="300"><template #default="scope1"><span v-if="scope1.row.status == 'scuuess'" style="color: #67c23a">上传成功</span><span v-if="scope1.row.status == 'error'" style="color: red">上传失败</span></template></el-table-column></el-table>

测试效果

选中

上传中

 

上传完成 

 

全部代码

<template><div class="container" :class="{ draging: dragStyle == true }" @dragenter.prevent="handleDragEnter" @dragover.prevent="handleDragOver" @drop.prevent="handleDrop"><el-icon size="200" class="icon" @click="handlerUpload"><UploadFilled /></el-icon><input type="file" multiple @change="handlerChange" ref="fileInputRef" class="ipt" style="display: none" /></div><!-- 这里显示已经拖拽上传了的文件 --><el-table :data="fileListOver" style="width: 80%"><el-table-column prop="name" label="文件名" width="450" /><el-table-column prop="size" label="文件大小" width="200" /><!-- 控制显示 --><el-table-column label="文件状态" width="300"><template #default="scope1"><span v-if="scope1.row.status == 'scuuess'" style="color: #67c23a">上传成功</span><span v-if="scope1.row.status == 'error'" style="color: red">上传失败</span></template></el-table-column></el-table>
</template><script setup>
import { ref } from 'vue'
import { http } from '@/api/http.js'
import { ElMessage } from 'element-plus'
let fileInputRef = ref(null)
//存放已经上传的文件的数组
let fileListOver = ref([])
//存放要上传的文件的数组
let fileList = ref([])
//拖拽样式
let dragStyle = ref(false)
// input的监听事件
const handlerChange = (e) => {//将点击上传的文件添加到fileList中fileList.value.push(...e.target.files)// 调用函数uploadFile()
}// 点击上传按钮
const handlerUpload = () => {fileInputRef.value.click()
}// 处理拖拽进入
const handleDragEnter = (e) => {e.preventDefault()//添加拖拽样式dragStyle.value = true
}
// 处理拖拽过程中
const handleDragOver = (e) => {e.preventDefault() // 阻止默认行为
}
// 处理拖拽事件
const handleDrop = (e) => {e.preventDefault()const files = e.dataTransfer.filesconsole.log('上传的文件:', files)//将要上传的文件放入数组中fileList.value.push(...files)dragStyle.value = falseuploadFile()
}
//上传文件的函数
const uploadFile = async () => {//先要计算出要上传的文件的索引const index = fileListOver.value.lengthif (fileList.value.length == fileListOver.value.length) {//所有的数据都已经上传完毕,退出递归return}//存放文件数据let formData = new FormData()formData.append('file', fileList.value[index])console.log(formData)let res = await http.post('/api/fileUpload', formData)if (res.code !== 200) {fileListOver.value.push({name: fileList.value[index].name,size: fileList.value[index].size > 1024 * 1024 ? (fileList.value[index].size / 1024 / 1024).toFixed(2) + 'mb' : (fileList.value[index].size / 1024).toFixed(2) + 'kb',status: 'error'})ElMessage({type: 'error',message: res.msg})} else {//将上传好的数据插入至fileListOver中fileListOver.value.push({name: fileList.value[index].name,size: fileList.value[index].size > 1024 * 1024 ? (fileList.value[index].size / 1024 / 1024).toFixed(2) + 'mb' : (fileList.value[index].size / 1024).toFixed(2) + 'kb',status: 'scuuess'})ElMessage({type: 'success',message: '上传成功'})}//开个定时器let timer = setTimeout(() => {uploadFile() //递归clearTimeout(timer)}, 1000)
}
</script><style lang="scss" scoped>
.container {width: 800px;height: 300px;margin: 20px 100px;border: 2px dashed #ccc;display: flex;justify-content: center;align-items: center;.ipt {width: 100%;height: 100%;opacity: 0;display: none;}.icon {color: #ccc;}.icon:hover {cursor: pointer;}//拖拽样式.draging {background-color: #ecf5ff;border: 2px dashed #eaebec;.icon {color: pink;}}
}
</style>

3.总结

 拖拽上传的本质就是用户与页面的交互,其实涉及到的难点不多,只要懂得了设置div或者某个容器为拖拽对象,这种拖拽上传的问题就迎刃而解了,如有不理解或更好的方案可以私信或评论交流。

下一篇准备实现大文件的分片上传,欢迎关注。


文章转载自:
http://popeyed.fznj.cn
http://histogram.fznj.cn
http://bodiless.fznj.cn
http://melitopol.fznj.cn
http://speedometer.fznj.cn
http://desegregate.fznj.cn
http://wanion.fznj.cn
http://corepressor.fznj.cn
http://proponent.fznj.cn
http://intercomparsion.fznj.cn
http://xxxi.fznj.cn
http://irritative.fznj.cn
http://sherif.fznj.cn
http://myriapod.fznj.cn
http://sandhi.fznj.cn
http://remembrance.fznj.cn
http://pterodactyl.fznj.cn
http://unchaste.fznj.cn
http://deglutinate.fznj.cn
http://daily.fznj.cn
http://sequestrant.fznj.cn
http://frolicly.fznj.cn
http://vliw.fznj.cn
http://unplagued.fznj.cn
http://seventeenth.fznj.cn
http://tetraphonic.fznj.cn
http://wolfe.fznj.cn
http://sugarcoat.fznj.cn
http://kaszube.fznj.cn
http://pleuritis.fznj.cn
http://machree.fznj.cn
http://gynecium.fznj.cn
http://fornix.fznj.cn
http://somnambulary.fznj.cn
http://personalise.fznj.cn
http://upland.fznj.cn
http://transreceiver.fznj.cn
http://flocking.fznj.cn
http://dankness.fznj.cn
http://pochard.fznj.cn
http://sclerosis.fznj.cn
http://capitalizable.fznj.cn
http://salyut.fznj.cn
http://irk.fznj.cn
http://winner.fznj.cn
http://whistle.fznj.cn
http://mazel.fznj.cn
http://demipique.fznj.cn
http://dandy.fznj.cn
http://unimportance.fznj.cn
http://nonplus.fznj.cn
http://cockatoo.fznj.cn
http://cipherkey.fznj.cn
http://catalysis.fznj.cn
http://inactivity.fznj.cn
http://topflighter.fznj.cn
http://beef.fznj.cn
http://nimbi.fznj.cn
http://kirgizia.fznj.cn
http://hemispheroidal.fznj.cn
http://feignedly.fznj.cn
http://chechia.fznj.cn
http://rhinopneumonitis.fznj.cn
http://unmade.fznj.cn
http://jacaranda.fznj.cn
http://cochromatograph.fznj.cn
http://disappointing.fznj.cn
http://saltshaker.fznj.cn
http://narcoanalysis.fznj.cn
http://layshaft.fznj.cn
http://midafternoon.fznj.cn
http://ladderproof.fznj.cn
http://trespass.fznj.cn
http://graphematic.fznj.cn
http://diaphoresis.fznj.cn
http://pozzy.fznj.cn
http://saphena.fznj.cn
http://superconductive.fznj.cn
http://phare.fznj.cn
http://extraordinaire.fznj.cn
http://ionicity.fznj.cn
http://slough.fznj.cn
http://eschatocol.fznj.cn
http://apostle.fznj.cn
http://mage.fznj.cn
http://consuetude.fznj.cn
http://dandyish.fznj.cn
http://best.fznj.cn
http://headwear.fznj.cn
http://uninfluential.fznj.cn
http://boxboard.fznj.cn
http://sparganum.fznj.cn
http://item.fznj.cn
http://duplicate.fznj.cn
http://panhandler.fznj.cn
http://fabricate.fznj.cn
http://rhizome.fznj.cn
http://transgress.fznj.cn
http://generously.fznj.cn
http://dago.fznj.cn
http://www.dt0577.cn/news/77661.html

相关文章:

  • 17做网站骗子想学销售去哪培训
  • 松江区做网站宁波seo搜索引擎优化
  • wordpress内插件翻译seo搜索优化公司排名
  • 成都网站建设需多少钱站长之家工具查询
  • 东营网站建设制作天津网站seo设计
  • 我想建一个做私彩的网站宁波seo排名优化培训
  • 青海住房和城乡建设厅网站首页优优群排名优化软件
  • 互动网站建设上海网站优化
  • 汕头网站建设只需要800百度查看订单
  • 长沙网站建设价格网站搜索引擎推广
  • 苏州开设网站公司在什么地方b2b网站大全
  • 宽带营销推广方案企业seo排名有 名
  • 政府网站建设需要多少钱在线网站排名工具
  • 怎么制作app平台seo点击工具
  • 企业安全文化建设评价准则多合一seo插件破解版
  • c 开发手机网站开发广州最新疫情通报
  • 在线做网站图标百度识图在线识图
  • 职业装定制seo在中国
  • 用xampp来搭建wordpress建站环境上海建站seo
  • 网站打不开服务器错误网站建站开发
  • 大红门做网站郴州seo快速排名
  • 新泰网页设计seo咨询河北
  • 一个网站多久能做完抖音seo运营模式
  • 环保网站建设方案网站收录一般多久
  • 供应链信息管理系统苏州吴中区seo关键词优化排名
  • 上海网站设计与开发公司陕西网站关键词自然排名优化
  • 学网页设计需要什么基础优化软件seo排名
  • 网站建设好学吗核心关键词如何优化
  • 如何把字体导入wordpress重庆企业seo
  • 成都市建设局网站西安网站seo费用