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渲染函数
function render1() {
  myChart1 = echart.init(document.getElementById("questionChart"))
  myChart1.setOption(option1)

  //获取图表1的宽度
  let echartContainer = document.getElementById("echartContainer")
  tabWidth2.value = echartContainer.clientWidth

  window.addEventListener('resize', () => {
    myChart1.resize()
  })
}
//tab切换处理方法
const handleClick = (tab: TabsPaneContext, event: Event) => {
  if (tab.index === 0) {
    nextTick(() => {
      //重新渲染图表1
      myChart1.resize()
    })
  } else {
    nextTick(() => {
      //重新渲染图表2
      myChart2.resize()
    })
  }
}

最终效果:

完整代码:

HTML:

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

JS:

const tabWidth2 = ref(1200)
onMounted(() => {
  render1()
  render2()
})

//图表1渲染函数
let myChart1
function render1() {
  myChart1 = echart.init(document.getElementById("questionChart"))
  myChart1.setOption(option1)

  //获取图表1宽度
  let echartContainer = document.getElementById("echartContainer")
  tabWidth2.value = echartContainer.clientWidth

  window.addEventListener('resize', () => {
    myChart1.resize()
  })
}

let myChart2
function render2() {
  myChart2 = echart.init(document.getElementById("AIChart"))
  myChart2.setOption(option2)
  window.addEventListener('resize', () => {
    myChart2.resize()
  })
}

//tab切换处理方法
const handleClick = (tab: TabsPaneContext, event: Event) => {
  if (tab.index === 0) {
    nextTick(() => {
      //重新渲染图表1
      myChart1.resize()
    })
  } else {
    nextTick(() => {
      //重新渲染图表2
      myChart2.resize()
    })
  }
}

好的,针对您的问题,我可以给您提供以下的思路: 1. 首先在Vue3+TS项目中安装 echarts 库,并引入相关的组件。 2. 在组件中定义三个tab,分别对应三个同的纬度,可以使用 element-ui 的 Tabs 组件。 3. 在每个tab中使用 echarts 组件,分别绘制对应纬度的线图。 4. 在组件中使用 TypeScript 对数据进行类型定义,方便后续开发和维护。 下面是一个简单的示例代码,供您参考: ```vue <template> <div> <el-tabs v-model="activeTab"> <el-tab-pane label="纬度1" name="1"> <echarts :options="chartOptions1"></echarts> </el-tab-pane> <el-tab-pane label="纬度2" name="2"> <echarts :options="chartOptions2"></echarts> </el-tab-pane> <el-tab-pane label="纬度3" name="3"> <echarts :options="chartOptions3"></echarts> </el-tab-pane> </el-tabs> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import * as echarts from 'echarts'; export default defineComponent({ data() { return { activeTab: '1', chartOptions1: {}, chartOptions2: {}, chartOptions3: {}, }; }, mounted() { this.initChart(); }, methods: { initChart() { // 绘制纬度1的线图 this.chartOptions1 = { // echarts配置项 }; // 绘制纬度2的线图 this.chartOptions2 = { // echarts配置项 }; // 绘制纬度3的线图 this.chartOptions3 = { // echarts配置项 }; }, }, }); </script> ``` 需要注意的是,以上示例代码中的 echarts 配置项需要根据您自己的需求进行修改。同,如果您需要从后端获取数据,可以使用 Vue3 的 Composition API 中的 `setup()` 函数,在组件挂载前进行数据请求,并将数据传入到 echarts 配置项中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值