Vue + vuedraggable + echarts 拖拽做一个笔记

近期在做Echarts图表时,想到使用拖拽方式 来改变图表的排序,做一个简单的笔记记录

使用的Html 做的效果

 可以进行一个随意拖拽

 使用Flex布局来改变排序方式

 html, body, #app {
            height: 99%;
            width: 99%;
        } 
        .el-row {
            height: 100%;
            width: 100%;
        }

            .el-row > .el-col{
                height: 100%;
            } 
            .charts_div {
                height: 95%;
                width: 100%;
            }

        .charts_div1 {
            height: 5%;
            width: 100%;
        }

            .charts_div1:hover {
                cursor: move;
            }

        .el-col:hover {
            background-color: #fdfdfd;
        }

        .charts_div:hover {
            background-color: #fdfdfd;
        }
        .draggable_div {
            display: flex;
            flex-flow: row wrap;
        }
        .el-col {
            height: 49%;
        }
        .draggable_div, .transition_span {
            width: 100%;
            height: 100%;
        }
        /*定义拖拽样式*/
        .ghostClass {
            background-color: blue !important;
        }

        .chosenClass {
            background-color: red !important;
            opacity: 1 !important;
        }

        .dragClass {
            background-color: blueviolet !important;
            opacity: 1 !important;
            box-shadow: none !important;
            outline: none !important;
            background-image: none !important;
        } 

            .item:hover {
                background-color: #fdfdfd;
                cursor: move;
                
            }

            .item + .item {
                border-top: none; 
            }
             

Html代码

<div id="app">
        <template> 
            <el-row :gutter="24">
                <draggable v-model="elcols" class="draggable_div" group="site" animation="300" dragClass="dragClass" ghostClass="ghostClass" chosenClass="chosenClass" v-on:start="onStart" v-on:end="onEnd">
                    <el-col :span="12" class="item" v-for="item in elcols" :key="item.id">
                        <div class="charts_div1"></div>
                        <div :id="item.id" class="charts_div"></div>
                    </el-col>
                </draggable>
            </el-row>            
        </template>
    </div>

js片段 

Vue.component('vuedraggable', window.vuedraggable.name)
    new Vue({
        el: "#app",
        components: {
            vuedraggable,
        },
        data() {//数据源
            return {
                drag: false, 
                _echarts: null,
                elcols: [{ id: "chart1" }, { id: "chart2" }, { id: "chart3" }, { id: "chart4" }, { id: "chart5" }], 
            }
        },
        created() {//页面加载前 1
            this._echarts = echarts;//初始化报表
        },
        mounted() {//页面加载后 3
            this.QueryEcharts();//加载报表
        },
        computed: {//监听事件 2 

        },
        watch: {//全局监听属性改变时触发 4 

        },
        methods: {//事件集合
            QueryEcharts() {//加载报表
                this.Echart1();
                this.Echart2();
                this.Echart3();
                this.Echart4();
                this.Echart5();
            },
            Echart1() {//加载第一个报表 
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon1', 'Tue1', 'Wed1', 'Thu1', 'Fri1', 'Sat1', 'Sun1']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart1')).setOption(option);
            },
            Echart2() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon2', 'Tue2', 'Wed2', 'Thu2', 'Fri2', 'Sat2', 'Sun2']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart2')).setOption(option);
            },
            Echart3() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon3', 'Tue3', 'Wed3', 'Thu3', 'Fri3', 'Sat3', 'Sun3']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart3')).setOption(option);
            },
            Echart4() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon4', 'Tue4', 'Wed4', 'Thu4', 'Fri4', 'Sat4', 'Sun4']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart4')).setOption(option);
            },
            Echart5() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon5', 'Tue5', 'Wed5', 'Thu5', 'Fri5', 'Sat5', 'Sun5']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart5')).setOption(option);
            },
            onStart(e) {
                this.drag = true; 
            },
            onEnd(e) {
                this.drag = false; 
            },
        }
    })

需要使用的js和css

element UI可以到官网

lar Vue UI frameworkElement - The world's most popular Vue UI frameworklar Vue UI framework

<link href="~/css/element.css" rel="stylesheet" />

<script src="~/js/element.js"></script>

Ecaherts 官网下载

Apache ECharts

<script src="~/js/echarts.js"></script>

Vue使用的是v2.6.14

<script src="~/js/vue.js"></script>

拖拽使用的是 vue.draggable 插件

vue.draggable两列或多列之间相互拖动 - itxst.com
<script src="~/js/Sortable.min.js"></script>
<script src="~/js/vuedraggable.umd.min.js"></script> 

下面在贴一个整体的代码


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <!-- 引入样式 -->
    <link href="~/css/element.css" rel="stylesheet" />
    <title>报表统计</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
    <style>
        html, body, #app {
            height: 99%;
            width: 99%;
        } 
        .el-row {
            height: 100%;
            width: 100%;
        }

            .el-row > .el-col{
                height: 100%;
            } 
            .charts_div {
                height: 95%;
                width: 100%;
            }

        .charts_div1 {
            height: 5%;
            width: 100%;
        }

            .charts_div1:hover {
                cursor: move;
            }

        .el-col:hover {
            background-color: #fdfdfd;
        }

        /*.el-row .el-col:first-child {
            border-right: 1px solid #ffffff;
        }

        .el-row:first-child > .el-col {
            border-bottom: 1px solid #ffffff;
        }*/

        .charts_div:hover {
            background-color: #fdfdfd;
        }
        .draggable_div {
            display: flex;
            flex-flow: row wrap;
        }
        .el-col {
            height: 49%;
        }
        .draggable_div, .transition_span {
            width: 100%;
            height: 100%;
        }
        /*定义拖拽样式*/
        .ghostClass {
            background-color: blue !important;
        }

        .chosenClass {
            background-color: red !important;
            opacity: 1 !important;
        }

        .dragClass {
            background-color: blueviolet !important;
            opacity: 1 !important;
            box-shadow: none !important;
            outline: none !important;
            background-image: none !important;
        } 

            .item:hover {
                background-color: #fdfdfd;
                cursor: move;
                
            }

            .item + .item {
                border-top: none; 
            }
             
    </style>
</head>
<body>
    <div id="app">
        <template> 
            <el-row :gutter="24">
                <draggable v-model="elcols" class="draggable_div" group="site" animation="300" dragClass="dragClass" ghostClass="ghostClass" chosenClass="chosenClass" v-on:start="onStart" v-on:end="onEnd">
                    <el-col :span="12" class="item" v-for="item in elcols" :key="item.id">
                        <div class="charts_div1"></div>
                        <div :id="item.id" class="charts_div"></div>
                    </el-col>
                </draggable>
            </el-row>            
        </template>
    </div>
</body>
</html>
<script src="~/js/echarts.js"></script>
<!-- 引入组件库 -->
<script src="~/js/vue.js"></script>
<script src="~/js/Sortable.min.js"></script>
<script src="~/js/vuedraggable.umd.min.js"></script>
<script src="~/js/element.js"></script>
<script src="~/Content/jquery/jquery.min.js"></script>
<script>
    Vue.component('vuedraggable', window.vuedraggable.name)
    new Vue({
        el: "#app",
        components: {
            vuedraggable,
        },
        data() {//数据源
            return {
                drag: false, 
                _echarts: null,
                elcols: [{ id: "chart1" }, { id: "chart2" }, { id: "chart3" }, { id: "chart4" }, { id: "chart5" }], 
            }
        },
        created() {//页面加载前 1
            this._echarts = echarts;//初始化报表
        },
        mounted() {//页面加载后 3
            this.QueryEcharts();//加载报表
        },
        computed: {//监听事件 2 

        },
        watch: {//全局监听属性改变时触发 4 

        },
        methods: {//事件集合
            QueryEcharts() {//加载报表
                this.Echart1();
                this.Echart2();
                this.Echart3();
                this.Echart4();
                this.Echart5();
            },
            Echart1() {//加载第一个报表 
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon1', 'Tue1', 'Wed1', 'Thu1', 'Fri1', 'Sat1', 'Sun1']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart1')).setOption(option);
            },
            Echart2() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon2', 'Tue2', 'Wed2', 'Thu2', 'Fri2', 'Sat2', 'Sun2']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart2')).setOption(option);
            },
            Echart3() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon3', 'Tue3', 'Wed3', 'Thu3', 'Fri3', 'Sat3', 'Sun3']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart3')).setOption(option);
            },
            Echart4() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon4', 'Tue4', 'Wed4', 'Thu4', 'Fri4', 'Sat4', 'Sun4']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart4')).setOption(option);
            },
            Echart5() {
                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon5', 'Tue5', 'Wed5', 'Thu5', 'Fri5', 'Sat5', 'Sun5']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            data: [120, 200, 150, 80, 70, 110, 130],
                            type: 'bar'
                        }
                    ]
                };
                this._echarts.init(document.getElementById('chart5')).setOption(option);
            },
            onStart(e) {
                this.drag = true; 
            },
            onEnd(e) {
                this.drag = false; 
            },
        }
    })
</script>

只为了做一个简单的笔记  防止以后忘记 写的不好之处勿喷

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue3和Vue2一样都可以使用vuedraggable插件进行不同组件的拖拽。以下是使用vuedraggable插件实现不同组件拖拽的步骤: 1. 安装vuedraggable插件 在终端中执行以下命令: ``` npm install vuedraggable ``` 2. 引入vuedraggable插件 在需要使用vuedraggable插件的组件中引入: ```javascript import draggable from 'vuedraggable' ``` 3. 使用draggable组件 在模板中使用draggable组件,并设置相应的属性: ```html <draggable v-model="list" :element="'ul'" :options="{group:'items'}"> <li v-for="(item, index) in list" :key="item.id">{{ item.name }}</li> </draggable> ``` 其中,v-model绑定了一个数组list,用于记录拖拽后的顺序;:element指定了拖拽的元素类型,这里为ul;:options指定了拖拽的选项,这里设置了group为items,表示不同的组件可以互相拖拽。 注意:v-model绑定的数组中的元素必须要有一个唯一的标识符,用于区分不同的元素。 4. 处理拖拽事件 当拖拽完成后,可以通过监听dragend事件来处理拖拽后的逻辑: ```html <draggable v-model="list" :element="'ul'" :options="{group:'items'}" @dragend="onDragEnd"> <li v-for="(item, index) in list" :key="item.id">{{ item.name }}</li> </draggable> ``` ```javascript methods: { onDragEnd(event) { console.log(event) // 处理拖拽完成后的逻辑 } } ``` 在onDragEnd方法中,可以获取到拖拽完成后的事件对象,通过事件对象可以获取到拖拽前后的元素顺序,从而进行相应的操作。 以上就是使用vuedraggable插件实现不同组件拖拽的步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值