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 相关文章推荐
如何在Mozilla Gecko 用Javascript加载XSL
Jan 09 Javascript
用javascript实现给图片加链接
Aug 15 Javascript
JavaScript中常见陷阱小结
Apr 27 Javascript
jqGrid读取选择的多行的某个属性代码
May 18 Javascript
js处理php输出时间戳对不上号的解决方法
Jun 20 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
JavaScript中的函数(二)
Dec 23 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
javascript 作用于作用域链的详解
Sep 27 Javascript
今天,小程序正式支持 SVG
Apr 20 Javascript
vue实现登陆页面开发实践
May 30 Vue.js
Vue router配置与使用分析讲解
Dec 24 Vue.js
详解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+DBM的同学录程序(1)
2006/10/09 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php实现分页显示
2015/11/03 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
php桥接模式应用案例分析
2019/10/23 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
Python使用chardet判断字符编码
2015/05/09 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
python实现LRU热点缓存及原理
2019/10/29 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
《山谷中的谜底》教学反思
2014/04/26 职场文书
优秀护士演讲稿
2014/04/30 职场文书
全国文明单位申报材料
2014/05/31 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS