前后端分离——前端echarts问题记录

一、JSON.parse对象转换问题

obj = JSON.parse(data)时候报错:
SyntaxError: Unexpected token . in JSON at position 0
原因:
data已经是对象了。
JSON.parse():将JSON字符串转换成JSON对象
JSON.stringify():将JSON对象转换成JSON字符串

二、echarts的div高度一定要定义

高度不定义可能会导致加载了但没显示出来!
eecharts的div高度一定要定义!!
当然了宽度最好也定义!!!

三、elementUI的tab页中画echarts图形问题

elementUI的tab页通过v-show控制tab页存在但不展示(v-if不存在v-show存在),但是非当前tab的高宽没有!
导致不能够一次性把所有tab页的图画上,会提示dom高宽未定义!!!
所以可通过切换tab页时将当前数值传递给echarts进行绘制。

四、主题json引入问题

1、obj = JSON.parse('/static/***.json')
parse不能这么引入json,于是我import一下吧import from '/static/***.json'并没有用啊,谁告诉你import这么用的!!!
2、那试试jquery读json文件咯
jQuery.getJSON("/static/***.json", "", function(response) {
    obj = JSON.parse(response)
})
还是报错,因为response已经是对象了!不需要再JSON.parse!
3、于是直接注册主题吧
jQuery.getJSON("/static/***.json", "", function(response) {
    echarts.registerTheme('themeName', response)
})
let myChart = echarts.init(document.getElementById('test'), 'themeName')
还是没用啊,不对是页面闪现了一下,因为jquery异步,又回到默认了。
4、所以将init放到jQuery处理后,如下总算能引入自定义的主题色了。
jQuery.getJSON("/static/***.json", "", function(response) {
    echarts.registerTheme('themeName', response)
    echarts.init(document.getElementById('test'), 'themeName')
})
5、最后其实import很好用啊,这里有了import还要什么jquery。如下
import chartOpt from './***.json'
let self = this
echarts.registerTheme('themeName', chartOpt)
self.initChart()
呵呵呵,其实这样就好了。

扫描二维码关注公众号,回复: 3899071 查看本文章

五、echarts3D图引入需要额外下载安装echarts-gl

package.json中的dependencies,添加"echarts-gl": "^1.1.1",会有提示尚未安装
去项目所在根目录执行命令npm install echarts-gl --save
webpack会去下载包save指令会将下载的详情保存至package-lock.json文件中
"echarts-gl": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/echarts-gl/-/echarts-gl-1.1.1.tgz",
      "integrity": "sha512-cRSTU9H+Ay+qCUFowm+2XcxYqCfi/OLK805NISeJunKgJa5p+7p7tnHZoI0qKebjtHu8VbFSOBk9UvWZ01adng==",
      "requires": {
        "claygl": "1.2.3",
        "zrender": "4.0.4"
      }
    },
在使用echarts的时候import 'echarts-gl'即可。

六、echarts缓存问题

当series[]中包含多个对象多组data[]时:
以折线图为例,能实现一条折线到两条的增加,但是当series[]中data[]减少为一条折线数据时,仍然会显示之前的两条折线。
思考过程:
找到this.myChart.setOption(this.currentData)处,打印this.currentData
其中series[]明明只有一个,但是会画出两条甚至多条折线图!!!
猜想是不是有缓存,百度echarts缓存清理得知,需要在setOption之前调用clear方法,即:
this.myChart.clear()
this.myChart.setOption(this.currentData)
果然问题解决。

七、echarts宽度变化后重绘的问题

window.onresize监听宽度变化毛线用没有
定时器定时查询echarts外层div的宽度不建议使用
addEventListener加载监听事件到echarts外层div总是失效
所以,可以在最外层加addEventListener宽度,变化了存起来,然后computed属性读取vuex里面存的宽度,然后watch全局宽度变量变化了就重新绘制echarts。
但是我还是喜欢定时器哈哈哈哈哈
定时器:
用完一定要记得关闭,用之前最好先clearTimeout!!!
用完一定要记得关闭,用之前最好先clearTimeout!!!
用完一定要记得关闭,用之前最好先clearTimeout!!!
记住这样:
somefuntion () {
    // 需要定时执行的方法
    clearTimeout(this.timer)
    this.timer = setTimeout(somefuntion, 30000)
}
destroyed () {
    clearTimeout(this.timer)
}
解释:
写在setTimeout()之前的清除,只是为了保证当前定时器只开启了一个。
先清除缓存中的定时器,然后开启一个30s后执行一次的定时器,30s后先清除还有没有定时器(一般没有),新建一个定时器,以此循环。
比起setInterval建议使用setTimeout只是延迟执行一次

猜你喜欢

转载自blog.csdn.net/Beam007/article/details/83654604