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

概述

技术栈: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

npm i echarts --save

2.2.2 pnpm

pnpm i echarts -s

2.2main.ts中引入

//引入echarts
import * as echarts from 'echarts'
app.config.globalProperties.$echarts = echarts;

2.3Echarts组件封装

在/src/components/echartsComp.vue文件中写入以下代码

<template>
	<div ref="myChartsRef" :style="{ height: height, width: width }" :option="option" />
</template>

<script setup lang="ts">
import { ECharts, EChartsOption, init } from 'echarts';
import { ref, watch, onMounted, onBeforeUnmount } from 'vue';

// 定义props泛型
interface Props {
	width?: string;
	height?: string;
	option: EChartsOption;
}
const props = withDefaults(defineProps<Props>(), {
	width: '100%',
	height: '100%',
	option: () => ({})
});

const myChartsRef = ref<HTMLDivElement>();
let myChart: ECharts;
// eslint-disable-next-line no-undef
let timer: string | number | NodeJS.Timeout | undefined;

// 初始化echarts
const initChart = (): void => {
	if (myChart !== undefined) {
		myChart.dispose();
	}
	myChart = init(myChartsRef.value as HTMLDivElement);
	// 拿到option配置项,渲染echarts
	myChart?.setOption(props.option, true);
};

// 重新渲染echarts
const resizeChart = (): void => {
	timer = setTimeout(() => {
		if (myChart) {
			myChart.resize();
		}
	}, 50);
};
// 挂载
onMounted(() => {
	initChart();
	window.addEventListener('resize', resizeChart);
});
// 挂载前
onBeforeUnmount(() => {
	window.removeEventListener('resize', resizeChart);
	clearTimeout(timer);
	timer = 0;
});

// 监听器
watch(
	props.option,
	() => {
		initChart();
	},
	{
		deep: true
	}
);
</script>

三,使用(以柱状图为例)

效果图

1,在需要的组件中引入该封装的组件

2,在需要的位置引入该组件

<template>
  <div class="common-layout">
        <el-main>
          <div :style="{ width: '100%', height: '100%' }">
		<Echarts :option="option" />
	</div>
        </el-main>
  </div>
</template>

<script setup lang="ts">
//引入ref实现响应式数据
import { reactive ,ref} from 'vue';
// 引入封装好的组件
import Echarts from '../components/echartsComp.vue';



const option =  reactive(
  {
   backgroundColor: '#fff',
   title:{
    text:'数据统计',
    align: 'center',
   },
          grid: {
            containLabel: true,
            bottom: '5%',
            top: '20%',
            left: '5%',
            right: '5%',
          },
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow',
            },
          },
          legend: {
            top: '10%',
            right: '40%',
            data: ['订单', '销售额'],
            itemWidth: 18,
            itemHeight: 18,
            itemGap: 30,
            textStyle: {
              fontSize: 10,
              color: 'black',
              padding: [0, 0, 0, 10],
            },
          },
          xAxis: {
            // name: "班级",
            triggerEvent: true,
            data: ['2023/05/17', '2023/05/18', '2023/03/19', '2023/05/19', '2023/05/20', '2023/05/21', '2023/05/22'],
            axisLabel: {
               show: true,
              fontSize: 14,
              color: '#C9D2FA',
              rotate: 10, // 设置旋转角度为30度
              align: 'right', 
              verticalAlign: 'top',
            },
            axisLine: {
              show: false,
              lineStyle: {
                show: false,
                color: '#F3F3F3',
                width: 2,
              },
            },

            axisTick: {
              show: false,
            },
          },
          yAxis: [
            {
              // name: '单位:万',
              // type: 'value',
              // nameTextStyle: {
              //   color: '#444444',
              // },
              axisLabel: {
                interval: 0,
                show: true,
                fontSize: 18,
                color: '#C9D2FA',
              },
              axisLine: {
                show: false,
                // lineStyle: {
                //   color: "#F3F3F3",
                //   width: 2
                // }
              },
              axisTick: {
                show: false,
              },
              splitLine: {
                lineStyle: {
                  type: 'dashed',
                  color: '#3E4A82',
                },
              },
            },
          ],
          series: [
            {
              name: '订单',
              type: 'bar',
                align: 'center',
              silent: true,
              itemStyle: {
                normal: {
                  color: '#2F8FFF',
                },
              },
              label: {
                show: true,
                color: '#2F8FFF',
                fontSize: 14,
                position: 'top', // 显示位置,可选值有 'top', 'bottom', 'inside', 'outside'
                formatter: '{c}', // 标签内容格式器,这里表示显示数据值
              },
              data: [120, 75, 90, 102, 130, 75, 99],
            },
            {
              name: '销售额',
              type: 'bar',
              silent: true,
              itemStyle: {
                normal: {
                  color: '#47B558',
                },
              },
              label: {
                show: true,
                color: '#47B558',
                fontSize: 14,
                position: 'top', // 显示位置,可选值有 'top', 'bottom', 'inside', 'outside'
                formatter: '{c}', // 标签内容格式器,这里表示显示数据值
              },
              data: [102, 130, 75, 99, 120, 75, 90],
            },
          ],
        }

)
</script>
相关推荐
勉灬之1 小时前
封装上传组件,提供各种校验、显示预览、排序等功能
开发语言·前端·javascript
outstanding木槿3 小时前
react中实现拖拽排序
前端·javascript·react.js
ordinary903 小时前
vue.js scoped样式冲突
前端·vue.js
我要学编程(ಥ_ಥ)4 小时前
速通前端篇——JavaScript
开发语言·前端·javascript
大强的博客4 小时前
《Vue3实战教程》19:Vue3组件 v-model
前端·javascript·vue.js
塔塔开!.5 小时前
element ui 组件 时间选择器出现转换问题的解决办法
前端·javascript·vue.js
大叔_爱编程6 小时前
wx015基于springboot+vue+uniapp的经济新闻资讯的设计与实现
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
Amo 67296 小时前
axios 实现进度监控
开发语言·前端·javascript
qq_419854058 小时前
js vue animation 数字动画
前端·javascript·vue.js
浪遏9 小时前
我知微风意 🤡| Vue.js手搓天气组件
前端·javascript·vue.js