echart的tooltip轮播显示(tooltip-auto-show-vue)

该代码实现了一个用于Echarts图表的功能,循环展示tooltip信息。它接受配置选项,包括间隔时间、是否循环系列等,并能处理不同类型的图表(如地图、饼图、雷达图)。当鼠标移入图表时,会暂停自动轮播,移出后恢复。此外,还提供了清除循环的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

export default function loopShowTooltip(chart, chartOption, options) {
const defaultOptions = {
interval: 3000,
loopSeries: false,
seriesIndex: 0,
updateData: null,
}

if (!chart || !chartOption) {
    return {}
}

let dataIndex = 0 // 数据索引,初始化为-1,是为了判断是否是第一次执行
let seriesIndex = 0 // 系列索引
let timeTicket: any = 0
const seriesLen = chartOption.series.length // 系列个数
let dataLen = 0 // 某个系列数据个数
let chartType // 系列类型
let first = true

// 不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
// 循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
// 要不要添加开始series索引和开始的data索引?

if (options) {
    options.interval = options.interval || defaultOptions.interval
    options.loopSeries = options.loopSeries || defaultOptions.loopSeries
    options.seriesIndex = options.seriesIndex || defaultOptions.seriesIndex
    options.updateData = options.updateData || defaultOptions.updateData
} else {
    options = defaultOptions
}

// 如果设置的seriesIndex无效,则默认为0
if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
    seriesIndex = 0
} else {
    seriesIndex = options.seriesIndex
}

function autoShowTip() {
    function isZero (series, i) {
        let bol = true
        series.forEach(item => {
            if (Number(item.data[i]) !== 0) bol = false
        })
        return bol
    }
    function showTip() {
        // 判断是否更新数据
        if (dataIndex === 0 && !first && typeof options.updateData === 'function') {
            options.updateData()
            chart.setOption(chartOption)
        }

        const series = chartOption.series
        chartType = series[seriesIndex].type // 系列类型
        dataLen = series[seriesIndex].data.length // 某个系列的数据个数

        const tipParams: any = { seriesIndex: seriesIndex }
        switch (chartType) {
            case 'map':
            case 'pie':
            case 'chord':
                tipParams.name = series[seriesIndex].data[dataIndex].name
                break
            case 'radar': // 雷达图
                tipParams.seriesIndex = seriesIndex
                tipParams.dataIndex = dataIndex
                break
            default:
                tipParams.dataIndex = dataIndex
                break
        }

        if (chartType === 'pie' || chartType === 'radar') {
            // 取消之前高亮的图形
            chart.dispatchAction({
                type: 'downplay',
                seriesIndex: options.loopSeries
                    ? seriesIndex === 0
                        ? seriesLen - 1
                        : seriesIndex - 1
                    : seriesIndex,
                dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1,
            })

            // 高亮当前图形
            chart.dispatchAction({
                type: 'highlight',
                seriesIndex: seriesIndex,
                dataIndex: dataIndex,
            })
        }

        // 显示 tooltip
        tipParams.type = 'showTip'
        chart.dispatchAction(tipParams)
        
        // 数据为0的跳过
        if (isZero(series, dataIndex)) {
            if (dataIndex + 1 >= dataLen) {
                dataIndex = 0
            } else {
                dataIndex = dataIndex + 1
            }
            showTip()
            
            return
        }

        dataIndex = (dataIndex + 1) % dataLen
        if (options.loopSeries && dataIndex === 0 && !first) {
            // 数据索引归0表示当前系列数据已经循环完
            seriesIndex = (seriesIndex + 1) % seriesLen
        }

        first = false
    }

    // showTip()
    timeTicket = setInterval(showTip, options.interval)
}

// 关闭轮播
function stopAutoShow() {
    if (timeTicket) {
        clearInterval(timeTicket)
        timeTicket = 0

        if (chartType === 'pie' || chartType === 'radar') {
            // 取消高亮的图形
            chart.dispatchAction({
                type: 'downplay',
                seriesIndex: options.loopSeries
                    ? seriesIndex === 0
                        ? seriesLen - 1
                        : seriesIndex - 1
                    : seriesIndex,
                dataIndex: dataIndex === 0 ? dataLen - 1 : dataIndex - 1,
            })
        }
    }
}

const zRender = chart.getZr()

function zRenderMouseMove(param) {
    if (param.event) {
        // 阻止canvas上的鼠标移动事件冒泡
        param.event.cancelBubble = true
    }

    stopAutoShow()
}

// 离开echarts图时恢复自动轮播
function zRenderGlobalOut() {
    if (!timeTicket) {
        autoShowTip()
    }
}

// 鼠标在echarts图上时停止轮播
chart.on('mousemove', stopAutoShow)
zRender.on('mousemove', zRenderMouseMove)
zRender.on('globalout', zRenderGlobalOut)

autoShowTip()

return {
    clearLoop: function () {
        if (timeTicket) {
            clearInterval(timeTicket)
            timeTicket = 0
        }

        chart.off('mousemove', stopAutoShow)
        zRender.off('mousemove', zRenderMouseMove)
        zRender.off('globalout', zRenderGlobalOut)
    },
}

}

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值