vue3+TS+vite中Echarts的安装与使用

打印 上一主题 下一主题

主题 826|帖子 826|积分 2478

概述

技能栈:Vue3+Ts+Vite+Echarts
简述:图文详解,教你如安在Vue项目中引入Echarts,封装Echarts组件,并实现常用Echats图列

文章目次

一,效果图

二,引入Echarts

        2.1安装Echarts

        2.2main.ts中引入

        2.3Echarts组件封装

三,使用

        3.1柱形图(为例)


文章正文

一效果图

静态效果

动态效果


    2.1安装Echarts

2.1.1 npm
  1. npm i echarts --save
复制代码
2.2.2 pnpm
  1. pnpm i echarts -s
复制代码
2.2main.ts中引入

  1. //引入echarts
  2. import * as echarts from 'echarts'
  3. app.config.globalProperties.$echarts = echarts;
复制代码
2.3Echarts组件封装

在/src/components/echartsComp.vue文件中写入以下代码
  1. <template>
  2.         <div ref="myChartsRef" :style="{ height: height, width: width }" :option="option" />
  3. </template>
  4. <script setup lang="ts">
  5. import { ECharts, EChartsOption, init } from 'echarts';
  6. import { ref, watch, onMounted, onBeforeUnmount } from 'vue';
  7. // 定义props泛型
  8. interface Props {
  9.         width?: string;
  10.         height?: string;
  11.         option: EChartsOption;
  12. }
  13. const props = withDefaults(defineProps<Props>(), {
  14.         width: '100%',
  15.         height: '100%',
  16.         option: () => ({})
  17. });
  18. const myChartsRef = ref<HTMLDivElement>();
  19. let myChart: ECharts;
  20. // eslint-disable-next-line no-undef
  21. let timer: string | number | NodeJS.Timeout | undefined;
  22. // 初始化echarts
  23. const initChart = (): void => {
  24.         if (myChart !== undefined) {
  25.                 myChart.dispose();
  26.         }
  27.         myChart = init(myChartsRef.value as HTMLDivElement);
  28.         // 拿到option配置项,渲染echarts
  29.         myChart?.setOption(props.option, true);
  30. };
  31. // 重新渲染echarts
  32. const resizeChart = (): void => {
  33.         timer = setTimeout(() => {
  34.                 if (myChart) {
  35.                         myChart.resize();
  36.                 }
  37.         }, 50);
  38. };
  39. // 挂载
  40. onMounted(() => {
  41.         initChart();
  42.         window.addEventListener('resize', resizeChart);
  43. });
  44. // 挂载前
  45. onBeforeUnmount(() => {
  46.         window.removeEventListener('resize', resizeChart);
  47.         clearTimeout(timer);
  48.         timer = 0;
  49. });
  50. // 监听器
  51. watch(
  52.         props.option,
  53.         () => {
  54.                 initChart();
  55.         },
  56.         {
  57.                 deep: true
  58.         }
  59. );
  60. </script>
复制代码
三,使用(以柱状图为例)

效果图

1,在需要的组件中引入该封装的组件
2,在需要的位置引入该组件
  1. <template>
  2.   <div class="common-layout">
  3.         <el-main>
  4.           <div :style="{ width: '100%', height: '100%' }">
  5.                 <Echarts :option="option" />
  6.         </div>
  7.         </el-main>
  8.   </div>
  9. </template>
  10. <script setup lang="ts">
  11. //引入ref实现响应式数据
  12. import { reactive ,ref} from 'vue';
  13. // 引入封装好的组件
  14. import Echarts from '../components/echartsComp.vue';
  15. const option =  reactive(
  16.   {
  17.    backgroundColor: '#fff',
  18.    title:{
  19.     text:'数据统计',
  20.     align: 'center',
  21.    },
  22.           grid: {
  23.             containLabel: true,
  24.             bottom: '5%',
  25.             top: '20%',
  26.             left: '5%',
  27.             right: '5%',
  28.           },
  29.           tooltip: {
  30.             trigger: 'axis',
  31.             axisPointer: {
  32.               type: 'shadow',
  33.             },
  34.           },
  35.           legend: {
  36.             top: '10%',
  37.             right: '40%',
  38.             data: ['订单', '销售额'],
  39.             itemWidth: 18,
  40.             itemHeight: 18,
  41.             itemGap: 30,
  42.             textStyle: {
  43.               fontSize: 10,
  44.               color: 'black',
  45.               padding: [0, 0, 0, 10],
  46.             },
  47.           },
  48.           xAxis: {
  49.             // name: "班级",
  50.             triggerEvent: true,
  51.             data: ['2023/05/17', '2023/05/18', '2023/03/19', '2023/05/19', '2023/05/20', '2023/05/21', '2023/05/22'],
  52.             axisLabel: {
  53.                show: true,
  54.               fontSize: 14,
  55.               color: '#C9D2FA',
  56.               rotate: 10, // 设置旋转角度为30度
  57.               align: 'right',
  58.               verticalAlign: 'top',
  59.             },
  60.             axisLine: {
  61.               show: false,
  62.               lineStyle: {
  63.                 show: false,
  64.                 color: '#F3F3F3',
  65.                 width: 2,
  66.               },
  67.             },
  68.             axisTick: {
  69.               show: false,
  70.             },
  71.           },
  72.           yAxis: [
  73.             {
  74.               // name: '单位:万',
  75.               // type: 'value',
  76.               // nameTextStyle: {
  77.               //   color: '#444444',
  78.               // },
  79.               axisLabel: {
  80.                 interval: 0,
  81.                 show: true,
  82.                 fontSize: 18,
  83.                 color: '#C9D2FA',
  84.               },
  85.               axisLine: {
  86.                 show: false,
  87.                 // lineStyle: {
  88.                 //   color: "#F3F3F3",
  89.                 //   width: 2
  90.                 // }
  91.               },
  92.               axisTick: {
  93.                 show: false,
  94.               },
  95.               splitLine: {
  96.                 lineStyle: {
  97.                   type: 'dashed',
  98.                   color: '#3E4A82',
  99.                 },
  100.               },
  101.             },
  102.           ],
  103.           series: [
  104.             {
  105.               name: '订单',
  106.               type: 'bar',
  107.                 align: 'center',
  108.               silent: true,
  109.               itemStyle: {
  110.                 normal: {
  111.                   color: '#2F8FFF',
  112.                 },
  113.               },
  114.               label: {
  115.                 show: true,
  116.                 color: '#2F8FFF',
  117.                 fontSize: 14,
  118.                 position: 'top', // 显示位置,可选值有 'top', 'bottom', 'inside', 'outside'
  119.                 formatter: '{c}', // 标签内容格式器,这里表示显示数据值
  120.               },
  121.               data: [120, 75, 90, 102, 130, 75, 99],
  122.             },
  123.             {
  124.               name: '销售额',
  125.               type: 'bar',
  126.               silent: true,
  127.               itemStyle: {
  128.                 normal: {
  129.                   color: '#47B558',
  130.                 },
  131.               },
  132.               label: {
  133.                 show: true,
  134.                 color: '#47B558',
  135.                 fontSize: 14,
  136.                 position: 'top', // 显示位置,可选值有 'top', 'bottom', 'inside', 'outside'
  137.                 formatter: '{c}', // 标签内容格式器,这里表示显示数据值
  138.               },
  139.               data: [102, 130, 75, 99, 120, 75, 90],
  140.             },
  141.           ],
  142.         }
  143. )
  144. </script>
复制代码































































































































































免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表