饼图渲染报错解决 vue3

父组件请求接口后返回数据,传给子组件进行饼图渲染,因为接口是异步的,所以会导致先初始化了图表但是没数据

 

//父组件<template>
  <div class="main-container">
     <pie :pieData="state.pieData" ></pie>
  </div>
</template>

<script lang="ts" setup>
import { reactive,  onMounted } from "vue"
import pie from "./pie.vue"

const state: any = reactive({
  pieData: [],
})

//父组件请求接口后传值给子组件,注意数据格式value:'', name:'',
async function getPieListFn() {
  const res: any = await API() //使用自己的接口
  state.pieData = res.data.map((item: any) => {
    return {
      name: item.defectName,
      value: item.count
    }
  })

}
onMounted(() => {
  getPieListFn();
});
</script>

子组件

//子组件
<template>
  <div class="chart-container">
    <div style="width: 100%; height: 260px" ref="chartRef" class="chart"></div>
  </div>
</template>

<script lang="ts" setup>
import { ref, onMounted, watch, nextTick, onBeforeMount } from "vue"
import {Ref} from 'vue'
import * as echarts from "echarts"
const props = defineProps({
  pieData: {
    type: Array,
    default: () => []
  }
})
const data = ref<any[]>([])
let charts: any // 1. 最外层定义 echarts dom
const chartRef = ref(null)
function drawLine() {
  const dom = chartRef.value
   if (dom) {
      // 2. 判断 dom 是否为空或未定义
      if (charts != null && charts != "" && charts != undefined) {
        // 3. 已存在则调用 dispose() 方法销毁
        charts.dispose();
      }
    }
   charts = echarts.init(chartRef.value)
  charts.setOption({
    color: ["#5087EC", "#68BBC4", "#58A55C", "#F2BD42", "#EE752F"],
    tooltip: {
      trigger: "item",
    },
    legend: {
      orient: "horizontal",
      left: "center",
      show:false
    },
    series: [
      {
        name: "",
        type: "pie",
        radius: "50%",
        data: data.value,
        label: {
          show: true
        },
        labelLine: {
          show: true
        },
        emphasis: {
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: "rgba(0, 0, 0, 0.5)"
          }
        }
      }
    ]
  })
}
watch(
  () => props.pieData,
  (newValue: any) => {
    data.value = newValue
    if (chartRef.value) {
      nextTick(() => {
        drawLine()
      })
    }
  },
  {
    deep: true,
    immediate: true
  }
)
//调用
onMounted(() => {
//或许这里不用调用nextTick
  nextTick(() => {
    drawLine()
  })
})
defineExpose({
  drawLine
})
</script>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值