# Echarts在微信小程序苹果设备环境下渲染问题

# 先说一下详细问题吧:

一个伸缩列表组件,点击打开item,item内的echarts图渲染显示异常,会缩的很小

TIP

本页面是内嵌在小程序内的web-view的,React + echarts

另外:

WARNING

仅在苹果微信小程序端发现问题,chrome、safari、安卓、苹果微信浏览器没有问题

# 解决办法:

经过排查,怀疑是伸缩列表在display切换的时候,echarts没有正确响应宽度变化导致的渲染异常,看代码:

# render

render(){
  <Accordion className='radarM-stock__menu' as={Menu} vertical>
      {
        items.map((item, index) => (
          <Menu.Item key={index}>
            <Accordion.Title
              index={index}
              active={activeIndex === index}
              content={(
                <span>标题</span>
              )}
              onClick={this.handleClick}/>
            <Accordion.Content
              active={activeIndex === index}
              content={
                this.renderListItemContent(item, index)
              }/>
          </Menu.Item>
        ))
      }
  </Accordion>
}

# renderListItemContent函数

renderListItemContent(item, index) {
  switch (item) {
      case "财务操纵":
        return(
          <React.Fragment>
            <div>财务操纵图</div>
            <ReactEcharts
                className="echarts"
                option={charts['财务操纵']}
                style={{
                  width: '100%',
                  height: '17rem',
                  margin: '2rem auto 0'
                }}/>
          </React.Fragment>
        );
  }
}
// 有很多种switch item ,这里就只写了一个

代码大概就是这样,我们可以看到,以上的逻辑,其实在代码执行时, echarts已经渲染好了,我们要做的就是延迟渲染,在点击列表项时, 再让echarts进行渲染。话不多说,看代码:

renderListItemContent(item, index) {
  const { activeIndex } = this.state;
  switch (item) {
      case "财务操纵":
        return(
          <React.Fragment>
            <div>财务操纵图</div>
            {
              // 根据state控制是否渲染加载
              activeIndex === index && 
              <ReactEcharts
                className="echarts"
                option={charts['财务操纵']}
                style={{
                  width: '100%',
                  height: '17rem',
                  margin: '2rem auto 0'
                }}/>
            }
          </React.Fragment>
        );
  }
}

这样echarts就会在激活当前列表项display时才会加载echarts,而且 这样每次打开会发现echarts的图都会有动画效果。

OK,fine!