vue 使用elementUI组件中的图片预览功能扩展 和 批量删除功能实现

有一列显示的图片,现需要点击图片,预览该图片,使用的elementui中的previewSrcList做的图片预览,

但是测试发现,无论点击表格中的那张图片,预览的大图都是从第一张图片,开始预览;

后面通过更改每张图片绑定的图片list的顺序,解决了次问题;

首先,自己下载
vue.js和axios.js

我用了部分layUI框架的知识点
结合了elementUI的知识点

效果图在最下面最好先看看

完整代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>相册信息- Layui</title>
    <link rel="stylesheet" href="../static/layui/css/layui.css">
    <link rel="stylesheet" href="../static/css/backstage.css">
    <script src="../static/js/vue.js"></script>
    <script src="../static/js/axios.js"></script>
    <!--<script src="//unpkg.com/vue/dist/vue.js"></script>-->
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <style>
        .user-headImage{
            height: 300px;
            width: 300px;
            /* display: inline-block;*/
            float: left;
        }
        .user-headImage img{
            object-fit: cover; /*不变形、铺满*/
            width: 100%;
            height: 100%;
            border-radius: 5%;
        }
        .list{
            float: left;
            margin-right: 10px;
        }
       .list-right{
           position: absolute;
           top: 2px;
           right: 3px;
           color: #c8e1fa;
           z-index: 1;
           cursor: pointer;
       }
        .list-right-div{
            display: none;
        }
        .list-right-div button{
            border: none;
            margin-bottom: 3px;
            background-color: #c8e1fa;
            border-radius: 3px;
            cursor: pointer;
        }
        .list-right:hover .list-right-div{
            display: block;
        }
        .lists-value{
            position: absolute;
            left: 2px;
            z-index: 1;
            display: none;
        }

    </style>
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
    <div th:replace="~{own/commes :: topbar}"></div>
    <div th:replace="~{own/commes :: sidebar}"></div>
    <div class="layui-body" style="padding-left: 20px">
        <!-- 内容主体区域 -->
        <div style="margin-top: 20px;margin-bottom: 30px">
            <button type="button" data-method="addImages" class="layui-btn layui-btn-normal addIma">上传照片/视频</button>
            <button type="button" @click="deleteItems" class="layui-btn layui-btn-normal">批量删除</button>

        </div>

        <div class="albums">
            <div class="albums-1">
                <ul style="float: left">
                   <!-- <form id="listForm"  method="post">-->

                        <div class="lists" style="overflow: auto">

                            <p>{{vals}}</p>
                            <!--关键的HTML代码部分开始了-->
                            <div class="list" v-for="item of drawerTableList" :key="item" style="position:relative;margin-bottom: 10px">
                                <!--这个是可以勾选照片,以便后面删除功能的实现-->
                                <td><input class="lists-value" type="checkbox" v-model="vals" :value="item.id"></td>

                                <div class="list-right">
                                    <span style="float: right">菜单</span>
                                    <br>
                                    <div class="list-right-div">
                                        <button  type="button" value="ww" @click="setCover(item.path)">设为封面</button>
                                        <br>
                                        <button  type="button" value="12" @click="delImage(item.id)">删除图片</button>
                                    </div>

                                </div>
                                <!--关键代码,elementui中的组件-->
                                <el-image
                                        class = "user-headImage"
                                        :src="item.path"
                                        :preview-src-list="item.list"
                                >
                                </el-image>
                            </div>

                        </div>
                        <!--关键的HTML代码部分结束了-->
                   <!-- </form>-->
                </ul>
            </div>
        </div>
    </div>

    <div th:replace="~{own/commes :: footbar}"></div>

</div>


<div id="addImagesDiv" class="layui-upload" style="display: none;padding: 20px 20px">
    <button type="button" class="layui-btn layui-btn-normal" id="testList">选择多文件</button>
    <div class="layui-upload-list">
        <table class="layui-table">
            <thead>
            <tr>   <th>文件名</th>
                <th>文件缩略图</th>
                <th>大小</th>
                <th>状态</th>
                <th>操作</th>
            </tr></thead>
            <tbody id="demoList"></tbody>
        </table>
    </div>
    <button type="button" class="layui-btn" id="testListAction">开始上传</button>
</div>

<script src="../static/layui/layui.js"></script>
<script src="../static/js/jquery-3.3.1.js"></script>

<script>

    var a = 0;
    var lists = document.getElementsByClassName("lists-value");//删除list

    var Main = {
        data() {
            return {
                drawerTableList:[],//照片重新排序,还有id等信息的最终在页面输出的。
                vals:[],//这是单/多选删除的照片id集合
                initData:[]//获取后台传过来的初始化数据
            }
        },
        mounted:function(){  //这方法相当于 页面初始化
            this.initList();
        },
        methods:{
            initList(){//拿到后台数据初始化
                var that = this;
                that.drawerTableList = [];
                that.initData = [];
                axios.get("http://localhost:8770/album/queryAlbumVue")
                    .then(function (response) {
                        that.initData = response.data;
                        that.array();
                    },function (err) {
                        console.log("出错")
                    })
            },
            array(){//对预览图片中的list重新排序
                var that = this;
                this.list = [];
               // 表格数据  drawerTableList
               //获取每张图片的地址
               //获取每张图片的地址
                for(var i = 0 ; i < that.initData.length ; i ++){
                    this.list.push('/'+that.initData[i].i_path);
                }
               //根据图片顺序(index)更改每张图片绑定的list的图片顺序
               for(var i = 0 ; i < that.initData.length ; i ++){
                   //按当前照片index重新排序
                   var container = this.list;
                   var frontArr = container.slice(0,i);
                   var behindArr = container.slice(i,that.initData.length);
                   var list = behindArr.concat(frontArr);

                   //为数组添加属性和值
                   this.drawerTableList.push({id:that.initData[i].i_id,aid:that.initData[i].aid,
                       size:that.initData[i].i_size,uploadTime:that.initData[i].i_uploadTime,
                       path: this.list[i],list:list});
               }

               console.log("排序好的:");
               console.log(that.drawerTableList);

            },
            setCover(v) {//设置照片为相册封面
                var that = this;
                var coverPath = v;

                this.$confirm('此操作将设置照片为相册封面, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                }).then(() => {
                    axios.get("http://localhost:8770/album/setCoverVue?coverPath="+coverPath)
                        .then(function (response) {

                        },function (err) {
                            console.log("出错")
                        });

                    this.$message({
                        type: 'success',
                        message: '设置成功!'
                    });
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消设置'
                    });
                });
            },
            delImage:function (v) {//删除单个照片
                var that = this;
                that.vals.push(v);
                this.deleteComm(that);

            },
            deleteItems:function () {//点击删除按钮,判断a=0  浮现标签,a=1传入照片id集合进入后台进行多个照片删除
                var that = this;
                if (a==0){
                    for (var i=0;i<lists.length;i++){
                        lists[i].style.display='block';
                    }
                    a=1;
                }
                else{
                    this.deleteComm(that);
                    console.log("提交进入后台成功后");
                    for (var i=0;i<lists.length;i++){
                        lists[i].style.display='none';
                    }
                    a=0;
                }
            },
            deleteComm:function (that) {  //删除照片的公共方法
                this.$confirm('此操作将删除照片, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    console.log("eeee");
                    axios.get("http://localhost:8770/album/deleteItemVue?vals="+that.vals)
                        .then(function (response) {
                            that.vals = [];
                            //更新照片列表
                            that.initList();
                        },function (err) {
                            console.log("出错")
                        });
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                });

            }
        }
    }

    var Ctor = Vue.extend(Main);
    new Ctor().$mount('.layui-body');

</script>
<script>
    //一般直接写在一个js文件中
    layui.use(['layer', 'form'], function(){
        var layer = layui.layer
            ,form = layui.form;
    });
    layui.use('form', function(){
        var form = layui.form;

        //监听提交,使用ajax提交
        form.on('submit(formDemo)', function(data){
            layer.msg(JSON.stringify(data.field));
            alert(JSON.stringify(data.field));
            $.ajax({
                type:"POST",
                dataType:"json",
                url:"/user/updatePersonDate",
                data:JSON.stringify(data.field),
                contentType:"application/json",
                success:function (result) {
                    /* console.log(result);*/
                },
                error:function () {
                    alert("异常!")
                }

            });

            return false;
        });
    });
    //JavaScript代码区域
    layui.use('element', function(){
        var element = layui.element;

    });
    layui.use('laydate', function(){
        var laydate = layui.laydate;

        //执行一个laydate实例
        laydate.render({
            elem: '#test1' //指定元素
        });
    });



    //弹出层:添加图片
    layui.use('layer', function() { //独立版的layer无需执行这一句
        var $ = layui.jquery, layer = layui.layer; //独立版的layer无需执行这一句
        //弹出层:创建相册
        //触发事件
        var active = {
            addImages: function () {
                var that = this;
                //多窗口模式,层叠置顶
                layer.open({
                    type: 1 //此处以iframe举例
                    , title: ['添加照片', 'font-size:18px;text-align:center;']
                    , area: ['1400px', '700px'] //宽高
                    , shade: 0
                    , content: $('#addImagesDiv')
                    , btn: ["确认", "取消"] //只是为了演示
                    , yes: function (index, layero) {

                        $(that).click();
                    }
                });
            }
        };

        $('.addIma').on('click', function () {
            var othis = $(this), method = othis.data('method');
            active[method] ? active[method].call(this, othis) : '';
            // var i = $(this).val();
        });
    });
    //上传图片
    layui.use('upload', function(){
        var $ = layui.jquery
            ,upload = layui.upload;

        //多文件列表示例
        var demoListView = $('#demoList')
            ,uploadListIns = upload.render({
            elem: '#testList'
            ,url: '/album/addImages' //改成您自己的上传接口
            ,accept: 'file'
            ,multiple: true
            ,auto: false
            ,bindAction: '#testListAction'
            ,choose: function(obj){
                var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
                //读取本地文件
                obj.preview(function(index, file, result){
                    var tr = $(['<tr id="upload-'+ index +'">'
                        ,'<td>'+ file.name +'</td>'
                        ,'<td><img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img"></td>'  //图片缩略图
                        ,'<td>'+ (file.size/1024).toFixed(1) +'kb</td>'
                        ,'<td>等待上传</td>'
                        ,'<td>'
                        ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'
                        ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>'
                        ,'</td>'
                        ,'</tr>'].join(''));

                    //单个重传
                    tr.find('.demo-reload').on('click', function(){
                        obj.upload(index, file);
                    });

                    //删除
                    tr.find('.demo-delete').on('click', function(){
                        delete files[index]; //删除对应的文件
                        tr.remove();
                        uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
                    });

                    demoListView.append(tr);
                });
            }
            ,done: function(res, index, upload){
                if(res.success==1){ //上传成功
                    var tr = demoListView.find('tr#upload-'+ index)
                        ,tds = tr.children();
                    tds.eq(3).html('<span style="color: #5FB878;">上传成功</span>');
                    tds.eq(4).html(''); //清空操作
                    //tr.html('');
                    return delete this.files[index]; //删除文件队列已经上传成功的文件
                }
                this.error(index, upload);
            }
            ,error: function(index, upload){
                var tr = demoListView.find('tr#upload-'+ index)
                    ,tds = tr.children();
                tds.eq(3).html('<span style="color: #FF5722;">上传失败</span>');
                tds.eq(4).find('.demo-reload').removeClass('layui-hide'); //显示重传
            }
        });

    });



</script>
</body>
</html>

核心代码讲解

核心HTML

<div class="layui-layout layui-layout-admin">
    <div th:replace="~{own/commes :: topbar}"></div>
    <div th:replace="~{own/commes :: sidebar}"></div>
    <div class="layui-body" style="padding-left: 20px">
        <!-- 内容主体区域 -->
        <div style="margin-top: 20px;margin-bottom: 30px">
            <button type="button" data-method="addImages" class="layui-btn layui-btn-normal addIma">上传照片/视频</button>
            <button type="button" @click="deleteItems" class="layui-btn layui-btn-normal">批量删除</button>

        </div>

        <div class="albums">
            <div class="albums-1">
                <ul style="float: left">
                   <!-- <form id="listForm"  method="post">-->

                        <div class="lists" style="overflow: auto">

                            <p>{{vals}}</p>
                            <!--关键的HTML代码部分开始了-->
                            <div class="list" v-for="item of drawerTableList" :key="item" style="position:relative;margin-bottom: 10px">
                                <!--这个是可以勾选照片,以便后面删除功能的实现-->
                                <td><input class="lists-value" type="checkbox" v-model="vals" :value="item.id"></td>

                                <div class="list-right">
                                    <span style="float: right">菜单</span>
                                    <br>
                                    <div class="list-right-div">
                                        <button  type="button" value="ww" @click="setCover(item.path)">设为封面</button>
                                        <br>
                                        <button  type="button" value="12" @click="delImage(item.id)">删除图片</button>
                                    </div>

                                </div>
                                <!--关键代码,elementui中的组件-->
                                <el-image
                                        class = "user-headImage"
                                        :src="item.path"
                                        :preview-src-list="item.list"
                                >
                                </el-image>
                            </div>

                        </div>
                        <!--关键的HTML代码部分结束了-->
                   <!-- </form>-->
                </ul>
            </div>
        </div>
    </div>

    <div th:replace="~{own/commes :: footbar}"></div>

</div>

核心css

在上面完整代码中,是直接在 style 标签中写的

核心JS

只需要看initList()方法和array()方法中的

<script>

    var a = 0;
    var lists = document.getElementsByClassName("lists-value");//删除list

    var Main = {
        data() {
            return {
                drawerTableList:[],//照片重新排序,还有id等信息的最终在页面输出的。
                vals:[],//这是单/多选删除的照片id集合
                initData:[]//获取后台传过来的初始化数据
            }
        },
        mounted:function(){  //这方法相当于 页面初始化
            this.initList();
        },
        methods:{
            initList(){//拿到后台数据初始化
                var that = this;
                that.drawerTableList = [];
                that.initData = [];
                axios.get("http://localhost:8770/album/queryAlbumVue")
                    .then(function (response) {
                        that.initData = response.data;
                        that.array();
                    },function (err) {
                        console.log("出错")
                    })
            },
            array(){//对预览图片中的list重新排序
                var that = this;
                this.list = [];
               // 表格数据  drawerTableList
               //获取每张图片的地址
               //获取每张图片的地址
                for(var i = 0 ; i < that.initData.length ; i ++){
                    this.list.push('/'+that.initData[i].i_path);
                }
               //根据图片顺序(index)更改每张图片绑定的list的图片顺序
               for(var i = 0 ; i < that.initData.length ; i ++){
                   //按当前照片index重新排序
                   var container = this.list;
                   var frontArr = container.slice(0,i);
                   var behindArr = container.slice(i,that.initData.length);
                   var list = behindArr.concat(frontArr);

                   //为数组添加属性和值
                   this.drawerTableList.push({id:that.initData[i].i_id,aid:that.initData[i].aid,
                       size:that.initData[i].i_size,uploadTime:that.initData[i].i_uploadTime,
                       path: this.list[i],list:list});
               }

               console.log("排序好的:");
               console.log(that.drawerTableList);

            },
            setCover(v) {//设置照片为相册封面
                var that = this;
                var coverPath = v;

                this.$confirm('此操作将设置照片为相册封面, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                }).then(() => {
                    axios.get("http://localhost:8770/album/setCoverVue?coverPath="+coverPath)
                        .then(function (response) {

                        },function (err) {
                            console.log("出错")
                        });

                    this.$message({
                        type: 'success',
                        message: '设置成功!'
                    });
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消设置'
                    });
                });
            },
            delImage:function (v) {//删除单个照片
                var that = this;
                that.vals.push(v);
                this.deleteComm(that);

            },
            deleteItems:function () {//点击删除按钮,判断a=0  浮现标签,a=1传入照片id集合进入后台进行多个照片删除
                var that = this;
                if (a==0){
                    for (var i=0;i<lists.length;i++){
                        lists[i].style.display='block';
                    }
                    a=1;
                }
                else{
                    this.deleteComm(that);
                    console.log("提交进入后台成功后");
                    for (var i=0;i<lists.length;i++){
                        lists[i].style.display='none';
                    }
                    a=0;
                }
            },
            deleteComm:function (that) {  //删除照片的公共方法
                this.$confirm('此操作将删除照片, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    console.log("eeee");
                    axios.get("http://localhost:8770/album/deleteItemVue?vals="+that.vals)
                        .then(function (response) {
                            that.vals = [];
                            //更新照片列表
                            that.initList();
                        },function (err) {
                            console.log("出错")
                        });
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                });

            }
        }
    }

    var Ctor = Vue.extend(Main);
    new Ctor().$mount('.layui-body');

</script>
  
  //删除单/多个照片
    @GetMapping("/deleteItemVue")
    @ResponseBody
    public void deleteItem(String[] vals,HttpSession session){ //传入照片id  用户id
        System.out.println("vals:"+ Arrays.toString(vals));
        .....
    }

效果图

在这里插入图片描述

点击图片,效果成功。
点击三张图片中的任意一张,都会弹出点击的图片
在这里插入图片描述
初始化时后台返回的参数
在这里插入图片描述

参考:https://blog.csdn.net/weixin_30586085/article/details/102005650

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue使用ElementUI组件非常简单,只需要按照以下步骤即可: 1. 安装ElementUI:可以使用npm或yarn进行安装,命令如下: ``` npm install element-ui --save ``` 或者 ``` yarn add element-ui ``` 2. 在Vue项目引入ElementUI:在main.js引入ElementUI并注册组件,代码如下: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 在Vue组件使用ElementUI组件:在需要使用ElementUI组件Vue组件,直接使用即可,例如: ```html <template> <div> <el-button type="primary">主要按钮</el-button> </div> </template> ``` 以上就是在Vue使用ElementUI组件的基本步骤,希望能对你有所帮助。 ### 回答2: Vue.js 是一个流行的前端 JavaScript 框架之一,而 Element UI 是面向 Web 开发者的开源 UI 框架。当这两个框架交汇在一起时,就可以创建易于维护和可扩展Vue.js 应用程序。 使用 Element UI 组件库可以大大加速 Vue.js 应用程序的开发过程。如果您使用 Element UI,您将能够在几分钟内构建出功能齐全的 UI 功能。它包含许多常用的组件,如表格,菜单,选项卡,表单和按钮。 使用 Element UI 组件库的第一步是在您的 Vue.js 应用程序安装它。要使用 Element UI,您首先需要将它安装到您的项目。您可以通过 npm(Node.js 包管理器)或 Yarn(快速可靠的依赖管理器)来完成此操作。 使用 npm 安装 ElementUI,需要在命令提示符下输入以下命令: ``` npm install element-ui -S ``` 如果您使用的是 Yarn,您可以使用以下命令: ``` yarn add element-ui ``` 一旦您安装了 ElementUI,您就可以在您的 Vue.js 应用程序使用各种 ElementUI 组件了。您需要做的第一件事是将 ElementUI CSS 添加到您的页面。您可以将以下代码添加到您的 index.html 文件: ``` <link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css"> ``` 接下来,在您的 Vue.js 组件引入 ElementUI 组件,例如: ``` <template> <el-button type="primary">Click me!</el-button> </template> <script> import { Button } from 'element-ui' export default { name: 'MyComponent', components: { 'el-button': Button } } </script> ``` 这就是使用 Element UI 组件的基础知识。您可以添加其他组件来构建您的 Vue.js 应用程序,例如对话框,弹出式菜单,警告框等等。这些组件使您的应用程序看起来更专业,使用户体验更加友好。 ### 回答3: Vue.js是一款流行的前端框架,其主要特点是数据的响应式更新和简化了DOM操作。而Element UI是一个开源的基于Vue.js的UI组件库,它提供了一系列的常用组件,能够方便地构建出美观且高效的Web应用程序界面。这里我们来介绍一下如何在Vue.js使用Element UI组件。 第一步:安装Element UI 我们可以通过npm或yarn来安装Element UI。 npm安装: npm i element-ui -S yarn安装: yarn add element-ui 第二步:引入Element UI 在我们的Vue项目使用Element UI,需要先在Vue入口文件main.js引入它,并且使用Vue.use()注册它: import Vue from 'vue' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); 这里我们还需要注意,在引入Element UI时,也要同时引入Element UI的CSS样式文件。 第三步:使用Element UI组件 在以上步骤完成之后,我们就可以在vue使用Element UI组件了。例如,我们可以在template使用组件el-button来创建一个按钮: <template> <div> <el-button type="primary">主要按钮</el-button> </div> </template> 这里我们需要注意的是,我们必须在script引入el-button组件: <script> import { Button } from 'element-ui'; export default { components: { 'el-button': Button } } </script> 总结 以上就是在Vue使用Element UI组件的步骤,只需要三个简单的步骤就可以方便地使用Element UI组件,大大加快了我们构建Vue项目的开发效率。Element UI提供了丰富的组件库,可以满足我们在开发过程的大部分需求,所以在项目使用它也是非常不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值