vue3中使用echart的两种引入方式,以及需要注意的事项。

27 篇文章 0 订阅
7 篇文章 0 订阅

 创建好vue3项目后安装echarts

终端输入:

npm i echarts --save

安装好后:

1.直接在组件中引用echarts

<script setup>

        import * as echarts from 'echarts'  

</script>

2.全局引入,一般在app.vue

app.vue  (provide 和 inject的使用)

<script setup>

        import * as echarts from 'echarts'  

        provide('echarts',echarts)

</script>

在需要用echarts的组件中用inject获取

<script setup>

        const echarts  = inject('echarts')

</script>

注意!!!vue挂载 、echarts渲染 、数据获取三者的时间顺序

1.先讲vue挂载和echarts渲染

拿挂网的入门例子来说。(vue3 版本)

<script setup>

import * as echarts from 'echarts';

const myCharts = ref(null)

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(mycharts.value);
// 绘制图表
myChart.setOption({
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  xAxis: {
    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  },
  yAxis: {},
  series: [
    {
      name: '销量',
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20]
    }
  ]
});

<script>

开始我是这么写的,开起来好像没有问题。但是你一打开页面就会发现数据没有渲染上去。因为此时vue还没有挂载到dom元素上去,所以获取不到dom元素,数据当然不能渲染。

需要这么写,把获取dom元素和初始化myecharts的动作放到onMounted(()=>{})中

<script setup>

import * as echarts from 'echarts';

onMounted(()=>{

const myCharts = ref(null)

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(mycharts.value);
// 绘制图表
myChart.setOption({
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  xAxis: {
    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  },
  yAxis: {},
  series: [
    {
      name: '销量',
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20]
    }
  ]
});

})

<script>

vue3:你可以通过在生命周期钩子前面加上 “on” 来访问组件的生命周期钩子。

我在<script setup>上加了setup,就等于在setup内部.

下表包含如何在 setup () 内部调用生命周期钩子:

选项式 APIHook inside setup
beforeCreateNot needed*
createdNot needed*
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted
errorCapturedonErrorCaptured
renderTrackedonRenderTracked
renderTriggeredonRenderTriggered
activatedonActivated
deactivatedonDeactivated

TIP

因为 setup 是围绕 beforeCreate 和 created 生命周期钩子运行的,所以不需要显式地定义它们。换句话说,在这些钩子中编写的任何代码都应该直接在 setup 函数中编写。

这些函数接受一个回调函数,当钩子被组件调用时将会被执行:

// MyBook.vue

export default {
  setup() {
    // mounted
    onMounted(() => {
      console.log('Component is mounted!')
    })
  }
}

2.echarts渲染和数据获取

通过axios获取数据然后通过echarts渲染到页面

如果是用的异步请求就要非常注意了!

简单介绍一下异步请求:异步请求在执行过程中是不会影响后面程序执行的,好比如在主线程开辟了一个子线程。

如过异步获取数据,还在获取中,echart已经把dom元素渲染了,但是i请求的数据还没返回回来,此时渲染的就是空数据。

所以用异步请求,可以把echart渲染和初始化放到axios.then()里面,这样就不会出现渲染空数据了。

如下面:

<script setup>

import api from '@/api/index'

var keydata = []

var valuedata = []

const resdata = []

const wordsChartsBox = ref(null)

const echarts = inject('echarts')

function getf() {

    api.get('/backstage').then(res => {

        for (const key in res.data) {

            var element = res.data[key]

            if (key == 1) {

                keydata = element

            } else {

                valuedata = element

            }

        }

        for (let index = 0; index < keydata.length; index++) {

            resdata.push(

                {

                    value: parseInt(valuedata[index]),

                    name: keydata[index]

                }

            )

        }

        const wordsChartsOption = {

            title: {

                text: '常用词统计',

                subtext: '通过常用词统计分析盲人需求',

                left: 'center'

            },

            tooltip: {

                trigger: 'item',

                formatter: '{a} <br/>{b} : {c} ({d}%)'

            },

            legend: {

                type: 'scroll',

                orient: 'vertical',

                right: 10,

                top: 20,

                bottom: 20,

                data: keydata

            },

            series: [

                {

                    name: '姓名',

                    type: 'pie',

                    radius: '55%',

                    center: ['40%', '50%'],

                    data: resdata,

                    emphasis: {

                        itemStyle: {

                            shadowBlur: 10,

                            shadowOffsetX: 0,

                            shadowColor: 'rgba(0, 0, 0, 0.5)'

                        }

                    }

                }

            ]

        }

        const wordsCharts = echarts.init(wordsChartsBox.value)

        wordsCharts.setOption(wordsChartsOption)

    })

    console.log(resdata)

}

onMounted(() => {

    getf()

})

</script>

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoBug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值