vue3封装一个echarts轮播动画hooks,记录一下
export const useChartAnimation = (vChartRef: typeof VChart, option: any) => {
let isLoad = true; // 动画是否开启
let index = -1;
let timer = -1;
// 鼠标移入关闭动画
const handleAni = (chart: typeof VChart) => {
chart.chart.on('mouseover', (param: any) => {
isLoad = false;
clearInterval(timer);
//取消之前高亮图形
chart.dispatchAction({
type: 'downplay',
seriesIndex: 0,
dataIndex: index,
});
index = param.dataIndex;
//高亮当前图形
chart.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex: param.dataIndex,
});
//显示tooltip
chart.dispatchAction({
type: 'showTip',
seriesIndex: 0,
dataIndex: param.dataIndex,
});
});
};
// 自动高亮
const autoAni = (chart: typeof VChart) => {
let dataLen = computed(() => {
return option.value.dataset.source.length;
});
// 取消之前高亮的图形
chart?.dispatchAction({
type: 'downplay',
seriesIndex: 0,
dataIndex: index,
});
index = (index + 1) % dataLen.value;
// 高亮当前图形
chart.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex: index,
});
// 显示 tooltip
chart.dispatchAction({
type: 'showTip',
seriesIndex: 0,
dataIndex: index,
});
};
// 鼠标移出打开动画
const removeAni = (chart: typeof VChart) => {
chart.chart.on('mouseout', () => {
if (!isLoad) {
timer = setInterval(() => {
autoAni(chart);
}, 2000);
isLoad = true;
}
});
};
// 初始化
const initEchart = (chart: typeof VChart) => {
if (!isPreview()) return;
handleAni(chart);
removeAni(chart);
timer = setInterval(() => {
autoAni(chart);
}, 2000);
};
// 组件卸载清除定时器和事件
const dispose = (chart: typeof VChart) => {
chart.chart.off('mouseout');
chart.chart.off('mouseover');
clearInterval(timer);
};
onMounted(() => {
if (vChartRef.value) initEchart(vChartRef.value);
});
onBeforeMount(() => {
if (vChartRef.value) dispose(vChartRef.value);
});
};