新手进阶之开发解决问题过程--记一次微信小程序使用mpvue-echarts图表v-show切换导致其他图表渲染的问题

在使用mpVue结合Vant Weapp进行小程序开发时,遇到使用mpvue-echarts组件切换图表时渲染异常的问题。本文详细分析了问题原因,即隐藏图表的宽高为0导致渲染异常,并提供了修改HandleInit方法判断宽高,解决图表切换时的渲染问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 问题描述 

       在使用mpVue+vant-weapp写小程序时 ,使用mpvue-echarts图表v-show切换其他图表的时候,出现了一个奇怪的现象,就是切换后面的隐藏了的图表会渲染异常,如图所示:

 

 

        图表未切换的时候是正常的,如第一张所示,第二张是切换之后导致渲染的问题,故猜想出问题的地方是图表传染的组件出现了问题,带着这个疑问,我们到组件想让宽高的位置打印出图表渲染出的宽高。

二  mpvue-echarts代码

        在研究mpvue-echarts的代码时候,发现调用这个组件会自动的初始化方法,都会先调用 HandleInit 的方法来渲染初始化echerts图表,

<template>
  <div class="echarts-wrap" id="echarts-wrap">
    <mpvue-echarts :ref="refName" :echarts="echarts" :onInit="HandleInit" :canvasId="canvasId"/>
  </div>
</template>

<script>
  import echarts from '../../static/js/echarts.min'
  import mpvueEcharts from 'mpvue-echarts'

  let chart

  export default {
    props: {
      chartDataObj: {
        type: Array,
        default: function () {
          return []
        }
      },
      canvasId: {
        type: String,
        default: 'demo'
      },
      refName: {
        type: String,
        default: 'echarts'
      }
    },
    components: {
      mpvueEcharts
    },
    data () {
      return {
        echarts,
        option: null
      }
    },
    onLoad () {
    },
    mounted () {
      // 在模版加载完成之后,才能初始化图表。
      this.InitChart()
    },
    watch: {
      chartDataObj (val) {
        this.InitChart()
      }
    },
    methods: {
      InitChart () {
        this.option = {
          toolbox: {
            show: true,
            feature: {
              saveAsImage: {
                show: true,
                excludeComponents: ['toolbox'],
                pixelRatio: 2
              }
            }
          },
          color: ['#0DBBFF'],
          legend: {},
          tooltip: {},
          dataset: {
            dimensions: this.chartDataObj.forEach((val) => {
              const arr = []
              let keys = Object.keys(val)
              arr.push(keys)
              return arr
            }),
            source: this.chartDataObj
          },
          xAxis: {type: 'category'},
          yAxis: {},
          series: [{type: 'bar'}]
        }
        this.$refs.echarts.init()
      },
      HandleInit (canvas, width, height) {
        console.log('图表的宽度:' + width + ' 图表的高度:' + height)
        chart = echarts.init(canvas, null, {
          width: width,
          height: height
        })
        canvas.setChart(chart)
        chart.setOption(this.option, true)
        return chart
      }
    }
  }
</script>

<style>
  .echarts-wrap {
    width: 100%;
    height: 600rpx;
  }
</style>

三 验证猜想 

        接下来验证我的猜想是否正确,查看出控制台的数据如下:

四 分析 

        mpvue-echarts渲染的时候,是把页面上容器的高度和宽度带入了初始化的渲染方法中,使用了 v-show 的容器的宽高都导致隐藏的图表在显示的时候渲染异常, 故问题出现在了这里,被隐藏了的图表的宽高为0,渲染调用 HandleInit 方法时候的宽高为0导致的渲染异常。

五 解决问题

        既然问题出现在渲染 HandleInit 方法的宽高上面,那么在渲染的时候判断宽高为0的为页面上隐藏了的图表,加上判断赋值上宽高即可解决。

 

六 修改后的结果

 切换其他图表显示正常,即解决了我们的bug

 总结

我们在开发中遇到问题,要先学会定位问题出现在什么地方是关键,然后猜想问题出现的地方,经过修改验证找到出现的问题,最后解决问题,虽然有时候问题很简单,但是我们要学会这种思维方式,大问题一般都是由许多的小问题组成,与到bug不慌,冷静分析,找出和定位问题是关键。

 


### 微信小程序 ECharts 样式配置教程 #### 一、初始化与基础设置 为了在微信小程序使用ECharts并调整其样式,需先引入ECharts-for-weixin (wxecharts)库。完成项目创建后,在`json`文件里声明依赖包[^1]。 ```json { "usingComponents": { "ec-canvas": "/components/ec-canvas/ec-canvas" } } ``` 页面布局方面采用自定义组件形式加载图表容器: ```html <view class="chart-container"> <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar"></ec-canvas> </view> ``` #### 二、样式定制指南 ##### (一)全局主题设定 通过修改option对象内的color属性来改变系列颜色;利用backgroundColor更改背景色调;借助textStyle统一字体风格等操作实现整体视觉效果优化。 ```javascript const option = { backgroundColor: '#FFFFFF', color: ['#c23531','#2f4554', '#61a0a8'], textStyle:{ fontSize:16, fontWeight:'bold' }, }; ``` ##### (二)图例外观微调 legend组件允许用户指定位置(top/bottom/left/right),同时提供itemWidth,itemHeight参数控制图标尺寸以及iconType决定形状(圆圈/circle,矩形/rect)。 ```javascript legend: { orient: 'vertical', top: 'center', left: 'left', itemWidth: 25, itemHeight: 14, icon: 'circle' }, ``` ##### (三)坐标轴刻度线修饰 对于直角坐标系而言,xAxis,yAxis分别对应横纵两个方向上的轴标签格式化器formatter可用于动态计算显示文字;splitLine设置网格分割线条样式;axisLabel则影响具体数值呈现方式。 ```javascript xAxis: [{ type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], axisTick: { show: false }, // 隐藏刻度标 splitLine:{ lineStyle:{type:"dashed"}},// 虚线分隔符 }], yAxis:[{ name:'单位:元',// y轴名称 minInterval : 1,// 强制最小间隔为1 axisLabel : { formatter:function(value){ return value+'%' } } }] ``` #### 三、常见问题处理方案 当遇到无法正常渲染图形的情况时,可以尝试以下几种排查手段: - **确认网络请求返回数据无误** - **核实JSON结构合法性** - **确保canvas节点已正确挂载** 如果发现交互反馈迟缓,则考虑减少动画帧数或关闭不必要的特效展示以提高性能表现[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值