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

在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))

吴啊萍身上疑点太多,有五大疑点至今让人想不通疑点一那五个战犯的名字很长,读起来很拗口,如果不是特意去背诵,正常人看几遍根本记不住,除非是那种记忆力很好的人,但是吴啊萍记住了,而且她还能一字不差给他们立牌位。南京事件发生至今有飞行员能开车吗?没想到2022年了,被问得最多的问题竟然是飞行员能开车吗?问的人之多,学历之高,把我弄得都不自信了,赶紧咨询了从空军飞到最高年限转业的师父,空军在很多年前就没有这样的规定了,在我还民国时期梨树县知事尹寿松的故事3没想到修路这个举措,梨树县修路的标准,成了被奉天省采用,成了奉天省的修治道路考成规则,这就是县道须在3。6丈(合12米)以上。尹寿松开了标准修道的创举。尹寿松上报建四平街新市场时,血色浪漫钟跃民在乱刀之下救走李奎勇,同时也是救了李援朝他们导语血色浪漫里面众顽主齐聚先农坛诛杀小混蛋的那里,可以算是重头戏,颇有惊心动魄的感觉。钟跃民在关键时刻出现救走了李奎勇,李援朝大喊让大家停止追捕,算是为钟跃民放行了,那么李援朝为何小芳,她爱上了一个乞丐这是个真实的故事,小芳的丈夫曾因车祸去世,丢下他一个人过日子。某天的清晨,小芳像往常一样起来,迷迷糊糊地打开了大门,只见抬头一个衣衫褴褛,头发膨胀,像很多天没洗头的乞丐,那个男人的1972年李讷离婚,毛主席得知后多次自责落泪讷娃的婚事太草率了父亲大手的温暖,怎么说呢,至今回忆起来仍然是那么幸福毛主席身边,有两个女儿,长得都十分标志,她们分别是李敏和李讷。李讷是毛主席的小女儿,在毛主席众多子女中,是陪伴毛主席时间最长的一她的八卦马俪第一次见到苏红是在自家院子里。那是刚搬进新家的第一天,小区是联排别墅区,与邻居家仅隔着一道低低的围墙。苏红端着一盘精致的小点心站在院墙边同她打招呼,马俪抬眼,就被这位美丽的邻居刘诗诗一念关山官宣!时隔5年再演古装剧,阵容班底令人担忧网传许久的古装剧一念关山终于正式官宣演员阵容,引发了网友们的广泛热议。有趣的是,一念关山演员名单详细,全阵容发布导致这条官宣文案提及的明星太多,官博刚发布博文就被删除,还连续反复多辽宁大豆补贴已发放,500元每亩东北粮补传来最新消息辽宁省部分地区大豆补贴已经下发合计每亩近500元(信息来源自辽宁省农业农村厅,且该补贴金额标准包括生产者补贴耕地轮作补贴一次性补贴等多项补贴)另外,辽宁省官方表1夜5消息巴萨官宣莱万!拜仁官宣德里赫特C罗决定去马竞?北京时间7月20日,巴萨正式官宣莱万加盟,拜仁官宣德里赫特加盟,尤文敲定都灵后卫布雷默,曝C罗决定加盟马竞。官宣!巴萨正式签下莱万巴萨和拜仁官方宣布,莱万正式加盟巴萨,双方将签约至河北一老农,给驴梳头拉二胡,被人嘲笑,年入12万,谁都羡慕近日,一位河北网友说,在生产队时,邻居喂牲口,人们都称他为饲养员,他管理着马,骡子,驴,牛等30头牲畜。驴在那个时候很出力,拉车,犁地,搞副业等农活,而且还是重体力活儿,为了让驴多
马尔康西索民居与嘉绒藏族文化区天极之旅行摄藏区(23)沿213国道走过了甘南和川北若尔盖红原之后就进入了马尔康县,马尔康是国道213线与国道317线交汇地,从这里开始我们将一路西行走上著名的川藏北线317国道,一直到达西藏的那曲地区。美国历史上10位重要的黑人发明家这10位创新者只是为商业工业医学和技术做出重要贡献的众多美国黑人中的一小部分。01沃克夫人(1867年12月23日1919年5月25日)出生于莎拉布里德洛夫(SarahBreedl这个海滩是男人的天堂,脱光衣服才让进,对女性有这个要求!下面跟大家推荐最奇葩的海滩,这个沙滩在巴西,这处海滩是男人最喜欢的地方,一般男人要脱光衣服才能够进入,女性也不例外。(此处已添加小程序,请到今日头条客户端查看)一般每年的122月份揭秘奥斯曼帝国与威尼斯的战争起源,以及帝国与欧洲的冲突文鸭先知编辑旧时叙前言奥斯曼和威尼斯在很大程度上保持着友好关系。威尼斯希望通过与苏丹保持良好关系来保护自己在奥斯曼帝国领土和黑海地区的商业利益,尤其是在热那亚的竞争对手试图利用他们唐会玩回到唐朝,跟王公贵族一起,唱歌跳舞演话剧如此形式多样且内容丰富的宫廷娱乐活动,渗透并影响着当时社会的各个方面。通过对唐代娱乐活动的探讨,不仅可以看到唐代宫廷娱乐活动发展水平之高,同时也能看到娱乐活动与政治经济文化外交等各唐朝的世界与最初大多数中国人认为唐朝(618907)在政治上和文化上都是中国帝国主义的高潮。这个帝国在满清王朝之前就达到了最大的规模,成为了一个由宗教文字和许多经济和政治机构连接起来的东亚世界的中60岁之前一定要去的99个地方,你还差几个?人应该去旅行,在年轻的时候,趁着有脾气装潇洒,有本钱耍个性,离开睁眼闭眼看见的城市,逃离身边的纷纷扰扰,找一个让心里安静和干净的地方,让自己变得跟水晶一般透明,然后拍一些美得想哭的西康省守护西藏的国之藩篱,抗战到底的最后底线第二次鸦片战争之后,曾经称雄亚洲的大清帝国日渐衰落,再不复当年之勇,特别是在1894年的甲午战争中,作为亚洲传统强国的大清帝国被新兴的日本帝国击败,大清国最后的尊严被扒的荡然无存。2。5亿美元保释金背后世纪金融骗局FTX称自己为交易所,但它与传统证券或商品交易所大不相同,后两者受到高度监管,通常被禁止从事FTX此前的诸多经营活动。关于全球第二大加密货币交易所FTX的崩塌,不少人暗暗叫好,背后宝可梦也要玩元宇宙那套?任天堂出马,发现是山寨公司搞鬼宝可梦IP自带的商业价值,想必没人会质疑。不管是一年一出的系列游戏正逐渐成为新时代收藏品的集换式卡牌,还是跟普通玩家的生活息息相关的各类周边物品,都在不断印证着这个IP的强大吸金能选择影响命运原本是契丹将领的李楷固,归唐后过得风生水起李楷固作为唐朝著名的契丹将领,其归唐前曾参与七世纪末的营州之乱,归唐后转而助唐清剿契丹靺鞨的余叛,官至左右钤卫大将军,生前受爵燕国公,是唐朝东北蕃将群体中较有代表性的一员。李楷固为