<template>
<div>
<a-modal
centered
title="批量上传图片"
v-model="dataVisible"
:keyboard="false"
class="img-modal"
:mask-closable="maskClosable"
ref="imgModal"
@cancel="closemodel"
>
<div class="many_pic">
<input type="file" v-show="false" class="img-file-input" ref="fileInput" multiple :accept="accept" @change="addImg2"/>
<div class="drag_upload_items" :class="changeclass" style="position: relative">
<a-upload-dragger
:accept="fileAccept"
v-show="showupload"
name="file"
:multiple="true"
:before-upload="()=>false"
@change="handleChange"
:show-upload-list="false"
>
<div class="ant-upload-drag-icon">
<img src="~@assets/images/pic_view/drag.png" alt="">
<a-button style="height: 31px;width: 111px;font-size: 14px" shape="round" type="primary">添加图片</a-button>
</div>
</a-upload-dragger>
<ul class="img-list" v-if="imgListShow">
<li class="img-li" v-for="({ src }, index) in imgList" :key="index">
<div class="img-li-inner">
<div class="img-wrapper" @mousedown.prevent="dragStart($event, index)" ref="imgWrapperList">
<img class="img" :src="src" ref="imgList"/>
<div class="img-del-btn-wrapper">
<a-button class="img-del-btn" size="small" type="danger" title="删除图片" @click="delImg(index)" @mousedown.stop>删除图片</a-button>
</div>
<div class="img-name">{{items[index] && items[index].supplierPartId}}</div>
</div>
</div>
</li>
<li class="img-li">
<a-button class="img-add-btn" @click="addImgTip" title="上传图片" v-show="!showupload">
<a-icon type="plus" style="font-size: 21px;color: #3D97D4;font-weight: 400"/>
添加图片
</a-button>
</li>
</ul>
<a-spin style="position: absolute;top: 50%;left: 50%" size="large" v-show="loadings"/>
</div>
</div>
<template #footer>
<a-button title="保存" type="primary" @click="save" class="footer-btn">保存</a-button>
<a-button title="清空" class="form-right-btn empty" @click="clearimglist">清空</a-button>
</template>
</a-modal>
<div class="drag-img-outer" v-show="dragShow" ref="dragObj">
<div class="drag-img-inner">
<img class="drag-img" :src="dragSrc"/>
</div>
</div>
</div>
</template>
<script>
import ModalMixin from "@/mixins/ModalMixin";
import BaseMsg from "@/tools/BaseMsg";
const getElementToPageTop = element => {
const { offsetParent, offsetTop } = element;
return offsetParent ? (getElementToPageTop(offsetParent) + offsetTop) : offsetTop;
};
const getElementToPageLeft = element => {
const { offsetParent, offsetLeft } = element;
return offsetParent ? (getElementToPageLeft(offsetParent) + offsetLeft) : offsetLeft;
};
const MODAL_DIALOG_SELECTOR = "[role=dialog]";
export default {
data() {
return {
imgType: ["image/jpeg", "image/png"],
imgList: [],
dragShow: false,
dragSrc: "",
dragSpeed: 10,
dragMouseX: null,
dragMouseY: null,
dragIndex: null,
showupload:true,
changeflag:true,
items:[],
hasup:0,
fileType: ["image/jpeg", "image/png", "image/jpg"],
loadings:false,
}
},
computed: {
imgListShow() {
return this.imgList && this.imgList.length > 0;
},
accept() {
return this.imgType.join(',');
},
maxCount() {
return this.items ? (this.items.length > 10 ? 10 : this.items.length) : 0;
},
changeclass(){
let changeclass = this.changeflag ? "changeclass": ""
return changeclass
},
fileAccept() {
return this.fileType.length === 0 ? "*" : this.fileType.join(",");
},
},
methods: {
getItems(e){
this.items = e
this.showupload = true
this.changeflag = true;
this.hasup = 0;
},
//第二种新增
addImg2({ target: { files, value } }) {
if (!value) {
return;
}
this.addImg(files)
},
// 新增图片
addImg(files) {
const { error } = BaseMsg;
if (files && files.length > 0) {
const promises = [];
const length = files.length > this.maxCount ? this.maxCount : files.length;
for (let i = 0; i < length; i++) {
const file = files[i];
const { type, size, name } = file;
if (!this.imgType.includes(type)) {
error('请选择JPG或PNG格式图片');
return;
}
const MAX_FILE_NAME_LENGTH = 128;
if (name.length > MAX_FILE_NAME_LENGTH) {
error(`文件名称不能超过${MAX_FILE_NAME_LENGTH}个字符`);
return;
}
if (size < 10240) {
error('图片需大于10KB');
return;
}
const formData = new FormData();
formData.append('reapPicUrl', file);
this.loadings = true
applyReapPicV2(
formData
).then(({data}) => {
this.imgList.push({MD5Name:data.md5Name,src:data.url})
}).finally(()=> this.loadings = false)
}
//Promise.all(promises).then(imgList => this.imgList.push(...imgList));
}
},
// 删除图片
delImg(index) {
this.imgList.splice(index, 1);
if(this.imgList.length ===0){
this.showupload = true;
this.changeflag = true;
}
},
save() {
if (!this.imgListShow) {
BaseMsg.error("至少上传一张图片");
return;
}
const itemIdList = this.items.map(({ itemId,supplierOrderId }) => ({itemId,supplierOrderId}));
const fileList = this.imgList.map(e => ({ MD5Name: e.MD5Name }));
const mergedArray = [];
let size_sum = 0
if(itemIdList.length > fileList.length){
itemIdList.forEach((e,index)=>{
if(index < fileList.length){
const reapPicUrl = fileList[index];
mergedArray.push({ ...reapPicUrl, ...e });
//size_sum += reapPicUrl.size
}else{
const reapPicUrl = fileList[fileList.length -1];
mergedArray.push({ ...reapPicUrl, ...e });
//size_sum += reapPicUrl.size
}
})
}else{
fileList.forEach((reapPicUrl, index) => {
const objB = itemIdList[index];
mergedArray.push({ ...reapPicUrl, ...objB });
//size_sum += reapPicUrl.size
});
}
if(size_sum > 20971520){
BaseMsg.error("图片总大小超过20M")
}
let param = {
"reapPicApplyReqVOS":mergedArray
}
BaseMsg.confirm({
content: "确认保存?",
onOk: () => batchBuyerApplyReapPic(
param
).then(({data}) => {
this.$emit("ok");
BaseMsg.success("已保存");
this.$emit("manyImg",data)
this.close();
})
});
},
show() {
this.imgList = [];
},
addImgTip() {
if (this.imgList.length < this.maxCount) {
const { fileInput } = this.$refs;
if (fileInput) {
fileInput.value = "";
fileInput.click();
}
} else {
BaseMsg.info("图片文件数不能大于选中的商品数量(一次最多10张)");
}
},
// 开始拖动
dragStart({ currentTarget, pageX, pageY }, index) {
const { imgList, dragObj, imgModal } = this.$refs;
const { src, width, height } = imgList?.[index];
this.dragSrc = src;
const pageLeft = getElementToPageLeft(currentTarget);
const pageTop = getElementToPageTop(currentTarget);
const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
const { scrollTop, scrollLeft } = imgModalDialog;
// edge浏览器和其他浏览器不一致
const bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const bodyScrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
dragObj.style.left = `${pageLeft - scrollLeft}px`;
dragObj.style.top = `${pageTop - scrollTop}px`;
dragObj.style.width = `${width}px`;
dragObj.style.height = `${height}px`;
this.dragShow = true;
this.dragMouseX = pageX - bodyScrollLeft + scrollLeft - pageLeft;
this.dragMouseY = pageY - bodyScrollTop + scrollTop - pageTop;
this.dragIndex = index;
document.addEventListener("mousemove", this.drag);
document.addEventListener("mouseup", this.dragEnd);
},
// 拖动
drag($event) {
debugger
$event.preventDefault();
const { $refs: { dragObj, imgModal }, dragMouseX, dragMouseY } = this;
const { pageX, pageY } = $event;
const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
const { scrollTop, scrollLeft } = imgModalDialog;
// edge浏览器和其他浏览器不一致
const bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const bodyScrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
const { offsetHeight } = dragObj;
const { clientHeight } = document.documentElement;
const left = pageX - bodyScrollLeft - dragMouseX;
const top = pageY - bodyScrollTop - dragMouseY;
// 拖动到边缘
if (top <= 5) {
imgModalDialog.scrollTop = scrollTop - this.dragSpeed;
if (top <= -40) {
if (this.dragSpeed < 100) {
this.dragSpeed++;
}
} else {
this.dragSpeed = 10;
}
} else if (top + offsetHeight >= clientHeight - 5) {
imgModalDialog.scrollTop = scrollTop + this.dragSpeed;
if (top + offsetHeight >= clientHeight + 40) {
if (this.dragSpeed < 100) {
this.dragSpeed++;
}
} else {
this.dragSpeed = 10;
}
} else {
this.dragSpeed = 10;
}
dragObj.style.left = `${left}px`;
dragObj.style.top = `${top}px`;
},
// 拖动结束
dragEnd($event) {
$event.preventDefault();
document.removeEventListener("mousemove", this.drag);
document.removeEventListener("mouseup", this.dragEnd);
const { imgWrapperList, dragObj, imgModal } = this.$refs;
if (dragObj) {
const { offsetLeft, offsetTop, clientHeight, clientWidth } = dragObj;
if (imgWrapperList) {
let column = 1;
let row = 1;
const ROW_COUNT = 5;
const imgModalDialog = imgModal.$el.querySelector(MODAL_DIALOG_SELECTOR);
const { scrollTop, scrollLeft } = imgModalDialog;
for (const verticalIndex in imgWrapperList) {
if (verticalIndex > 0 && verticalIndex % ROW_COUNT == 0) {
const imgWrapper = imgWrapperList[verticalIndex];
const top = getElementToPageTop(imgWrapper) - scrollTop;
const dragBottom = offsetTop + clientHeight;
const imgMiddle = top + imgWrapper.clientHeight / 2;
if (dragBottom < imgMiddle) {
column = (+verticalIndex) / ROW_COUNT;
break;
}
const tempColumn = Math.floor((imgWrapperList.length - 1) / ROW_COUNT);
if (verticalIndex == tempColumn * ROW_COUNT) {
column = tempColumn + 1;
}
}
}
for (const horizontalIndex in imgWrapperList) {
if (horizontalIndex >= ROW_COUNT) {
break;
}
if (horizontalIndex > 0) {
const imgWrapper = imgWrapperList[horizontalIndex];
const left = getElementToPageLeft(imgWrapper) - scrollLeft;
const dragRight = offsetLeft + clientWidth;
const imgMiddle = left + imgWrapper.clientWidth / 2;
if (dragRight < imgMiddle) {
row = +horizontalIndex;
break;
}
if (horizontalIndex == imgWrapperList.length - 1) {
row = imgWrapperList.length;
} else if (horizontalIndex == ROW_COUNT - 1) {
row = ROW_COUNT;
}
}
}
let newIndex = (column - 1) * ROW_COUNT + row - 1;
if (newIndex >= this.imgList.length) {
newIndex = this.imgList.length - 1;
}
const { dragIndex } = this;
const [oldImg] = this.imgList.splice(dragIndex, 1);
this.imgList.splice(newIndex, 0, oldImg);
}
}
this.dragShow = false;
},
handleChange({file}){
this.hasup++
if(this.hasup > 10){
BaseMsg.error("单次最多可选择10张图片")
}
else if(10 > this.hasup && this.hasup > this.maxCount){
return false
}else{
let a = [file]
this.addImg(a)
this.showupload = false
this.changeflag = false;
}
},
closemodel(){
this.hasup = 0
},
clearimglist(){
this.showupload = true
this.changeflag = true;
this.hasup = 0;
this.imgList = [];
}
},
mounted() {
const { dragObj } = this.$refs;
if (dragObj) {
document.body.appendChild(dragObj);
}
},
beforeDestroy() {
const { dragObj } = this.$refs;
if (dragObj) {
document.body.removeChild(dragObj);
}
document.removeEventListener("mousemove", this.drag);
document.removeEventListener("mouseup", this.dragEnd);
}
};
</script>
<style lang="less" scoped>
@import "~@assets/less/base-mixin.less";
.img-modal{
.img-file-tip{
color: @main-color;
font-size: 14px;
margin-bottom: 10px;
}
.img-list{
.clearfix;
margin: 10px -5px;
.img-li{
float: left;
padding: 5px;
width: 132px;
height: 132px;
margin: 0 5px;
.img-li-inner{
border: 1px solid #DDD;
.radius(5px);
padding: 5px;
cursor: pointer;
.img-wrapper{
height: 0;
padding-bottom: 100%;
display: block;
position: relative;
text-align: center;
.img{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.img-del-btn-wrapper{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
.opacity(0);
.baseTransition;
.img-del-btn{
display: inline-block;
vertical-align: middle;
z-index: 2;
}
&::before{
content: "";
height: 100%;
display: inline-block;
vertical-align: middle;
}
}
.img-name {
position: absolute;
bottom: 0;
left: 0;
right: 0;
color: #FFF;
background-color: @main-color;
padding: 2px 0;
}
}
&:hover .img-wrapper{
&::before{
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.1);
z-index: 1;
}
.img-del-btn-wrapper{
.opacity(1);
}
}
}
}
}
}
.drag-img-outer{
position: fixed;
overflow: hidden;
z-index: 9999;
.opacity(0.7);
.drag-img-inner{
width: 100%;
height: $width;
.drag-img{
width: 100%;
height: $width;
}
}
}
.many_pic{
min-height: 313px;
width: 100%;
display: flex;
flex-direction: column;
.drag_upload_items{
flex: 1;
display: flex;
span{
display: block;
width: 322px;
height: 173px;
}
}
}
.img-add-btn{
width: 122px;
height: 122px;
color: #3D97D4;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
/deep/ .ant-modal-body .ant-upload-drag{
background-color: #fff;
}
.drag_icon{
width: 132px;
height: 13px;
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 300;
color: #999999;
}
.ant-upload-drag-icon{
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
height: 80%;
img {
width: 31px;
height: 26px;
}
}
.changeclass{
justify-content: center;
align-items: center;
}
</style>
相关推荐
vue elementui 实现图片上传后拖拽排序功能
vue elementui 实现图片上传后拖拽排序功能。 1、主要技术栈 vue、elementui、vuedraggable 2、需求分析 产品的要求就是多图上传完后,可以对图片列表进行拖拽排序。本身elementui的el-...
【vue2+element-ui】el-upload封装多图上传组件
【vue2+element-ui】el-upload封装成可动态限制上传的图片数量、大小,支持删除、显示提示语的组件
vue拖拽上传文件实践
最近有一个上传文件的需求,后来琢磨了半天,上网查找资料,最后终于做出来了。 组件编写 首先,写一个简单的拖拽页面。 <div class="upload"> 拖拽上传 </div> 给一点样式 .upload { margin: 100px auto; width: 400px; height: 400px; border: 2px dashed ...
Vue项目中利用webpack的require.context实现批量引入/导入图片
前端项目中难免会有需要几十种icon或者png等类型的图片的情况,如果一个个import未免太过繁琐。使用webpack的 require.context实现vue项目中的批量导入引入图片等静态资源
用Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
用Vue2实现移动端图片上传、压缩、拖拽删除功能图片上传图片压缩添加拖拽排序、拖拽到指定位置删除功能 之前在公司开发过一段时间的移动端H5页面,有个功能就是要上传图片+压缩。参考了一下网上的方法,外加自己摸索的过程,最终实现了这个功能。后面在家闲的时候又加多了个长按选中图片,并且可以拖拽到指定位置删除的功能。 github地址:代码地址 下面直接进入正题: 图片上传 图片上传用的是HTML的input标签实现的。核心就是把获取到的文件通过FileReader转换成图片,代码如下: <input typ
图片上传+拖动排序(vue2+elementUI+vuedraggable)
vue2+elementUI+vuedraggable图片上传后可拖曳排序,可放大查看原图和删除图片。拖曳图片改变图片排序。
v-uploader - 基于 Vue2 简洁易用,可批量、拖拽的文件上传插件
v-uploader 基于 Vue2 简洁易用,可批量、拖拽的文件上传插件 Demo、文档 请浏览 English site 国内站点 插件预览 单文件上传带图片预览模式 批量上传,支持拖拽模式 插件安装 npm i v-uploader --save 复制代码在项目入口文件 main.js 中引用插件 import Vue from 'vue' import vUploade...
C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)
C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) 大家好,我是菌菌巧乐兹,励志用最简单的语言来讲解程序知识点。
使用 Vue 3 实现图片拖拽上传功能
前端开发中,用户体验是至关重要的,图像上传是许多 web 应用中经常需要的功能之一。为了提升用户的交互体验,拖拽上传功能可以减少用户的操作步骤,让用户能够更加直观地上传文件。本文将介绍如何使用 Vue 3 和其新的 Composition API (setup 语法糖) 实现一个简单的图片拖拽上传功能。以上就是使用 Vue 3 和 setup 语法糖实现图片拖拽上传功能的完整示例。通过以上步骤,你可以轻松地在你的前端应用中集成这个功能,大幅提高用户的交互体验。现在,我们需要安装额外的库,用于处理文件上传。
设备树实践:从零构建一个嵌入式板级的设备树描述
本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。
Linux下自动化解析q7签名文件的有效期与时间戳
本文详细介绍了在Linux环境下自动化解析q7签名文件有效期与时间戳的方法。通过编写高效脚本,开发者可以批量提取签名时间信息,验证签名有效性,并集成到CI/CD流程中。文章提供了完整的脚本实现,包括错误处理、批量处理功能,并解决了常见环境问题,特别适用于国产操作系统如UOS的开发场景。
图片拖拽上传
功能: 实现图片拖拽上传并能显示拖拽进去的图片 下面是html的页面内容(此例子是在vue中应用,有用到element ui的组件): <div class="aileft"> <div class="dragImg" @dragenter="dragEnter" @dragleave="dragLeave" @dragover...
[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析
本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。
vue拖拽或点击上传图片
一、预览图 二、实现 点击上传思路:将input的type设置为“file”类型即可上传文件。隐藏该input框,同时点击按钮时,调取该input的点击上传功能。剩下的就是css优化页面了。 拖拽上传思路:通过给拖拽框dropbox绑定拖拽事件,当组件销毁时解绑事件。在拖拽结束,通过event.dataTransfer.files获取上传的文件信息。然后在对文件进行上传服务器操作。 接下来请允许我简单介绍一下各个组件: upload.vue封装了点击上传的逻辑,而进度条则没有做,后期可基于percent
玩转 InternVL3.5 轻量级实战:从部署到优化的全记录
玩转 InternVL3.5 轻量级实战:从部署到优化的全记录
短信验证码逻辑漏洞学习——各种绕过姿势技巧
短信验证码逻辑漏洞学习——各种绕过姿势技巧
antd vue3 图片上传组件扩展,支持多图上传 图片拖拽排序等
antd vue3 a-upload组件多图上传,图片拖拽排序 multiple=true
Python爬虫:实时交通流量数据爬取与路况分析
随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。
Vue 实现图片列表上传,拖拽排序,图片编辑(裁剪,马赛克,翻转等功能)上传用了element-ui组件可不用
Vue 实现图片列表上传,拖拽排序,图片编辑(裁剪,马赛克,翻转等功能)上传用了element-ui组件可不用1、相关插件2、组件如何使用3、效果展示4、imgUpload封装的组件代码 1、相关插件 1、 vue-cropper 裁剪,旋转,放大等功能 2、 vuedraggable 拖拽排序功能 3、element-ui,大家可以用 也可不用 我项目中用了,但是和图片编辑功能无关(但是和图片批量上传有关系,不过也可以自己封装图片上传功能) 2、组件如何使用 1、slot 插槽 自己定义上传图片按钮样式
把 SAP S/4HANA 中的 Maintain Email Templates 用好:从模板维护、语言变体、业务绑定到传输治理的完整实践
摘要:SAP邮件模板管理常被低估,实则关乎审批通知、业务提醒等关键输出。官方推荐通过复制标准模板实现自定义,而非直接修改标准内容,以保持核心稳定。模板维护涉及语言变体、业务绑定、数据传输等治理环节,需业务顾问与开发团队协作确保字段来源与渲染逻辑。实施时需注意Fiori配置、权限分配及传输管理,避免测试与生产环境差异。模板设计应平衡灵活性与复杂度,遵循分层测试策略(内容、数据、流程),并建立命名规范以维护资产清晰度。(149字)
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
3分钟上手vue2-manage文件上传:从拖拽到预览的全流程实现
vue2-manage是一个基于Vue + Element UI构建的后台管理系统,提供了完整的文件上传功能模块,支持拖拽上传、图片预览、格式验证等核心功能。本文将带你快速掌握如何在vue2-manage项目中实现从文件选择到预览的全流程操作。 ## 快速了解vue2-manage的文件上传组件 vue2-manage采用Element UI的el-upload组件作为基础,在多个业务场景中实
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
Vue操作:实现拖拽及点击上传本地图片
实例:实现拖拽及上传图片 代码如下: <div id="leftContain" style="width: 90%;height: 90%"> <img id="img" class="img" align="center" src=""> <input type="file" @change="uploadImg($event)" ...
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
简化文件上传流程:学习如何封装Vue2拖拽上传组件
🖼文件拖拽上传功能现在已经随处可见,大家应该都用过了吧,那么它具体是怎么实现的大家有去了解过吗?今天我们一起来实现一下这个功能,并封装一个拖拽上传组件吧。
vue-quill-editor图片大小的编辑,拖拽,上传视频
vue-quill-editor图片大小的编辑,拖拽,上传视频 在vue组件中注册和使用 <quill-editor v-model="formInline.viewConfig" :options="quillOption"></quill-editor> 在vue组件中引入配置文件 import quillConfig from '@/utils/quill-...
vue脚手架-上传图片 图片拖拽(draggable)、更新(四)
目录: 一、拖拽 二、更新 先来看下效果,是不是你想要的吧~ 现在把第四张,拖拽到第二张的位置,是以插入的形式进行的哦 开始的时候,预备着就是做个上传、删除的功能,到了后面公司又新增了需求,要求拖拽来改变排序。于是我就想着像这种拖拽的应该会有个插件,然后就找到了这个插件 Vue.Draggable ,我是通过这个来了解draggable的。然后在网上也看了别人的例子,然后很多人的都是把显示图片 添加 删除那些都暴露了出来,意味着我之前写的代码都可能得重写,加上我实现得这个不是就是个上传功能的图片墙,当然
vue上传多张图片,可删除、可拖拽位置
vue后台项目实现图片上传
2万+



被折叠的 条评论
为什么被折叠?



