echart数据渲染问题常见图例样式修改

在这里插入图片描述

我们项目wrj有关的项目数据要求做到实时获取。包括红圈住的echart图标数据,还有就是民用及警用tab切换时候数据也需要刷新


问题描述

例如:我先前以为是我的切换没有调用echart图标数据的接口,一路log接口是调了,但是数据还是刷新手动浏览器刷新才正常。最后发现页面首次加载时候,数据根本就没更新最新接口数据,还取得是data里面的数据。


原因分析

我猜想的原因是,因为echart图标已经在和dom渲染时候一起渲染了,数据自然就取得data里面的数据。就算接口返回option的数据替换,他也不会自动渲染图表中。


解决方案

数据自动刷新,必然需要一个监听机制告诉Echarts重新设置数据

    computed:{
    option(){
      let data = this.dataList;
      return {
        intervalId:null,
        legend: {
          // selectedMode: false, //取消图例上的点击事件
          top: 0,
          right: -5,
          orient: 'vertical',
          height:'84px',//图例组件高度
          textStyle:{
            color:'#fff',
          },
          itemHeight: 12,
          itemWidth: 12,//图例标记图形高度
          itemGap:8,//图例每项之间间隔
          myChart:null,
          data: [
           {
                name:'任务中',
                // icon:`image://${imgUrl}`,//格式'image://+icon文件地址',其中image::后的//不能省略
                icon:`image://${require('@/assets/img/echart/rwing.png')}` //格式'image://+icon文件地址',其中image::后的//不能省略
            },
            {
                name:'已完成',
                icon:`image://${require('@/assets/img/echart/rwed.png')}`
            },
            {
                name:'未开始',
                icon:`image://${require('@/assets/img/echart/rwwks.png')}`
            },
            {
                name:'任务异常',
                icon:`image://${require('@/assets/img/echart/rwyc.png')}`
            }
          ],
          formatter: function (name) {
            let str;
            for (let i=0;i<data.length;i++){
              if (data[i].name==name){
                str = name + ' ' + data[i].value
              }
            }
            return str
          }
        },
        series: [
          {
            name: 'Access From',
            type: 'pie',
            center:['35%','50%'],
            radius: ['60%', '90%'],
            avoidLabelOverlap: false,
            hoverAnimation: false,
            label: {
              show: false,
              position: 'center'
            },
            labelLine: {
              show: false
            },
            data: this.dataList
          }
        ]
      }
    }
  },

data中定义初始的值

  data() {
    return {
      dataList:[
        { value: 0, name: '未开始' },
        { value: 0, name: '已完成' },
        { value: 0, name: '任务中' },
        { value: 0, name: '任务异常' },
      ],
    };
  },

渲染是在切换tab时候渲染echart,watch监控tab项渲染

  watch:{
    titleValue(val){
      if (val=='2'){
        setTimeout(()=>{
          this.initEchart()
        },100)
      }
    },
    //观察option的变化
    option: {
    //**解决不渲染的重点**
      handler(newVal, oldVal) {
        //数据自动刷新,必然需要一个监听机制告诉Echarts重新设置数据
        if (this.myChart) {
          if (newVal) {
            this.myChart.setOption(newVal);
          } else {
            this.myChart.setOption(oldVal);
          }
        } else {
          this.initEchart();
        }
      },
      deep: true //对象内部属性监听关键}
  },

methodshtml

//html
 <div class="t3" id="t3"></div>
 
 methods: {
 //初始化图表
    initEchart(){
      this.myChart = this.$echarts.init(document.getElementById('t3'));
      this.myChart.setOption(this.option);
    },
}

关于echart的option的补充说明
① legend图标替换如下面的data定义的,可以用’image://url’ ,引入外部图标
图例之间间距宽度可以调整

itemWidth: 12,//图例标记图形高度
 itemGap:8,//图例每项之间间隔

②图例的字体颜色,一般都是如下

 legend: {
      textStyle:{
        color:'#fff',
      },
    },

这样设置就是图例的字体整体颜色我们有个需求就是,图例名称统一颜色,但是图例数据需要多种颜色配置
lengend通过formmatter函数配合textStyle中的属性rich文本格式化处理样式或者内容

 legend: {
  textStyle:{
      color:'#fff',
       rich: {
         rwing: {
            color: '#3ADCAB',
          },
          rwed: {
            color: '#1DD6FF',
          },
          rwwks: {
            color: '#FFAD32',
          },
          rwyc: {
            color: '#EC7C83',
          },
        }
    },
 },
 formatter: function (name,id) {
     let str,temp;
     for (let i=0;i<data.length;i++){
       if (data[i].name==name){
         // str = name + ' ' + data[i].value
         str=data[i].value
       }
     }
     // return str
     if (name=='任务中') {
       temp="{name|" +name +"} {rwing|"+str+"}"
     }else if(name=='已完成'){
       temp="{name|" +name +"} {rwed|"+str+"}"
     }else if(name=='未开始'){
       temp="{name|" +name +"} {rwwks|"+str+"}"
     }else if(name=='任务异常'){
       temp="{name|" +name +"} {rwyc|"+str+"}"
     }
     return temp
   }

设置完之后的页面就如一一一对
在这里插入图片描述
option完整代码

 option(){
      let data = this.dataList;
      return {
        legend: {
          // selectedMode: false, //取消图例上的点击事件
          top: 0,
          right: -5,
          orient: 'vertical',
          height:'84px',//图例组件的高度
          textStyle:{
            color:'#fff',
            rich: {
              rwing: {
                color: '#3ADCAB',
              },
              rwed: {
                color: '#1DD6FF',
              },
              rwwks: {
                color: '#FFAD32',
              },
              rwyc: {
                color: '#EC7C83',
              },
            }
          },
          itemHeight: 12,
          itemWidth: 12,//图例标记的图形高度(可根据icon的大小设置)
          itemGap:8,//图例每项之间的间隔
          myChart:null,
          data: [
            {
                name:'任务中',
                // icon:`image://${imgUrl}`,//格式'image://+icon文件地址',其中image::后的//不能省略
                icon:`image://${require('@/assets/img/echart/rwing.png')}` //格式为'image://+icon文件地址',其中image::后的//不能省略
            },
            {
                name:'已完成',
                icon:`image://${require('@/assets/img/echart/rwed.png')}`
            },
            {
                name:'未开始',
                icon:`image://${require('@/assets/img/echart/rwwks.png')}`
            },
            {
                name:'任务异常',
                icon:`image://${require('@/assets/img/echart/rwyc.png')}`
            }
          ],
          formatter: function (name,id) {
            let str,temp;
            for (let i=0;i<data.length;i++){
              if (data[i].name==name){
                // str = name + ' ' + data[i].value
                str=data[i].value
              }
            }
            // return str
            if (name=='任务中') {
              temp="{name|" +name +"} {rwing|"+str+"}"
            }else if(name=='已完成'){
              temp="{name|" +name +"} {rwed|"+str+"}"
            }else if(name=='未开始'){
              temp="{name|" +name +"} {rwwks|"+str+"}"
            }else if(name=='任务异常'){
              temp="{name|" +name +"} {rwyc|"+str+"}"
            }
            return temp
          }
        },
        series: [
          {
            name: 'Access From',
            type: 'pie',
            center:['35%','50%'],
            radius: ['60%', '90%'],
            avoidLabelOverlap: false,
            hoverAnimation: false,
            label: {
              show: false,
              position: 'center'
            },
            labelLine: {
              show: false
            },
            data: this.dataList,
            color:  ['#FFAD32', '#1DD6FF','#3ADCAB','#EC7C83',],
          }
        ]
      }
    }

对于图例字体颜色设置还有一种方式就是假如图例有一项是固定的,如下图
在这里插入图片描述
这样的就可以,在lengend配置data属性,data里面定义各图例的文本,以及该文本对应样式

原文地址:https://blog.csdn.net/Coco_998/article/details/128183452

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43864.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注