当前位置:   article > 正文

vue中切换tab时echart不显示或显示不正常

vue中切换tab时echart不显示或显示不正常

项目中在不同的tab中都使用了echart,但是在切换tab的时候发现第二个tab没有正常显示,通过排查代码和网上查阅才发现是因为element是通过display来控制tab的显示的,没有点击tab2的时候第二个echart图表的容器是 display:none,echart图标容器宽高为0,当浏览器在初始化的时候自然就会导致echart渲染错误,自然就不会正常显示

问题如下

可能出现问题之一:

可能出现问题之二:

解决方法:

1、因为echart图表2是因为没有宽高导致的,所以可以给echart2图表设置一个固定的宽高,但这样做可能会导致项目在不同大小的显示屏上展示的效果不一样,影响用户体验。不推荐使用这种方法

2、使用$nextTick,解决思路:在渲染图表1的时候获取宽度,然后给图表2的宽度赋值,切换tab的时候设置$nextTick在下一次DOM更新的时候使用resize()函数重新渲染图表2。

关键代码如下:(完整代码在最后)

  1. //图表1渲染函数
  2. function render1() {
  3. myChart1 = echart.init(document.getElementById("questionChart"))
  4. myChart1.setOption(option1)
  5. //获取图表1的宽度
  6. let echartContainer = document.getElementById("echartContainer")
  7. tabWidth2.value = echartContainer.clientWidth
  8. window.addEventListener('resize', () => {
  9. myChart1.resize()
  10. })
  11. }
  1. //tab切换处理方法
  2. const handleClick = (tab: TabsPaneContext, event: Event) => {
  3. if (tab.index === 0) {
  4. nextTick(() => {
  5. //重新渲染图表1
  6. myChart1.resize()
  7. })
  8. } else {
  9. nextTick(() => {
  10. //重新渲染图表2
  11. myChart2.resize()
  12. })
  13. }
  14. }

最终效果:

完整代码:

HTML:

  1. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  2. <el-tab-pane label="提问/回答趋势" name="first">
  3. <div ref="questionChart" id="questionChart" :style="{ height: '380px' }"></div>
  4. </el-tab-pane>
  5. <el-tab-pane label="AI应答率趋势" name="second">
  6. <div ref="AIChart" id="AIChart" :style="{ width: tabWidth2 + 'px' , height: '380px' }"></div>
  7. </el-tab-pane>
  8. </el-tabs>

JS:

  1. const tabWidth2 = ref(1200)
  2. onMounted(() => {
  3. render1()
  4. render2()
  5. })
  6. //图表1渲染函数
  7. let myChart1
  8. function render1() {
  9. myChart1 = echart.init(document.getElementById("questionChart"))
  10. myChart1.setOption(option1)
  11. //获取图表1宽度
  12. let echartContainer = document.getElementById("echartContainer")
  13. tabWidth2.value = echartContainer.clientWidth
  14. window.addEventListener('resize', () => {
  15. myChart1.resize()
  16. })
  17. }
  18. let myChart2
  19. function render2() {
  20. myChart2 = echart.init(document.getElementById("AIChart"))
  21. myChart2.setOption(option2)
  22. window.addEventListener('resize', () => {
  23. myChart2.resize()
  24. })
  25. }
  26. //tab切换处理方法
  27. const handleClick = (tab: TabsPaneContext, event: Event) => {
  28. if (tab.index === 0) {
  29. nextTick(() => {
  30. //重新渲染图表1
  31. myChart1.resize()
  32. })
  33. } else {
  34. nextTick(() => {
  35. //重新渲染图表2
  36. myChart2.resize()
  37. })
  38. }
  39. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号