echart 拖拽数据进echarts中显示

拖拽数据进echarts中显示

需求:

  • 拖拽外部数据进echart图表中展示。
  • 双击外部数据新增echart图表
  • 点击关闭 关闭对应图表

效果展示

拖拽数据进图表
在这里插入图片描述
删除对应图表

代码

html

<div id="app">
    <!-- 测试 -->
    <div class="drag-box">
      <ul>
        <li
          v-for="(item, index) in dragItemList"
          :key="index"
          class="drag-item"
          draggable="true"
          @dblclick="dblItem(item)"
          @dragstart="dragstart($event,item)"
        >{{ item.name }}</li>
      </ul>
    </div>
    <div
      class="echart-box">
      <div
        v-for="(item, index) in echartContainer"
        :data-num="index"
        :key="index"
        class="echart-item"
        @drop="dropTarget($event)"
        @dragover="dragover($event)">
        <span> {{ item.name }}</span>------------
        <span
          style="cursor: pointer"
          @click="deleteItem(item)"> {{ item.echartIndex + '关闭' }}</span>
        <nercar-echarts
          :background-color="item.option.backgroundColor"
          :x-axis="item.option.xAxis"
          :y-axis="item.option.yAxis"
          :series="item.option.series"
          :grid="item.option.grid"
          :legend="item.option.legend"
        />
      </div>
    </div>
  </div>

css

<style lang="less" scoped>
.drag-box {
  margin: 100px auto;
  width: 800px;
  > ul {
    display: flex;
    > li {
      border: 1px solid pink;
      margin-left: 100px;
    }
  }
}
.echart-box {
  width: 900px;
  //height: 600px;
  margin: 0 auto;
  border: 1px solid red;
}
.echart-item {
  height: 260px;
  text-align: center;
  margin-bottom: 30px;
}
</style>

js

import nercarEcharts from '@/components/NercarEcharts'
export default {
  name: 'App',
  components: {
    nercarEcharts
  },
  data() {
    return {
      dragItemList: [
        {
          name: '速度',
          data: [30, 28, 56, 34, 62, 50, 48, 26, 35, 54, 56, 42, 31, 30]
        },
        {
          name: '温度',
          data: [20, 38, 46, 54, 12, 30, 44, 66, 34, 52, 26, 46, 38, 39]
        }
      ],
      echartContainer: [
        {
          echartIndex: 0,
          name: '图一',
          option: {
            xAxis: {
              name: '辊缝mm',
              type: 'category',
              data: [
                '-5',
                '-4',
                '-3',
                '-2',
                '-1',
                '0',
                '1',
                '2',
                '3',
                '4',
                '5'
              ],
              splitLine: {
                show: false
              }
            },
            yAxis: [
              {
                name: '轧制力ton',
                type: 'value',
                interval: 10
              }
            ],
            series: [
              {
                name: 'DS侧刚度',
                data: [50, 48, 36, 14, 12, 10, 48, 16, 55, 64, 36, 32, 21, 10],
                type: 'line'
              },
              {
                name: 'OS侧刚度',
                data: [45, 38, 26, 14, 12, 10, 48, 16, 55, 64, 36, 32, 21, 8],
                type: 'line'
              }
            ],
            grid: {
              left: '3%',
              right: '4%',
              bottom: '1%',
              top: '20%',
              containLabel: true
            },
            legend: {}
          }
        }
      ],
      pushData: null,
      echartIndex: 0
    }
  },
  mounted() {},
  methods: {
    dragstart(e, item) {
      this.pushData = item
      console.log('dragstart')
    },
    dropTarget(e) {
      e.preventDefault()
      let targetNum = e.target.parentElement.parentElement.parentElement.getAttribute(
        'data-num'
      )
      //拖动到了哪一个echart图表
      let series = this.echartContainer[targetNum].option.series
      let names = []
      // 重复拖动项目 return
      names = series.filter((item, index, arr) => {
        return item.name.includes(this.pushData.name)
      })
      if (names.length != 0) {
        console.log('已存在')
        return
      }
      series.push({
        name: this.pushData.name,
        data: this.pushData.data,
        type: 'line'
      })
      console.log('dropTarget', e)
    },
    dragover(e) {
      e.preventDefault()
      console.log('dragover')
    },
    dblItem(item) {
      //判断是否已经
      //通过item 配置tempLate对应参数
      this.echartIndex++
      let echartTemplate = {
        echartIndex: this.echartIndex,
        name: item.name,
        option: {
          xAxis: {
            name: '辊缝mm',
            type: 'category',
            data: ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5'],
            splitLine: {
              show: false
            }
          },
          yAxis: [
            {
              name: '轧制力ton',
              type: 'value',
              interval: 10
            }
          ],
          series: [
            {
              name: 'DS侧刚度',
              data: item.data,
              type: 'line'
            }
          ],
          grid: {
            left: '3%',
            right: '4%',
            bottom: '1%',
            top: '20%',
            containLabel: true
          },
          legend: {}
        }
      }
      this.echartContainer.push(echartTemplate)
      console.log(this.echartContainer)
    },
    deleteItem(item) {
      this.echartContainer.forEach((eItem, index) => {
        if (eItem.echartIndex == item.echartIndex) {
          this.$confirm('确认关闭?')
            .then(_ => {
              console.log(_)
              this.echartContainer.splice(index, 1)
            })
            .catch(_ => {})
        }
      })
      console.log(this.echartContainer)
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值