范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

在vue下封装echarts公共组件的总结

  这几天公司里边有一个项目,叫做日控制台,该项目是在webview下的一个webapp,使用vue构建,项目中要求使用许多自定义的图表。考察了许多图表组件之后,发现echarts是所有表库中,最灵活,特效最好看的一种。一、构建基础公共组件1. 实现基础功能
  在echart官网上搜索到,如何使用# 1. 获取一个用于挂在 echarts 的 DOM 元素 let $echartsDOM = document.getElementById("echarts-dom")  # 2. 初始化 let myEcharts = echarts.init($echartsDOM)  # 3. 设置配置项 let option = {...}  # 4. 为 echarts 指定配置 myEcharts.setOption(option)
  使用echart的步骤也就这几部,就是先获取到承载echart实例的dom实例,然后调用init()方法初始化图标实例,最后调用setOption()方法传入配置项
  这几步都要在vue的mounted方法下实现.mounted() {       let $echartsDOM = document.getElementById("echarts-dom")       let myEcharts = echarts.init($echartsDOM)       let option = {         title: {           text: "ECharts 入门示例"         },         tooltip: {},         legend: {           data: ["销量"]         },         xAxis: {             data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]         },         yAxis: {},         series: [{             name: "销量",             type: "bar",             data: [5, 20, 36, 10, 10, 20]         }]     }     myEcharts.setOption(option)   } }
  注:在 Vue 中,首先我们需要使用 import echarts from "echarts" 以引入 echarts。二、组件化
  思路很简单,就是将业务上用到的图表,比如柱状图、折线图,通通封装成组件,然后再main app文件中调用,通过分析,可以通过传props,来改变setOption()方法中的对象,达到封装不同图表组件的目的。 
  将之前的options转移到main app中的data对象之中。
  注:echarts图表要求承载的容器具有固定的宽高才能正常显示.echarts-container{   width: 100%;   height: 20rem; }1. 组件优化-props的series校验
  如果在传入组件的props中传入了空对象,就会发现,图表会抛出一个错误,即
  Error: Option should contains series.
  原因就是传入的 option 配置对象不含有 series 键,所以,默认值处理是需要存在的,即当调用方传入的对象为空或不存在 series 配置时,应在页面上显示一些提示( 对用户友好的提示,而不是对编程人员 ),即避免因报错而造成空白的情况。
  此外,当我们像之前那样给 option 这一参数进行类型限制后,倘若调用方传入非对象类型,Vue 会直接抛出错误——这一结果也不是我们想要的。我们应该取消类型限制,并在 option 发生变化时进行依次以下判断:// 1. 是否为对象; export function isObject(option) {   return Object.prototype.isPrototypeOf(option) }  // 2. 是否为空对象; export function isEmptyObject(option) {   return Object.keys(option).length === 0 }  // 3. 是否包含 series 键; export function hasSeriesKey(option) {   return !!option["series"] }  // 4. series 是否为数组; export function isSeriesArray(option) {   return Array.isArray(option["series"]) }  // 5. series 数组是否为空。 export function isSeriesEmpty(option) {   return option["series"].length === 0 }  export function isValidOption(option) {   return isObject(option) && !isEmptyObject(option)     && hasSeriesKey(option)     && isSeriesArray(option) && !isSeriesEmpty(option) }
  然后在组件中引入最后的isValidOption方法作为判断,我们先使用一个watch监听options的变化 watch: {     options(options){       this.checkAndSetOption()     }   },   methods: {     checkAndSetOption(){       let options = this.options       if(isValidOption(options)){         this.myEcharts.setOption(options)         this.isOptionAbnormal = false       }else{         this.isOptionAbnormal = true       }     }   }
  这里的checkAndSetOption方法是判断传入的option是否合法,如果合法,就执行setOption,isOptionAbnormal变量是监控页面是否显示options非法的flag。
  同样的dom样式上的改变,也要使用v-show来判断isOptionAbnormal是否要渲染图表和渲染错误信息。     数据为空                   .oc_echarts_container, .echarts {   width: 100%;   height: 100%; }  .shadow {   width: 100%;   height: 100%;   display: flex;   justify-content: center;   align-items: center;   font-size: 1rem;   color: #8590a6; }2. 增强组件功能 - 数据加载提示         数据加载中...
  在组件内部需要一个外部的props,isLoading,但是这里需要注意,在 Vue 中,v-show 使用 display 控制组件的显隐。而当 echart init 的时候,如果其挂载 DOM 的 v-show 处于 false 状态,则其 init 的对象宽高都是 0。即使之后 v-show 状态改变,由于 mounted 生命周期不会再次触发,从而使得 echarts 显示不正常。所以需要使用css的visibility来控制显隐。computed: {     isChartVisible() {        return !this.isLoading && !this.isOptionAbnormal     }   },             3. 组件复用-随机ID
  echarts 进行 init 挂载时使用的是 DOM 元素的 ID。而在组件中,我们设置的 ID 是固定的( 注意与 scoped css 进行区分 )。如果多个组件的 ID 是相同的,只有一个组件会被 echarts 挂载。
  所以我们要设定一个随机的randomId,赋值到承载echarts图表的dom元素的id中            三、延迟加载
  延迟加载是组件的一个优化,在业务的开发中可以看到,一个页面往往有着许多的图表,图标伴随着许多异步请求和canvas渲染,如果一次性渲染所有的图表会导致许多的性能问题。这里想到的一个解决方案就是延迟加载。
  用通俗的话讲就是,页面滚动到哪张图表就去渲染哪一张图表。
  完成这一功能需要以下步骤:监听页面滚动事件;滚动事件中获取 echarts 的位置;在页面当前位置达到 echarts 位置的时候进行 echarts 的初始化。1. 监听页面滚动
  如果要监听页面滚动,需要用到dom的监听器,addEventListener("scroll", [funciton])。这样就能为每一个组件附上监听事件。2. 获取当前滚动下边界和组件的上边界
  这一个步骤需要封装成一个函数,checkPosition()checkPosition() {       let windowHeight = document.documentElement.clientHeight||window.innerHeight       let scrollTop = document.documentElement.scrollTop || document.body.scrollTop       let windowBottom = scrollTop + windowHeight       const selfTop = _.get(this.$refs, "selfEcharts.offsetTop", 0);       if(windowBottom >= selfTop) {         this.isPositionReady = true         this.checkAndSetOption()         window.removeEventListener("scroll",  this.scrollEvent)       }     },windowBottom(滑动的下边界) = scrollTop(屏幕当前滑动的距离) + windowHeight(窗口的高度)selfTop(当前组件的顶部位置)
  当第一个变量大于第二个变量时,就认为滑动到了该图表组件,就开开启加载3. 初始化data() {     return {       myEcharts: null,       isOptionAbnormal: false,       randomId: "echarts-dom" + Date.now() + Math.random(),       scrollEvent:  _.throttle(this.checkPosition, 500), // 滑动事件       isPositionReady: false, //控制数据异步与页面滚动先后顺序的flag     }   }, mounted() {     let $echartsDOM = document.getElementById(this.randomId)     if(!$echartsDOM) return     this.myEcharts = echarts.init($echartsDOM)         // 第一次未滑动的时候     this.checkPosition()         //滑动之后的监听     window.addEventListener("scroll", this.scrollEvent)   },
  checkPosition方法不仅要在scroll监听事件中调用,在组件第一次渲染的时候也要调用一次进行初始化,不然,组件无法正常渲染图表。4.节流
  组件代码经过测试之后发现,如果滚动过于快速,会不停的调用checkPosition(),关键是这个方法会不停的去setOption(),所以以上代码均采用了lodash的throttle节流方法,在500毫秒内只允许调用一次。5. 解绑监听事件
  解绑事件,组件中有设定监听器,如果该图表已经被加载了,那么这个监听器就没有作用了。window.removeEventListener("scroll",  this.scrollEvent)
  这段代码就是解绑监听器,多多少少会优化一下速度吧。因为增加监听和解绑监听的时间函数要求一致,所以在data中新增了scrollEvent,顺便把节流函数一起加了上去。6. 请求异步控制setOption
  由于用于渲染 echarts 的数据常常是异步获取的,也就是说,option 可能会在异步调用结束之后更新,从而触发 option 的 watch,进而导致 this.checkOption()执行,最终使得 setOption 在页面没有滚动到合适位置时就触发了。
  为了解决这个问题,我们应该让 setOption 的过程受制于一个标识位,而该标识位会在页面滚动到合适位置时置为 true,从而杜绝由于 option 更新、触发 watch 而导致的漏洞。
  首先,我们要添加一个新的 data,取名为为 isPositionReady,然后,在 checkAndSetOption() 中加入对该标识位的判断:最后,在位置检测方法 checkPosition() 中,当达到合适位置时,将该标识位置为 true    checkPosition() {      // ....       if(windowBottom >= selfTop) {         this.isPositionReady = true         // ....       }     },     checkAndSetOption() {     // ....       if(!this.isPositionReady) return        //....     }四、echarts重绘
  这里的重绘指的是 ehcarts 中的 resize() 方法。用于在某些时刻进行 echarts 的调整,包括:组件宽度设置为百分比,浏览器宽度发生变化时;页面收缩元素状态改变,如侧边栏收缩导致内容区宽度变化;1.页面宽度改变
  继续增加监听器就能完成window.addEventListener("resize", _.throttle(() => {     this.myEcharts.resize()     console.log("---") }, 500))

欧国联捷克vs葡萄牙!捷克阵容大幅升级,C罗宝刀已老难发威?今天第一场聊欧国联捷克vs葡萄牙!双方上一次交手的时候,葡萄牙是打得很轻松愉快啊。但这一次碰面,双方的情况都有蛮多不同,葡萄牙还能轻松愉快吗?希克和瓦茨利克,这两位拿过捷克足球先生紧急提醒!多人感染,涉及三省多地9月23日0时至24时,山东青岛市新增2例本土无症状感染者,自外省乘坐Z274次列车于9月22日抵达青岛。截至目前,多地报告涉Z274次列车感染者,涉及山东江苏湖北等三省多地。多地水稻田中的杂株哪儿来的?一文带你溯根求源弄个明白丰收中国水稻丰收季,到处都是乡农们忙碌的身影,毕竞忙碌一年到头,看看黄灿灿的谷穗,他们心里头的那个高兴劲儿,甭提了。然而,高兴的同时,他们也有恼心事不解。亦即部分水稻田中有杂株不知外媒日探测器在龙宫小行星尘埃中发现水据法新社9月22日报道,科学家近日说,日本的一个太空探测器从距地球约3亿公里的一颗小行星上获取的少量尘埃中发现了令人惊讶的组成部分一滴水。这一发现为地球生命源自外层空间的理论提供了七星彩9月25日走势预测参考图规由图规得二码定位85XX。仅供参考娱乐,不可投注。图规由图规得二码定位97XX。仅供参考娱乐,不可投注。图规由图规得二码定位30XX。仅供参考娱乐,不可投注。图规由图规得三码定黄牛哭了IPHONE第一次自己贴钱出售iPhone14上市之后,很多人都得到了他们梦寐以求的新手机。谁也没想到,短短几天的时间,关于iPhone14的bug就被传得沸沸扬扬连黄牛都哭了,第一次贴钱卖iPhone?我来告螃蟹我熟了,也红了又到吃蟹季,今年你与蟹在饭桌上相逢了吗?一般情况下,活蟹通体青黑,一副钢筋铁骨的模样,蒸熟之后便大变身,蟹壳变红,鲜艳的颜色更让人垂涎欲滴。吃过这么多螃蟹,你知道蒸煮过程蟹壳为什么斗罗再次登场的风笑天成为魂斗罗了吗?看看朱竹清,也才82级在斗罗大陆动画中,风笑天再次登场,这也算是一个小惊喜吧。作为昔日四元素学院中的佼佼者,风笑天的实力毋庸置疑,当年高级魂师大赛的时候,风笑天甚至对唐三造成了很大威胁,唐三想赢风笑天也这4个丑到爆的家装设计,快看看你家中招了没?不管是新房装修还是旧房翻新,都需要懂一些装修知识,否则很可能会得到装了还不如不装的结果。比如,在装修中有些装饰物不仅不能提高爱家美观度高级感,反而会让整个房间格调都显得低俗。今天尚网红聂小雨戴牙套吃火锅,现场刷牙被批没素质,网友封杀不管是当网红还是明星,大家的目的只有一个,就是赚更多的钱,过更好的生活。网红相对来说比较接地气,工作简单直白,平日里只需要拍摄视频就可以赚到钱,吸引了很多年轻人关注。聂小雨是圈子里秋冬常喝4款滋补汤,助力血小板提升!赶快学起来关于血小板减少的危害不用再多说,对每个饱经血小板低下反复折磨的ITP患者早已有根深蒂固地了解。中医为主中西医结合方式为治疗ITP带来了新转机,临床取得喜人成绩。升血小板胶囊升血小板
为什么很多孩子讨厌写作文?这是个好问题。什么是作文?作文的要求是什么?为什么孩子们感到难?怎么造成的,是那个环节出了问题的呢?作文基础是什么时候打的,是怎么打的呢?这里有答案。语文知识分的很细,字词句段篇,女性过了25岁应该如何保养自己?25岁是女人的一个分水岭,这个阶段皮肤营养缺失,胶原蛋白逐渐流逝,身体也逐渐呈现下滑的情况。18岁的时候,天天熬夜看书,第二天皮肤照样很好但是到了25岁,甚至是30岁之后,一熬夜各去过香港的朋友,说一说在香港的感受如何?在香港待了7天,消费5万,我得到一个结论这不是穷人应该待的地方从小就喜欢香港电影,喜欢周星驰,喜欢周润发,对电影里面的各种场景也充满向往,一直想要亲身体验一下,2018年我真的去了考上大学如何选专业将来毕业了才会有个好的未来?高考后考生填报志愿的时候,需要根据自己的成绩和兴趣爱好来选择专业,同时也要考虑未来的职业发展方向。第一如果以后想从事学术研究,就是进大学当老师和研究所做研究工作,本科阶段就尽量学基在山东,高考分数低于650能不能走出山东?如果你想走出山东,哪怕你是专科的分数也是可以的,甚至600分以上的我都是比较建议走出去的,没必要非得在山东大混战。举个去年真实的例子比如去年我们接的一个学生,男孩考了598分,这个本科厦大金融,家在成都,保研应选南开还是西财金专?我是燕园终身学习,我来回答。我是学金融的,对于内地高校金融学科的相关情况都比较清楚,且,我本科毕业于西南财经大学,对于西财的情况,尤其是西财金融学科的情况比较了解,下面阐述一下个人尼泊尔真的很落后吗?真实的尼泊尔是什么样的?我在国内月薪3000,出去买个菜都要斤斤计较,可去了尼泊尔我却飘了几块人民币就能吃顿好的,住一晚酒店只要十几块。2018年的时候,几个朋友非要拉着我去尼泊尔徒步旅游,起初我的内心十违纪处分人员还能升职吗?你好,违纪人员受到处分后一定期限内是不能升职的,但期满后可以正常升职。目前,我国针对违纪人员的处分主要有两种,一种是针对全体党员的纪律处分,另一种是针对全体公职人员的政务处分,二者公司开除员工为什么要员工主动辞职,不直接把他开除?这个问题很简单,因为公司随便开除员工要支付经济赔偿金,而员工主动辞职最多支付经济补偿金,而根据法律规定,经济赔偿金的金额是经济补偿金的两倍!因此,出于经济成本考虑,公司自然会想办法科目二考前为啥都熟悉场地?大家好!我是大白驾培,专门从事驾培行业的,您在驾培行业有任何问题,我都尽量同您一起解决。科目二是整个驾培训练中最难的科目在驾考过程中,科目二是最难的,也是驾考过程中最费时间的。可以有什么可怕的拐卖案例吗?尤其是女大学生,怎样预防呢?一名校女研究生王莲被拐卖。在1988年,上海一个名牌大学的学生王莲就被卖到了山东的一个深山中,而在那里,她受尽了折磨。1988年,王莲正在准备自己的毕业论文,为了获取论文中的必要数