解决echarts获取数据不渲染的问题

写在前面

    本菜鸟第一次接到echarts的需求,就搞了整整一天,需求是这样的:①单线图表,只有一个系列。②多线图表,根据返回的数据系列生成不同的折现,形成一个堆叠折线图。③选单天的话,那么就以24小时为横坐标;如果是选择了一段时间,那么这个时间范围就以天为单位作为横坐标。

    于是乎,请求接口数据花了五分钟,调试问题七小时属于是,这个过程中,有异步的问题、监听外部切换时间范围的问题、刷新数据时要先初始化原来的数据的问题,数据对应的问题等等。

    好记性不如烂笔头,在此简单记录一下吧。

踩坑与解决 

一.首先是异步问题 

问题:

        接口请求回来了数据,并且格式也已经全部处理成和死数据一样了,然而,死数据可以显示,接口请求回来的数据却一直不能挂到图表上去。最后才发现,每次都是先渲染了图表,我的数据才回来。

什么是异步请求和什么是同步请求?

1. 同步请求:客户端向服务端发送请求,服务端响应以后客户端才渲染页面
2. 异步请求:客户端向服务端发送请求,客户端不等服务端响应就行行页面渲染,一般做页面的局部刷新。

       造成上面原因就是我的页面向服务端发送请求,页面不等服务端响应就已经渲染图表,尽管后面数据请求成功但此时页面已经渲染成功,页面此时只知道他所渲染图表时数据为空,所以不会显示数据。

        最终用一个很不正规的方法解决了问题:

  mounted () {
    setTimeout(() => {
      this.init()
    }, 500)
  },

        echart是异步的,不能在created里面先init()和调用数据,应该把它写在mounted并加上定时器(这是不正规的做法)。

 二.其次是外部时间范围切换,数据不会自动刷新的问题

问题:

        由于时间选择器写在父组件里面,图表放在子组件里面,我用 searchParams当props传进来,但是发现只有第一次打开才会渲染,后面再在外面切换时间范围,子组件的图表没变化,方法也没调用。

解决:

        最终用watch解决,给图表的div加一个id,然后每次切换时间,就刷新图表。

        注意:每次刷新都要把列表清空,不然会越push列表越长,图表越刷新越密集。

  watch: {
    searchParams: {
      deep: true,
      immediate: true,
      handler () {
        this.dataList = []
        this._getTrend()
        setTimeout(() => {
          this.init(document.getElementById('tendency_'))
        }, 500)
      }
    }
  },

        如果外面写了时间选择器,通过props中的searchParams参数传进来,子组件并不会自动刷新,所以要在子组件中用watch监听,及时进行刷新。监听刷新数据的时候,还要记得把原来的数据给初始化,不然,刷新一次列表就push一次,越刷新列表越长。而且,在watch里面已经写了的方法,在created里面就不用再写了,不然会导致调用了两遍。

子组件中:

props: {
    searchParams: Object,
}

父组件中:

  <tendency v-if="activeName=='vnode'" :search-params="searchParams"></tendency>
      searchParams: {
        startDate: moment().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
        endDate: moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
      },

 小白狂踩坑系列

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
如果在刷新页面后echarts数据不渲染或不显示,可能是因为echarts没有正确地初始化。可能的原因包括: 1. 页面加载完成前,echarts的初始化代码已经执行。可以将echarts的初始化代码放在window.onload或Vue的mounted生命周期钩子函数中,以确保在页面加载完成后再进行初始化。 2. echarts的初始化代码中,引用的DOM元素不存在或未加载。可以在初始化代码中设置setTimeout函数等待一段时间,确保DOM元素已经正确加载后再进行初始化。 3. echarts的初始化代码中,没有正确指定DOM元素。可以确认DOM元素的id是否正确,以及是否使用了正确的DOM元素。 下面是一个示例代码,使用Vue的mounted生命周期钩子函数初始化echarts: ```javascript <template> <div id="chart"></div> </template> <script> import echarts from 'echarts'; export default { mounted() { // 获取DOM元素 const chartDom = document.getElementById('chart'); // 初始化echarts const myChart = echarts.init(chartDom); // 设置数据和配置项 const option = {...}; // 渲染图表 myChart.setOption(option); } } </script> ``` 在上面的代码中,我们使用了Vue的mounted生命周期钩子函数,在页面加载完成后执行echarts的初始化代码。在初始化代码中,我们首先获取了一个id为"chart"的DOM元素,然后使用echarts.init方法初始化了echarts。接着,我们设置了数据和配置项,最后使用myChart.setOption方法渲染了图表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值