使用element+vuedraggable实现图片上传拖拽排序

本文实例为大家分享了用element+vuedraggable实现图片上传拖拽排序的具体代码,供大家参考,具体内容如下

<template>
    <div class="allUpload">
        <div class="clearfix">
            <div class="wrap">
                <draggable
                    v-model="value"  
                    animation="400" 
                    class="clearfix"
                >
                    <transition-group>

                        <div class="left middleCenter" v-for="(item,index) in value" :key="item.id">
                            <img :src="item.url" alt="">
                            
                            <div class="content-wrap">
                                <div class="content middleCenter">
                                    <i class="el-icon-zoom-in" @click="showImg(item.url)" ></i>
                                    <i class="el-icon-delete" @click="delImg(item,index)"></i>
                                </div>
                            </div>
                        </div>
                        
                    </transition-group>

                    <div slot="footer" style="float:left">
                        <el-upload
                            class="wrap"
                            list-type="picture-card"
                            :action="imgUploadUrl"
                            :show-file-list="false"
                            :limit="max"
                            :on-progress="handlePictureCardPreview"
                            :on-exceed="onExceed"
                            :disabled="disabled"
                            :on-change="onChange"
                            :file-list="fileList"
                            :multiple="true"
                            :on-success="handleSuccess"
                            v-if="isUploadBtn"
                        >
                            <i slot="default" :class="uploadLoading ? 'el-icon-loading' : 'el-icon-plus'"></i>
                        </el-upload>
                    </div>
                </draggable>
            </div>
            
        </div>
        
        <el-dialog title="查看图片" :visible.sync="dialogVisible">
            <img width="100%" :src="dialogImageUrl" alt="">
        </el-dialog>
    </div>
</template>

<script>
import draggable from 'vuedraggable'
import {imgUpload} from '@/api/upload'
import {MathRandom} from '@/utils/auth'
import { promises } from 'fs'
export default {
    name:'Upload',
    data () {
        return {
            dialogImageUrl: '',
            uploadLoading:false,
            dialogVisible: false,
            disabled: false,
            fileList:[],
            imgUploadUrl:imgUpload(),
            arrs:[]
        }
    },
    props: {
        value: {
            type: () => [],
            default () {
                return []
            }
        },
        max:{
            type:[Number,String],
            default:9
        },
        disabled:{
            type:Boolean,
            default:false
        }
    },
    model:{
        event: 'giveActive'
    },
    computed:{
        isUploadBtn(){
            return this.value.length<this.max
        },
        imgArr(){
            return this.value
        }
    },

    mounted(){
        this.value =[]

        // this.fileList =[]

        const unwatch = this.$watch('value', function(newValue, oldValue){
            console.log(12312323)
            this.fileList = newValue
            unwatch()

        });

    },
    methods: {
       
        go () {
            this.$emit('giveActive', this.value);
        },
        showImg(url){
            this.dialogImageUrl = url
            this.dialogVisible = true
        },
        delImg(item,index){
            this.$confirm('此操作将永久删除该图片, 是否继续?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.value.splice(index,1)
                this.fileList.splice(index,1)
                this.go()
            }).catch(() => {
                        
            });

        },
        onChange(file,fileList){
            this.fileList = fileList
        },
        
        handlePictureCardPreview(file) {
            this.uploadLoading = true
        },
        onExceed(files, fileList,props){
            this.$message({
                message:`超出最大上传数量,最多可上传${this.max}张图片`,
                type:'error'
            })
        },
        handleSuccess(response, file,fileList) {
            this.uploadLoading =false
            this.urlList(response)
        },
        urlList(res){
            const obj={
                id:MathRandom(),
                url:res.data.data,
                status:'success',
                uid:MathRandom()
            }
            if(this.value.length<this.max){
                
                this.value = [...this.value,obj]
                this.go()
            }
            

        }
    }
}
</script>

<style lang='scss' scoped>
    .allUpload{

        .left{
            float: left;
            width: 148px;
            height: 148px;
            border-radius: 6px;
            border: 1px solid #c0ccda;
            margin:0 20px 20px 0;
            overflow: hidden;
            position: relative;
            cursor: pointer;
            &:hover{
                .content-wrap{
                    display: block;
                }
            }
            .content-wrap{
                display: block;
            }
            img{
                max-width: 100%;
                max-height: 100%;
                object-fit: cover;
            }
            .content-wrap{
                display: none;
                position: absolute;
                z-index: 99999999;
                width: 100%;
                height: 100%;
                background:rgba($color: #000000, $alpha: 0.4);
                .content{
                    width: 100%;
                    height: 100%;
                    i{
                        color: #fff;
                        font-size: 18px;
                        &:nth-of-type(1){
                            margin-right: 10px;
                            
                        }
                        &:nth-of-type(2){
                            margin-left: 10px;
                            
                        }
                    }
                }
            }
            
        }
        
        .wrap{
            float: left;
        }
    }
</style>

效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈element关于table拖拽排序问题

    最近在使用element table的时候,经常会遇到排序的问题,如果只是简单的排序的话,element官方已经给出了指定的方法 //table的默认排序方式是按ID排序 顺序为递减 这里可以改成其它 比如 order <el-table :data="tableData" :default-sort="{prop: 'ID', order: 'descending'}"> //设置sortable属性时出现排序按钮 <el-table-colum

  • vue拖拽排序插件vuedraggable使用方法详解

    大家好,最近做的项目要用到拖拽排序,我现在的项目是vue项目,所以我就屁颠屁颠的去百度有木有这样功能的插件,我就知道一定会有,那就是vuedraggable,这是一款很棒的拖拽插件,下面我来说一下怎么引入 首先在vue项目中,用npm包下载下来 npm install vuedraggable -S 下载下来后,引入插件,在你的vue文件的script标签里面这样引入 import draggable from 'vuedraggable' 别忘了下面要注册组件 components: { dr

  • 使用vuedraggable实现从左向右拖拽功能

    本文实例为大家分享了使用vuedraggable实现从左向右拖拽的具体代码,供大家参考,具体内容如下 1 功能描述 使用vuedraggable实现从左边框中拖拽到右边的框中,左边的框不能随意拖拽改变位置,不能向左边框中拖拽组件.右边框中的组件可以拖动位置,但不能拖入到左边框里. 注意事项如下: (1)draggable的group中的name属性必须一致: (2)左边框中的draggable必须含有以下属性,group中的pull:'clone'属性表示可以生成新的组件:group中的put:

  • Elementui表格组件+sortablejs实现行拖拽排序的示例代码

    前言 运营小姐姐说想要可以直接拖拽排序的功能,原来在序号六的广告可能会因为金主爸爸加钱换到序号一的位置,拖拽操作就很方便 效果 实现方式 template部分 <el-table v-loading="loading" :default-sort="{prop: 'sortNum', order: 'ascending'}" :data="list" border align="left" > <el-tab

  • Vue 基于 vuedraggable 实现选中、拖拽、排序效果

    今天有个朋友说要做个效果:Vue实现拖拽排序,要有 checked,输出结果是排序后的,要全选,未选中的不能拖动. 其实我之前基于 Sortable 做过一个类似的效果.也给他看过了,没看太明白,他就自己基于 vuedraggable 实现了一下. 正好有点问题给他解决了一下.废话不多说,先上最终效果:Vue 拖拽排序效果 测试地址.下面就是最终效果图. 效果一:实现选中 和 全选效果 就下面这样,elementUI 官方 Demo.很简单毫无挑战呀. <el-checkbox :indeter

  • vue拖拽组件vuedraggable使用说明详解

    vue拖拽组件vuedraggable的使用说明,供大家参考,具体内容如下 需了解H5的draggable属性,通过下面的代码注释,可了解 <!DOCTYPE html>   <html lang="en">   <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-widt

  • vue使用vuedraggable实现嵌套多层拖拽排序功能

    本文实例为大家分享了vuedraggable实现嵌套多层拖拽排序功能的具体代码,供大家参考,具体内容如下 vue中实现嵌套多层拖拽功能.官网入口: 实现效果:(拖动左侧调整一级的顺序,拖动右侧调整二级的顺序) 实现步骤: ***这里使用了插件  vuedraggable 第一步:安装插件 cnpm install vuedraggable --save 第二步:在页面上引入插件并注册 import draggable from 'vuedraggable' components: {     d

  • vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序

    vue拖拽克隆clone组件API, vue.draggable实现盒子之间相互拖拽排序克隆(网上资源整理的文档) 效果图: -------------------------------------------------------------------------------- 首先需要安装vuedraggable依赖包: npm install vuedraggable --save 因为拖拽组件依赖sortablejs ,如果项目没有安装sortablejs ,可能需要安装一下 np

  • vuedraggable+element ui实现页面控件拖拽排序效果

    项目要实现一些控件的拖拽排序.从而找到了这款vuedraggable控件,供大家参考,具体内容如下 如上图要实现这些控件的拖拽排序 这是拖拽后 由于公司网络的原因,项目没有使用npm,都是使用的引入的js <script type="text/javascript" src="lib/sortable/Sortable.min.js"></script> <script type="text/javascript"

  • 使用element+vuedraggable实现图片上传拖拽排序

    本文实例为大家分享了用element+vuedraggable实现图片上传拖拽排序的具体代码,供大家参考,具体内容如下 <template>     <div class="allUpload">         <div class="clearfix">             <div class="wrap">                 <draggable          

  • .net core版 文件上传/ 支持批量上传拖拽及预览功能(bootstrap fileinput上传文件)

    上篇文章给大家介绍了MVC文件上传支持批量上传拖拽及预览文件内容校验功能 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:nuget install bootstrap-fileinput 注意:这里的导包需要在终端导入[需要在wwwroot文件夹下执行nuget命令]如下图 如果发现没有nuget命令,则需要通过apt-get 或者yum 给系统安装nuge包管理工具,这个nuget和vscode中的插件不是一回事 2前台页面编写

  • MVC文件上传支持批量上传拖拽及预览文件内容校验功能

    网站中的上传相信大家都不陌生,也算是一个小小的技术难点,尤其时在asp.net中,上传的一些大小限制以及上传的进度的控制,以及用户体验等方面,今天在这里分享一个在asp.net mvc模式下的文件上传,同样适用于其它web类型bootstrap-fileinput . 它来自一个开源项目 git:https://github.com/kartik-v/bootstrap-fileinput/ 文档地址:http://plugins.krajee.com/file-input 用一个下午的时间将文

  • 基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能

    用Vue2实现移动端图片上传.压缩.拖拽排序.拖拽删除功能 图片上传图片压缩拖拽排序.拖拽删除 之前在公司开发过一段时间的移动端H5页面,有个功能就是要上传图片+压缩.参考了一下网上的方法,外加自己摸索的过程,最终实现了这个功能.后面在家闲的时候又加多了个长按选中图片,并且可以拖拽排序.拖拽到指定位置删除的功能. github地址:代码地址 下面直接进入正题: 图片上传 图片上传用的是HTML的input标签实现的.核心就是把获取到的文件通过FileReader转换成图片,代码如下: <inpu

  • 基于Node的React图片上传组件实现实例代码

    写在前面 红旗不倒,誓把JavaScript进行到底!今天介绍我的开源项目 Royal 里的图片上传组件的前后端实现原理(React + Node),花了一些时间,希望对你有所帮助. 前端实现 遵循React 组件化的思想,我把图片上传做成了一个独立的组件(没有其他依赖),直接import即可. import React, { Component } from 'react' import Upload from '../../components/FormControls/Upload/' /

  • 用element的upload组件实现多图片上传和压缩的示例代码

    我用vuex做状态管理,七牛云做图床. 项目地址:多图片上传组件 效果展示 项目执行流程 首先,让我们来分析一下实现多图片上传的流程: 前端向后端请求用来上传图片至服务器的token 后端为每张要上传的图片生成一个图片名,并用这个图片名生成token 后端将图片名和token返回给前端 前端拿到token以后,将图片上传至服务器 上传成功以后,前端将图片名发给后端 后端将图片名存入数据库 项目实现过程 1.我们要利用element-ui的Upload组件布置界面: //upload.vue <e

  • Vue + Element UI图片上传控件使用详解

    上一篇 Vue +Element UI +vue-quill-editor 富文本编辑器及插入图片自定义 主要是写了富文本编辑器的自定义及编辑器中图片的上传并插入到编辑内容,这篇文章单独介绍一下element UI 图片上传控件的使用.首先要安装element并中引入,安装引入过程这里不再赘述. 1.引用element 上传控件. <el-upload action="/mgr/common/imgUpload"//这里需要配置一下文件上传地址(跨域) list-type=&qu

  • vue+element实现图片上传及裁剪功能

    本文实例为大家分享了vue+element实现图片上传及裁剪的具体代码,供大家参考,具体内容如下 随便写的一个小demo 功能是没有任何问题 可能里面会有一些小细节没有优化 1 .安装 vue-cropper npm install vue-cropper 2.组件内使用 import { VueCropper } from 'vue-cropper' components: { VueCropper, }, 具体可见官网 demo <template> <div> <h1&

  • Vue+Element+Springboot图片上传的实现示例

    最近没事刚好联系下vue+springboot前段后分离的项目.用上了图片上传功能.记录一下. 前端待提交的表单部分代码 <el-form-item label="封面图片"> <el-upload v-model="dataForm.title" class="avatar-uploader" :limit="1" list-type="picture-card" :on-preview

随机推荐