Photo by Marek Piwnicki on Unsplash
431 字
2 分钟
基于Vue3的ECharts自动轮播
本文章实现的是ECharts数据自动轮播,其中options为computed计算项,请自行配置。
本文章使用了useECharts hook,请参考基于Vue3的ECharts hook封装。
<script setup lang="ts">import type { ChartCountData } from '@/api/home'import type { EChartsOptions } from '@/plugins/echarts'import { HomeApi } from '@/api/home'
const chartRef = useTemplateRef('chartRef')
// 从接口获取的数据列表缓存const originDataList = ref<ChartCountData[]>([])// echarts显示的数据列表const dataList = ref<ChartCountData[]>([])
// echarts配置,包含dataListconst options = computed<EChartsOptions>(() => ({ ...options}))
// useECharts hookconst { setOption } = useECharts(chartRef, options.value, { defaultInit: false,})// loading状态const loading = ref(false)// 轮播定时器const timeout = ref<NodeJS.Timeout | null>(null)// 轮播步数,用于计算echarts显示的数据列表const step = ref(0)// 图表显示数据数量const chartCount = ref(6)
// 获取数据async function getData() { try { loading.value = true // 从接口获取数据 const { data } = await HomeApi.policeCount({ codeValue: userStore.addressCode, days: durationType.value, }) // 缓存 originDataList.value = data // 重置步数 step.value = 0 await nextTick() // 重置定时器 if (timeout.value) { clearInterval(timeout.value) } // 数据量小于等于图表显示数量时,直接赋值 if (originDataList.value.length <= chartCount.value) { dataList.value = data setOption(options.value) } else { // 数据量大于图表显示数量时,按图表显示数量滑动 dataList.value = originDataList.value.slice(step.value, chartCount.value) setOption(options.value) timeout.value = setInterval(() => { step.value++ // 小于原始数据长度时直接切割 if (step.value + chartCount.value <= originDataList.value?.length) { dataList.value = originDataList.value.slice( step.value, step.value + chartCount.value, ) } else { // 否则补全前面的数据 dataList.value = [ ...originDataList.value.slice(step.value), ...originDataList.value.slice( 0, chartCount.value - (originDataList.value.length - step.value), ), ] if (step.value === originDataList.value.length) { step.value = 0 } } setOption(options.value) }, 3000) } } finally { loading.value = false }}
onMounted(() => { getData()})
onBeforeUnmount(() => { if (timeout.value) { clearInterval(timeout.value) }})</script>
<template> <div class="relative h-238px w-full"> <div ref="chartRef" :class="{ 'op-0': !dataList?.length, }" class="size-full" ></div> <span v-if="!dataList?.length" class="absolute left-1/2 top-1/2 translate--1/2 text-14px" > 暂无数据 </span> </div></template> 基于Vue3的ECharts自动轮播
https://blog.dcwedu.top/posts/frontend/vue3/vue3-echarts-carousel/