跳到主要内容

echarts库:series的select态和normal态的转换和交互操作

问题场景

场景:现在有一张图,图里有多个series,并且每个series中有若干个数据节点,现在需要添加一种交互:点击某个series中的某一个数据节点,需要将这个series中的所有节点全部置为选中态,其他所有series的所有数据节点全部置为normal态

解决方案

配置项设置

//所有series的option设置
{
series: [
{..., selectedMode: 'series', select: {'选中态的样式'}}
{..., selectedMode: 'series', select: {'选中态的样式'}}
{..., selectedMode: 'series', select: {'选中态的样式'}}
...
]
}

事件绑定

    // 当全局的选中的series增加时,将其余的series取消选中
chart.on('selectchanged', {seriesType: 'dvLine'}, function (e) {
const { selected, fromActionPayload } = e;

if (fromActionPayload.type === 'select' && Array.isArray(selected)) {
console.log('select', e);

selected.forEach((item) => {
const seriesModel = chart.getModel().getSeriesByIndex(item.seriesIndex);
console.log('isSelected', item.seriesIndex, seriesModel.isSelected(0), seriesModel.option.selectedMap, seriesModel.getSelectedDataIndices());

if (item.seriesIndex === fromActionPayload.seriesIndex) {
return;
}
chart.dispatchAction({
type: 'unselect',
seriesIndex: item.seriesIndex,
dataIndex: item.dataIndex[0]
})
})
}
});

原因

选中态切换这样的常见的涉及到元素状态转移的、常见的交互,在echarts源码内部被默认绑定了,但是状态切换的模式在series.selectedMode配置项上暴露出来,用于单选地、或多选地、或以series为单位地切换元素的状态,内部在注册选中交互触发选中交互两部分的逻辑代码分布在3个文件中,echarts.tsutil/states.tsmodel/series.ts,具体可以全局搜索unselect,快速定位到相关代码。