下面是封装的自动轮播方法,可根据需求自行修改,该方法可实现如下图中(包含但不限于)echarts图形的自动轮播,并实现鼠标进入停止轮播,鼠标移出从鼠标离开位置继续轮播功能
import { ECharts } from "echarts";
import _ from "lodash";
/**
* 用于echarts图表轮播
* @param {ECharts} chart - 指定chart
* @param {any} timers - 管理定、延时器集合
* @param {string} timer - 定时器名称
* @param {string} timeOut - 延时器名称
* @param {number} length - 轮播数据的长度
* @param {number} index - 从第几个数据开始轮播(默认第0项)
* @param {number} interval - 轮询间隔(默认两秒)
*/
export const autoTip = (chart: ECharts, timers: any, timer: string, timeOut: string, length: number, index = 0, interval = 2000) => {
// 保存所有轮播item下标的数组
const itemIndexList = Array(length).fill(undefined).map((v, i) => i);
// 如果index过大,超过最大index,则归零
index = index >= length ? 0 : index;
/**
* 用于首次渲染或hover后重置toolTip
* @param {number} showIndex - 激活项下标
*/
const resetTip = (showIndex: number) => {
chart.dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: itemIndexList
});
chart.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: showIndex
});
chart.dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: showIndex
});
};
resetTip(index); // 激活index项,首次默认第一项
// 设表先关,防止多次设置
timers[timer] && clearInterval(timers[timer]);
// 轮播定时器
timers[timer] = setInterval(() => {
chart.dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: index
});
index = index >= length - 1 ? 0 : ++index;
chart.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: index
});
chart.dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: index
});
}, interval);
// 鼠标移动停止轮播,接下来从最后停留位置继续轮播
chart.on("mouseover", _.throttle((e: any) => {
timers[timer] && clearInterval(timers[timer]);
const dataIndex = e.dataIndex;
resetTip(dataIndex); // 激活鼠标停留项
timers[timeOut] && clearTimeout(timers[timeOut]);
timers[timeOut] = setTimeout(() => {
autoTip(chart, timers, timer, timeOut, length, dataIndex + 1, interval);
}, interval);
}, 200));
};
使用时
// 轮询用的定时器
public timers: any = {
autoReportTimer: {},
reportTimeOut: {},
};
autoTip(chart, this.timers, 'autoReportTimer', 'reportTimeOut', length);