拖拽示例echarts图表至目标区域渲染,动态配置其参数配置

本文介绍了如何在Vue项目中使用vuedraggable库实现图表的拖拽功能,包括组件引入、效果展示、下载以及在不同页面的使用示例,还展示了如何配合ECharts进行图表配置的修改和删除。
摘要由CSDN通过智能技术生成

1 其他示例

2 本文完整代码

2.1 效果图

在这里插入图片描述
在这里插入图片描述

2.2 下载

文档传送门

npm i vuedraggable

2.3 在需要的页面引入(也可全局引入看自己需求)

  • 按需引入
import draggable from 'vuedraggable'
  export default {
    components: {
      draggable 
   }
}
  • 全局引入
// main.js
import draggable from 'vuedraggable'
Vue.component('draggable', draggable)

2.4 完整代码

<template>
  <div class="center">
    <!-- 可拖拽区域 -->
    <div class="flex-center">
      <div class="flex-column">
        <draggable class="flex-center-L" v-model="echartsList" @end="ends" :options="{ group: { name: 'itxst', pull: 'clone', put: false }, sort: true,}"
          animation="300">
          <div class="echarts-center" v-for="item in echartsList" :key="item.echartsType">
            <div class="echarts-demo"></div>
          </div>
        </draggable>
      </div>
      <!-- 拖拽值接收区域 -->
      <draggable class="flex-center-R" v-model="echartsDraggable" :options="{ group: { name: 'itxst', pull: 'clone' }, sort: true, }" animation="300">
        <div class="echarts-center" :class="{'echarts-center-color': indexEcharts=== index}" @click="indexEcharts = index"
          v-for="(item,index) in echartsDraggable" :key="index">
          <div class="echarts-demo-clone"></div>
          <!-- 操作按钮 -->
          <div class="echarts-button" v-if="indexEcharts=== index">
            <el-button type="primary" icon="el-icon-edit" circle @click="edit(index)"></el-button>
            <el-button type="danger" icon="el-icon-delete" circle @click="deleteData(index)"></el-button>
          </div>
        </div>
      </draggable>
    </div>
    <!-- 修改图表配置弹窗 -->
    <el-dialog title="配置修改" :visible.sync="dialogVisible" width="50%" :close-on-click-modal="false">
      <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
        <div class="form-item-center" v-for="(domain, index) in ruleForm.echartsList" :key="index">
          <el-form-item label='名字' :prop="'echartsList.' + index + '.name'" :rules="{required: true, message: '名字不能为空', trigger: 'blur'}">
            <el-input v-model="domain.name"></el-input>
          </el-form-item>
          <el-form-item label='参数' :prop="'echartsList.' + index + '.value'" :rules="{ required: true, message: '参数不能为空', trigger: 'blur'}">
            <el-input v-model="domain.value"></el-input>
          </el-form-item>
        </div>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addData">添加数据</el-button>
        <el-button type="primary" @click="submitForm">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import Vuedraggable from 'vuedraggable'
import * as echarts from "echarts";
export default {

  name: 'draggable-echarts',

  props: {},

  components: {
    Vuedraggable
  },

  data () {
    return {
      dialogVisible: false,
      myChart: null,
      myChartClone: null,
      indexEcharts: null, // 鼠标是否经过当前图表
      echartsDraggable: [], // 拖拽后数据会动态填入
      echartsList: [
        { echartsType: "line", },
        { echartsType: "bar", },
        { echartsType: "pie", }
      ],
      ruleForm: {
        echartsList: [
          { name: "", value: "" },
          { name: "", value: "" }
        ]
      },
      rules: {},
    }
  },

  computed: {},

  watch: {},

  created () { },

  mounted () {
    this.init()
    window.onresize = function () {
      if (this.myChart) this.myChart.resize();
      if (this.myChartClone) this.myChartClone.resize();
    };
  },

  methods: {
    // 左侧待拖拽图表
    init () {
      const dom = document.querySelectorAll(".echarts-demo");
      Array.from(dom).map((x, index) => {
        let xAxisConfig = {}
        if (this.echartsList[index].echartsType !== 'pie') {
          xAxisConfig = {
            type: "category",
          }
        } else {
          xAxisConfig = {
            show: false,
            type: "category",
          }
        }
        let yAxisConfig = {}
        if (this.echartsList[index].echartsType !== 'pie') {
          yAxisConfig = {
            type: "value",
          }
        } else {
          yAxisConfig = {
            show: false,
            type: "category",
          }
        }
        let seriesConfig = []
        if (this.echartsList[index].echartsType !== 'pie') {
          seriesConfig = [
            {
              name: 'index',
              type: this.echartsList[index].echartsType,
              data: [
                { value: 1048, name: 'Search Engine' },
                { value: 735, name: 'Direct' },
                { value: 580, name: 'Email' },
                { value: 484, name: 'Union Ads' },
                { value: 300, name: 'Video Ads' }],
            },
          ]
        } else {
          seriesConfig = [
            {
              name: 'index',
              radius: '50%',
              type: this.echartsList[index].echartsType,
              data: [
                { value: 1048, name: 'Search Engine' },
                { value: 735, name: 'Direct' },
                { value: 580, name: 'Email' },
                { value: 484, name: 'Union Ads' },
                { value: 300, name: 'Video Ads' }],
            },
          ]
        }
        // 渲染 echarts 图表
        this.myChart = echarts.init(x);
        this.myChart.setOption({
          tooltip: {
            trigger: "item",
          },
          xAxis: xAxisConfig,
          yAxis: yAxisConfig,
          series: seriesConfig
        });
      });
    },
    // 拖拽结束
    ends (e) {
      // 解决拷贝拖拽,对象类型指向问题
      this.echartsDraggable = this.echartsDraggable.map(x => {
        return JSON.parse(JSON.stringify(x))
      })
      // oldIndex 克隆来源索引位,newIndex 克隆目标索引位置
      this.$nextTick(() => {
        this.draggableEcharts(e.oldIndex, e.newIndex)
      })
    },
    // 拖拽结束渲染右侧图表
    draggableEcharts (oldIndex, newIndex) {
      const dom = document.querySelectorAll(".echarts-demo-clone");
      Array.from(dom).map((x, index) => {
        let xAxisConfig = {}
        if (this.echartsDraggable[index].echartsType !== 'pie') {
          xAxisConfig = {
            type: "category",
          }
        } else {
          xAxisConfig = {
            show: false,
            type: "category",
          }
        }
        let yAxisConfig = {}
        if (this.echartsDraggable[index].echartsType !== 'pie') {
          yAxisConfig = {
            type: "value",
          }
        } else {
          yAxisConfig = {
            show: false,
            type: "category",
          }
        }
        let seriesConfig = []
        if (this.echartsDraggable[index].echartsType !== 'pie') {
          seriesConfig = [
            {
              name: 'index',
              // 没有配置类型时,默认类型为 line
              type: this.echartsDraggable[index].echartsType || 'line',
              // 没有参数时,添加默认参数
              data: this.echartsDraggable[index].echartsData || [
                { value: 1048, name: 'Search Engine' },
                { value: 735, name: 'Direct' },
                { value: 580, name: 'Email' },
                { value: 484, name: 'Union Ads' },
                { value: 300, name: 'Video Ads' }],
            },
          ]
        } else {
          seriesConfig = [
            {
              name: 'index',
              radius: '50%',
              // 没有配置类型时,默认类型为 line
              type: this.echartsDraggable[index].echartsType,
              // 没有参数时,添加默认参数
              data: this.echartsDraggable[index].echartsData || [
                { value: 1048, name: 'Search Engine' },
                { value: 735, name: 'Direct' },
                { value: 580, name: 'Email' },
                { value: 484, name: 'Union Ads' },
                { value: 300, name: 'Video Ads' }],
            },
          ]
        }
        console.log(xAxisConfig, yAxisConfig, seriesConfig);
        // 渲染 echarts 图表
        this.myChartClone = echarts.init(x);
        this.myChartClone.setOption({
          tooltip: {
            trigger: "item",
          },
          xAxis: xAxisConfig,
          yAxis: yAxisConfig,
          series: seriesConfig
        });
      });
    },
    // 编辑图表配置
    edit () {
      this.dialogVisible = true
      this.$nextTick(() => {
        this.$refs.ruleForm.resetFields();
      })
    },
    // 弹窗添加数据
    addData () {
      this.ruleForm.echartsList.push({ name: "", value: "" })
    },
    // 弹窗填写配置确定
    submitForm () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          this.dialogVisible = false
          // 根据当前选中的图表,将表单填值再配置上
          console.log(this.indexEcharts);
          this.echartsDraggable[this.indexEcharts].echartsData = JSON.parse(JSON.stringify(this.ruleForm.echartsList))
          // 重新渲染图表
          this.draggableEcharts()
        } else {
          return false;
        }
      })
    },
    // 删除图表
    deleteData (index) {
      this.echartsDraggable.splice(index, 1)
    },
  },
}
</script> 

<style scoped lang="less">
.center {
  width: 100%;
  height: 100%;
  .flex-center {
    display: flex;
    width: 100%;
    height: 100%;
    .flex-column {
      width: 20%;
      height: 100%;
      display: flex;
      flex-direction: column;
      .flex-center-L {
        width: 100%;
        height: 100%;
      }
      .echarts-center {
        width: 100%;
        height: 30%;
        border: 1px solid #126fcc;
        .echarts-demo {
          width: 100%;
          height: 100%;
        }
      }
    }
    .flex-center-R {
      width: 100%;
      height: 100%;
      border: 1px solid pink;
      display: flex;
      flex-wrap: wrap;
      padding: 12px;
      margin-left: 12px;
      .echarts-center {
        width: 30%;
        height: 30%;
        border: 1px solid #126fcc;
        position: relative;
        margin-right: 12px;
        .echarts-demo-clone {
          width: 100%;
          height: 100%;
        }
        .echarts-button {
          position: absolute;
          left: 0;
          top: 0;
        }
      }
      .echarts-center-color {
        border: 1px solid red;
      }
    }
  }
  .form-item-center {
    display: flex;
    ::v-deep .el-form-item {
      width: 50%;
    }
  }
  ::v-deep .el-dialog__footer {
    text-align: center;
  }
}
</style>
  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 ECharts 中,可以通过使用 `dataZoom` 组件来实现鼠标左键滑动拿到区域的功能。 `dataZoom` 是一个用于区域缩放和漫游的组件,可以让用户通过拖拽或滚轮来缩放或漫游图表。具体实现步骤如下: 1. 在 ECharts 中引入 `dataZoom` 组件: ```javascript option = { ... dataZoom: { type: 'slider', // 缩放类型为滑动条 show: true, // 显示滑动条 start: 0, // 缩放开始位置 end: 100 // 缩放结束位置 }, ... }; ``` 2. 监听 `dataZoom` 组件的 `datazoom` 事件,获取到用户缩放的区域: ```javascript myChart.on('datazoom', function(params) { var start = params.start; // 获取缩放开始位置 var end = params.end; // 获取缩放结束位置 console.log(start, end); }); ``` 当用户拖动滑动条进行缩放时,`datazoom` 事件会被触发,通过获取 `params.start` 和 `params.end` 值,即可获取到用户缩放的区域。 需要注意的是,以上代码只是一个简单的示例,实际使用中还需要根据具体需求进行适当的修改。 ### 回答2: ECharts是一款基于JavaScript的数据可视化库,可以用于创建交互式的图表和地图。要实现鼠标左键滑动来获取区域,可以通过ECharts提供的事件监听和交互功能来完成。 首先,在创建ECharts图表时,需要设置相应的配置项以启用鼠标交互功能。可以使用以下代码创建一个基本的图表实例: ```javascript var myChart = echarts.init(document.getElementById('chart')); var option = { // 其他图表配置项... // 启用鼠标交互功能 toolbox: { feature: { dataZoom: { type: 'inside' }, brush: { type: 'x', title: { rect: '选择区域', keep: '保持选择区域' } } } }, // 其他图表数据... }; myChart.setOption(option); ``` 上述代码中的`option`对象中的`toolbox`配置项设置了两种交互工具:`dataZoom`用于缩放和平移,`brush`用于选择区域。`brush`工具中的`type: 'x'`表示只在水平方向上选择区域。 接下来,可以监听`brushSelected`事件来获取鼠标左键滑动选择的区域。可以使用以下代码添加事件监听: ```javascript myChart.on('brushSelected', function (params) { var selectedData = []; // 遍历图表中被选择的区域 echarts.util.each(params.batch[0].selected, function (dataIndex) { var values = myChart.getModel().getSeriesByIndex(0).getData().getValues(dataIndex); // 将选中的数据保存到一个数组中 selectedData.push({ x: values[0], y: values[1] }); }); // 打印选中的数据 console.log(selectedData); }); ``` 上述代码中,`brushSelected`事件中的`params`参数包含了被选择的区域的信息。通过遍历`params.batch[0].selected`数组,可以获取选中的数据在数据集中的索引。然后,可以通过调用`myChart.getModel().getSeriesByIndex(0).getData().getValues(dataIndex)`方法,获取选中数据的具体数值。 最后,可以将选中的数据保存到一个数组中,或者执行其他相关操作。以上就是使用ECharts实现鼠标左键滑动获取区域的基本方法。 ### 回答3: echarts是一款强大的数据可视化库,可以用于创建各种图表。要实现鼠标左键滑动拿到区域,可以结合echarts的事件和工具箱功能来实现。 首先,在初始化echarts图表时,需要开启工具箱(toolbox)的启用Brush选框缩放功能。可以通过配置项中的toolbox属性来实现,将该属性设置为true即可。 其次,通过监听echarts的brushSelected事件,可以获取到用户选择的区域信息。这个事件会在用户拖动或缩放brush选框时触发,可以获取到选中区域的具体范围。 具体实现步骤如下: 1. 引入echarts库和相关依赖文件。 2. 创建一个DOM元素,作为echarts图表的容器。 3. 初始化echarts图表配置相应的图表类型和数据。 4. 在echarts初始化完成后,通过option的toolbox属性开启Brush选框缩放功能,并设置选择范围为矩形。 5. 监听brushSelected事件,该事件会在用户拖动或缩放brush选框时触发。事件回调函数中可以获取到选中区域的具体范围。 6. 在brushSelected事件回调函数中,根据选中区域的范围,可以进行相应的操作。比如可以通过获取选中区域的起始点和终点坐标,来获取选中区域的数据。 示例代码如下: ```javascript // 引入echarts库和相关依赖文件 import * as echarts from 'echarts'; import 'echarts/extension/bmap/bmap'; // 创建一个DOM元素,作为echarts图表的容器 const chartContainer = document.getElementById('chart'); // 初始化echarts图表配置相应的图表类型和数据 const myChart = echarts.init(chartContainer); const option = { // 设置图表类型和数据 ... // 开启Brush选框缩放功能,并设置选择范围为矩形 toolbox: { feature: { brush: { type: ['rect'] } } }, }; // 监听brushSelected事件,获取选中区域的范围 myChart.on('brushSelected', function(params) { // 获取选中区域的范围 const selectedArea = params.batch[0].areas[0]; // 根据选中区域的范围进行相应的操作 // 获取选中区域的起始点和终点坐标 const startPoint = selectedArea.coordRange[0]; const endPoint = selectedArea.coordRange[1]; // 根据起始点和终点坐标,获取选中区域的数据 const selectedData = getDataInRange(startPoint, endPoint); // 对选中区域的数据进行处理或展示 ... }); // 渲染echarts图表 myChart.setOption(option); ``` 通过上述步骤,可以实现在echarts图表上使用鼠标左键滑动来获取选中区域的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值