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 相关文章推荐
基于jQuery实现下拉收缩(展开与折叠)特效
Dec 25 Javascript
jQuery动态添加删除select项(实现代码)
Sep 03 Javascript
浅谈JavaScript的自动垃圾收集机制
Dec 15 Javascript
手机端js和html5刮刮卡效果
Sep 29 Javascript
JS实现隔行换色的表格排序
Mar 27 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
vue 运用mock数据的示例代码
Nov 07 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
vue点击当前路由高亮小案例
Sep 26 Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
Vue全家桶入门基础教程
May 14 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
ThinkPHP中redirect用法分析
2014/12/05 PHP
PHP数组操作类实例
2015/07/11 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
举例详解Python中循环语句的嵌套使用
2015/05/14 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
演讲稿怎么写
2014/01/07 职场文书
高二英语教学反思
2014/01/19 职场文书
对教师的评语
2014/04/28 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
教务处教学工作总结
2015/08/10 职场文书
大队委员竞选稿
2015/11/20 职场文书
MySQL分布式恢复进阶
2022/07/23 MySQL