vue中echart的tooltip自定义显示内容

vue中echart的tooltip自定义

目的:让tooltip显示自定义格式数据,甚至是显示横纵坐标以外的数据。

1.先介绍一下常用情况
option:{
          title: {
            text: '温度信号对比图'
          },
          tooltip: {
            trigger: 'axis'
          },
          legend: {
            data:['室内温度','信号质量'],
            textStyle:{
              fontSize:18
            }
          },
          color: ['#54a0ff','#c23531'],
          grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
          },
          toolbox: {
            itemSize:22,
            feature: {
              saveAsImage: {}
            }
          },
          xAxis: {
            type: 'category',
            boundaryGap: false,
            data: []
          },
          yAxis: {
            max: function(value){
              return Math.round(1.1*value.max)
            },
            min:function(value){
              return Math.round(0.9*value.min)
            },
            type: 'value'
          },
          series: [
            {
              name:'室内温度',
              type:'line',
              smooth:0.5,
              data:[]
            },
            {
              name:'信号质量',
              type:'line',
              smooth:0.5,
              data:[]
            }
          ]
        },

tooltip的trigger有三种选项“item”“axis”“none”,选择axis就是显示横坐标的内容。

这样设置,鼠标滑过对应点时,tooltip就会显示横坐标内容和对应纵坐标的温度和信号。

2.若要对显示内容进行数据处理

例如:增加单位、增加说明等。

需要在tooltip中加入formatter属性。 formatter支持字符串模板和回调函数两种形式。

字符串模板格式例如:

formatter: '{b0}: {c0}<br />{b1}: {c1}'//字符串模板含义见官网https://www.isqqw.com/echarts-doc/zh/option.html#tooltip.formatter

回调函数格式例如:

formatter:function(params){
    return 
    '房间号:'+params[0].name+'<br/>'+
    '温度:'+params[0].data+'℃'+'<br/>'+
    '信号:'+params[1].data+'<br/>';
}

具体信息可通过console.log(params)查看。

3.若要显示横纵坐标以外的数据

例如横坐标是房间号,纵坐标是温度和信号,还要在

tooltip中显示对应数据的时间点。

首先需要对series的数据结构处理:

series: [
            {
              name:'室内温度',
              type:'line',
              smooth:0.5,
              data:[
                {
                  value:0,
                  time:0
                }
              ]
            },
            {
              name:'信号质量',
              type:'line',
              smooth:0.5,
              data:[]
            }
          ]

在温度data中增加value和time,value用于显示温度数值。

然后在数据处理时,将温度和时间一并放入:

parseData(){
        this.option.xAxis.data=this.dataList.map(item=>item.roomNum)
        this.option.series[0].data = this.dataList.map(item => ({ value: item.temp, time: item.timestamp }));
        this.option.series[1].data=this.dataList.map(item=>item.signalQuality)
      },

注意:不能写成:

parseData(){
        this.option.xAxis.data=this.dataList.map(item=>item.roomNum)
        this.option.xAxis.data.value=this.dataList.map(item=>item.temp)
        this.option.xAxis.data.time=this.dataList.map(item=>item.timestamp)
        this.option.series[1].data=this.dataList.map(item=>item.signalQuality)
      },

在第二行中,将 this.dataList 中的 temp 属性映射到 this.option.series[0].data 中的 value 属性。但是,在第三行中,又将 this.dataList 中的 timestamp 属性映射到 this.option.series[0].data 中的 time 属性。这意味着将覆盖 value 属性,而不是将 time 属性添加到 data 数组中。

然后在formatter中这样设置:

tooltip: {
            trigger: 'axis',
            formatter:function(params){
						  return '房间号:'+params[0].name+'<br/>'+
              '温度:'+params[0].data.value+'℃'+'<br/>'+
              '信号:'+params[1].data+'<br/>'+
              '时间:'+params[0].data.time;
            }
          },

就能显示横坐标信息、纵坐标信息、以及对应时间了。

4.bug查询与代码优化

以上代码在只选择一条曲线,鼠标滑动到tooltip上时会报错。经查找发现是因为在选中一条曲线时formatter的params中只有params[0]没有params[1]。所以代码做了以下优化:

formatter: function(params) {
    let message = `房间号:${params[0].name}<br/>`;
    for (let i = 0; i < params.length; i++) {
        message += `${params[i].seriesName}:${params[i].data.value}<br/>`;
    }
    message += `时间:${params[0].data.time}`;
    return message;
}

同时,为保证在只选择信号页面时也有时间所以在series数据结构和数据处理方法中也做了改变

series: [
    {
        name:'室内温度',
        type:'line',
        smooth:0.5,
        data:[
            {
                value:0,
                time:0
            }
        ]
    },
    {
        name:'信号质量',
        type:'line',
        smooth:0.5,
        data:[
            {
                value:0,
                time:0
            }
        ]
    }
]

//处理返回的数据
      parseData(){
        this.option.xAxis.data=this.dataList.map(item=>item.roomNum)
        this.option.series[0].data = this.dataList.map(item => ({ value: item.temp, time: item.timestamp }));
        this.option.series[1].data = this.dataList.map(item => ({ value: item.signalQuality, time: item.timestamp }));
      },

这次就没有什么问题了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用Echarts进行前后端数据交互,可以通过以下步骤实现: 1.在Vue项目安装Echarts ```shell npm install echarts --save ``` 2.在Vue组件引入Echarts ```javascript import echarts from 'echarts' ``` 3.在Vue组件创建一个Echarts实例 ```javascript mounted() { // 基于准备好的dom,初始化echarts实例 let myChart = echarts.init(document.getElementById('myChart')) // 指定图表的配置项和数据 let option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] } // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option) } ``` 4.在Vue组件使用axios获取后端数据 ```javascript import axios from 'axios' export default { data() { return { chartData: [] } }, mounted() { axios.get('/api/chartData') .then(res => { this.chartData = res.data this.renderChart() }) .catch(err => { console.log(err) }) }, methods: { renderChart() { let myChart = echarts.init(document.getElementById('myChart')) let option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: this.chartData.categories }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: this.chartData.data }] } myChart.setOption(option) } } } ``` 5.在后端使用koa2编写接口,返回数据给前端 ```javascript const Koa = require('koa') const Router = require('koa-router') const app = new Koa() const router = new Router() router.get('/api/chartData', async (ctx, next) => { const chartData = { categories: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'], data: [5, 20, 36, 10, 10, 20] } ctx.body = chartData }) app.use(router.routes()).use(router.allowedMethods()) app.listen(3000, () => { console.log('server is running at http://localhost:3000') }) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值