vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)


Posted in Javascript onApril 12, 2019

本篇文档主要是利用echarts实现可拖动节点的折线图,在echarts中找到了一个demo,传送门:https://echarts.baidu.com/examples/editor.html?c=line-draggable,但是不是用vue写的,并且在改写为vue组件的过程中遇到了很多问题,在百度过程中发现并没有相关的文档,所以决定自己开发,并在demo的基础上开发了一些实用的功能,所以把这个过程记录下来。文档中还有很多不够完善的地方,欢迎讨论哈!

需求:制作一个折线图用于显示当前24小时的数据,并且可以通过拖动折现图设置数据

效果图如下:初步看和一般的折线图没什么区别,但是实际如图示,节点是可以上下拖动的

vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)

代码如下:

<template>
 <div ref="dom" class="charts chart-bar"></div>
</template>
<script>
import echarts from 'echarts'
import tdTheme from '_c/charts/theme.json' // 这是我自己写的主题文件,可以不用管
import { on, off } from '@/libs/tools' // 这是其他一些方法函数,可以不管
echarts.registerTheme('tdTheme', tdTheme)
export default {
 name: 'ChartLine',
 props: {
 text: String,
 subtext: String,
 yName: String
 },
 data () {
 return {
  dom: null,
  symbolSize: 5,

// 通过拖动是可以实时改变这里的值的
  data: [[0, 10], [1, 10], [2, 20], [3, 30], [4, 36], [5, 20], [6, 25], [7, 20], [8, 21], [9, 22],
  [10, 23], [11, 25], [12, 10], [13, 11], [14, 19], [15, 20], [16, 12], [17, 13], [18, 12], [19, 9],
  [20, 21], [21, 18], [22, 10], [23, 12]]
 }
 },
 methods: {
 resize () {
  this.dom.resize()
 }
 },
 mounted () {
 this.dom = echarts.init(this.$refs.dom, 'tdTheme')
 this.dom.setOption({
  title: {
  text: this.text,
  subtext: this.subtext,
  x: 'center'
  },
  grid: {
  left: 50,
  top: 40
  },
  tooltip: {
  trigger: 'axis'
  },
  xAxis: {
  min: 0,
  max: 23,
  type: 'value',
  axisLabel: {
   formatter (value) {
   return value + ':00' // 格式时间显示方式
   }
  },
  axisLine: { onZero: false }
  },
  yAxis: {
  min: 4,
  max: 36,
  type: 'value',
  name: this.yName,
  axisLine: { onZero: false }
  },
  series: [
  {
   id: 'a',
   type: 'line',
   smooth: true,
   symbolSize: this.symbolSize, // 为了方便拖拽,把 symbolSize 尺寸设大了。
   data: this.data
  }
  ]
 })
 this.dom.setOption({
  graphic: echarts.util.map(this.data, (dataItem, dataIndex) => {
  const that = this // 因为ondrag函数必须在回调内使用this.position获取实时坐标,此处必须用that替换this
  return {
   // 'circle' 表示这个 graphic element 的类型是圆点。
   type: 'circle',
   shape: {
   // 圆点的半径。
   r: this.symbolSize / 2
   },
   // 用 transform 的方式对圆点进行定位。position: [x, y] 表示将圆点平移到 [x, y] 位置。
   // 这里使用了 convertToPixel 这个 API 来得到每个圆点的位置
   position: this.dom.convertToPixel('grid', dataItem),
   // 这个属性让圆点不可见(但是不影响他响应鼠标事件)。
   invisible: true,
   // 这个属性让圆点可以被拖拽。
   draggable: true,
   // 把 z 值设得比较大,表示这个圆点在最上方,能覆盖住已有的折线图的圆点。
   z: 100,
   ondrag: echarts.util.curry(function (dataIndex) { // 此处必须用匿名函数,不能用箭头函数,否则拿不到拖动的坐标
   let origin = that.dom.convertToPixel('grid', that.data[dataIndex]) // 得到每个圆点原始位置
   // let maxY = that.dom.convertToPixel('grid', [40, 36]) // 最高温度为36摄氏度,暂未做封装
   // 超过最高温度36将不能拖动,写死的最低点高度为240,最高点为40
   if (this.position[1] > 240) {
    this.position[1] = 240
   } else if (this.position[1] < 40) {
    this.position[1] = 40
   }
   this.position[0] = origin[0] // 控制每个点位只能在y轴方向移动
   // this.position[1] = origin[1] // 控制每个点位只能在x轴方向移动
   // 实时获取拖动的点位信息并根据此信息重新画图
   that.data[dataIndex] = that.dom.convertFromPixel('grid', this.position)
   that.dom.setOption({
    series: [{
    id: 'a',
    data: that.data
    }]
   })
   }, dataIndex)
  }
  })
 })
 on(window, 'resize', this.dom.setOption({
  graphic: echarts.util.map(this.data, (item, dataIndex) => {
  return {
   position: this.dom.convertToPixel('grid', item)
  }
  })
 }))
 },
 beforeDestroy () {
 off(window, 'resize', this.resize)
 }
}
</script>

总结

以上所述是小编给大家介绍的vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用js实现多域名不同文件的调用方法
Jan 12 Javascript
Prototype源码浅析 Number部分
Jan 16 Javascript
jquery对单选框,多选框,文本框等常见操作小结
Jan 08 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
Mar 16 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
javascript中indexOf技术详解
May 07 Javascript
JS解决移动web开发手机输入框弹出的问题
Mar 31 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
vue 封装 Adminlte3组件的实现
Mar 18 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
关于JavaScript中异步/等待的用法与理解
Nov 18 Javascript
详解Vue中使用插槽(slot)、聚类插槽
Apr 12 #Javascript
JS实现li标签的删除
Apr 12 #Javascript
vue中多路由表头吸顶实现的几种布局方式
Apr 12 #Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
Apr 11 #Javascript
如何检查一个对象是否为空
Apr 11 #Javascript
vue项目创建并引入饿了么elementUI组件的步骤
Apr 11 #Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 #Javascript
You might like
用Php实现链结人气统计
2006/10/09 PHP
第六节--访问属性和方法
2006/11/16 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
MooTools 1.2介绍
2009/09/14 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
js实现轮播图特效
2020/05/28 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python全局变量操作详解
2015/04/14 Python
简单易懂的python环境安装教程
2017/07/13 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
应届生求职信写作技巧
2013/10/24 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
农村文化活动总结
2014/08/28 职场文书
普通党员对照检查材料
2014/09/24 职场文书