• 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. }

  • 相关阅读:
    多模态论文阅读之VLMo
    VUE3 之 动态组件 - 这个系列的教程通俗易懂,适合新手
    Dubbo3.0入门-Java版
    javaH5醉美南湾湖网站设计计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    (附源码)计算机毕业设计ssmJAVA高校田径运动会管理
    计算机408看不懂?那是你还不知道这套学习方法和资源
    关于爬虫发展历史,价值,问题和应对恶意爬虫的策略
    系统设计的11个考虑
    Java中如何将“日期字符串”转换为java对象呢?
    为何电脑从 C 盘开始? A、B 盘去哪了
  • 原文地址:https://blog.csdn.net/weixin_45654230/article/details/136215903