echarts 饼图移动端_vue-echarts移动端踩坑记录

本文介绍了在Vue项目中使用vue-echarts实现折线图和饼图的过程,包括按需加载echarts组件、配置图表样式以及处理移动端的特殊问题。在移动端,作者遇到事件处理、interval设置和API适应性的问题,并分享了解决方案。
摘要由CSDN通过智能技术生成

最近手头一个项目需要做两个图,一个是折线图,一个饼图。由于是基于Vue的项目,第一时间就想到用vue-echarts来实现。vue-echarts本质上也是使用了echarts.js,只是包装成vue组件。

1、安装vue-echarts包

npm install vue-echarts

2、折线图代码

template:

js:

import ECharts from 'vue-echarts/components/ECharts.vue'; //引用vue-echarts

import "echarts/lib/component/tooltip"; //按需加载相关的包

import "echarts/lib/chart/pie";

import "echarts/lib/chart/line";

export default {

trendChart: {

grid: {

left: '10%',

top: 52,

},

tooltip: {

trigger: 'axis',

showContent: true,

position:function(p){

return [p[0] + 10000000000, 0]; //不需要显示弹层信息

},

formatter: (parmes)=>{ //选择折线图上的坐标可以获得相关值

let value1 = parmes[0];

let value2 = parmes[1];

//拿到值后,需要在哪显示可以在这操作

}

},

textStyle: {

color: "#999",

},

label:{

fontSize: 44,

},

xAxis: {

type: 'category', //类目的行式,原样展示

boundaryGap: false, //两边留白策略

offset: 3,

axisLine:{

show:false, //是否显示坐标轴轴线,默认显示

},

axisTick:{

show: false, //是否显示坐标轴刻度

},

axisLabel: {

interval: 10000, //默认1,表示【隔一个标签显示一个标签】

showMinLabel: true, //x轴只需要展示最小的和最大的值

showMaxLabel: true,

fontSize: 20,

//padding: [10, 0, 0, 0], 这里可以设置坐标轴的标签的padding值

},

data: [],

},

yAxis: {

type: 'value',

boundaryGap: false,

axisLine:{

show:false,

},

axisLabel:{

fontSize: 22,

formatter: '{value}%' //格式化标签值

},

axisTick:{

show: false,

},

lineStyle: {

//网络线设置(只作用于非类目铀)

show: true,

color: "#f5f5f5",

width: 1,

type: "solid"

},

splitNumber: 5, //Y轴分格为几段

min: value => {

return value.min - 1; //最小显示的值

},

max: null, //最大显示的值

interval: 2 //间隔

},

series: [{

name: '本组合',

type: 'line',

silent: false,

showSymbol: false, //不显示折线上的数据点,只在hover的时候显示

smooth: false, //0-1之间,true时为曲线,flase为折线,线弯曲度

color: '#e2b256',

lineStyle:{

width: 3, //线条宽度

},

data: []

},{

name: '上证指数',

type: 'line',

silent: false,

showSymbol: false, //不显示折线上的数据点,只在hover的时候显示

smooth: false, //0-1之间,true时为曲线,flase为折线,线弯曲度

color: '#5eb8e2',

data: []

}]

},

},

methods: {

//计算Y铀min,max,interval三个值,保证Y铀能够均等

computeYaxis(data) {

let allValues = [];

for (let k of data) {

for (let v of Object.values(k)) {

if (Number(v)) {

allValues.push(v);

}

}

}

//拿到数据当中的最小值

const min = Number.parseFloat(Math.min(...new Set(allValues))).toFixed(2);

//让显示在坐标上的最小值

const newMin = min - 1;

//拿到数据当中的最大值

const max = Number.parseFloat(Math.max(...new Set(allValues))).toFixed(2);

let interval = Math.abs(

//移动端interval必须取整数才生效

Math.ceil(Number.parseFloat((max - min) / 5).toFixed(2))

);

let newMax = Number.parseFloat(newMin + interval * 5).toFixed(2);

//存在算出来的newMax值可能小于数据当中的max值

if (newMax < max) {

interval++;

newMax = Number.parseFloat(newMin + interval * 5).toFixed(2);

}

this.trendChart.yAxis.max = newMax;

this.trendChart.yAxis.interval = interval;

},

},

components: {

echarts: ECharts,

}

3、折线图效果

初始状态

mouseover状态

移动端还需要考虑当touchmove到非echarts的地方,需要重置到初始状态,并到选中的当前坐标去掉等问题。

4、饼图代码

template:

js:

export defalut {

//pie图

pieColor: ["#edce91", "#deab6a", "#ffe2ac", "#fcefd6","#77623b"],

overViewOption: {

lineStyle: {

color: "#e0bf80"

},

textStyle: {

color: "#333",

fontSize: 26

},

hoverOffset: 0,

series: [

{

type: "pie",

color: ["#edce91", "#deab6a", "#ffe2ac", "#fcefd6","#77623b"],

//每一块对应的色值

hoverAnimation: false,

// label:{

// normal:{

// show:false

// }

// },

radius: ["40%", "80%"],

data: [],

}

]

},

}

//从后端获取的数据

let mainModelOverview = data.mainModelOverview.map((item,index) => {

return {

value: Number.parseFloat(item.fundPercent),

name: item.fundType + item.fundPercent +'%',

emphasis:{

itemStyle:{

color: this.pieColor[index]

//鼠标放在pie图上对应区域高亮颜色,防止高亮变色(这是个坑)

}

},

};

});

this.$set(this.overViewOption.series[0], "data", mainModelOverview);

5、拼图效果

6、总结坑点

官网给的示例都是基于pc端,并没有移动端的示例。有些配置项的示例是用的echarts3,所以在使用的时候,同一个配置元素放在示例上编辑是没有问题的,但一旦放在项目当中就不生效(本项目是基于echarts4)。

事件支持:mouseover,click等pc端的事件。在移动端,touchmove事件需要取消选中状态需要自己加事件了。

interval: 官方给的建议是不推荐使用。示例给的interval可以为小数。但在移动端interval加小数却不管用,如果想均等每一列,并能够正确展示数据,那么需要自己去计算了。

api太多了,眼花...头疼...

不过,不得不佩服echarts的强大,能够支持几乎所有的定制化需求,具体怎么去实现你的需求,需要不断的尝试。在此需要这篇记录能够帮助到大家的工作,也希望大家能够给予支持

首先,你需要在 React 项目中安装 echarts: ``` npm install echarts --save ``` 然后,在需要使用饼图的组件中引入 echarts,并在组件的生命周期函数 `componentDidMount` 中初始化 echarts 实例,并使用数据渲染饼图。 例如,以下是一个简单的饼图组件的代码: ``` import React, { Component } from 'react'; import echarts from 'echarts'; class PieChart extends Component { componentDidMount() { this.initChart(); } initChart = () => { const { data } = this.props; const chart = echarts.init(this.chartRef); chart.setOption({ tooltip: { trigger: 'item', formatter: '{a} <br/>{b}: {c} ({d}%)', }, series: [ { name: '访问来源', type: 'pie', radius: ['50%', '70%'], avoidLabelOverlap: false, label: { show: false, position: 'center', }, emphasis: { label: { show: true, fontSize: '30', fontWeight: 'bold', }, }, labelLine: { show: false, }, data, }, ], }); }; render() { return ( <div ref={(ref) => { this.chartRef = ref; }} style={{ width: '100%', height: '300px' }} /> ); } } export default PieChart; ``` 在上面的代码中,我们使用 `componentDidMount` 函数初始化 echarts 实例,并使用传递进来的数据渲染饼图。注意,我们在组件的 `render` 函数中返回一个 `div` 元素,这个元素的 `ref` 属性绑定了一个回调函数,用来获取这个元素的引用,以便后续使用 echarts 来渲染图表。 在父组件中,我们可以使用以下代码来渲染这个饼图组件: ``` import React, { Component } from 'react'; import PieChart from './PieChart'; class App extends Component { state = { data: [ { value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' }, ], }; render() { const { data } = this.state; return ( <div> <PieChart data={data} /> </div> ); } } export default App; ``` 在父组件中,我们传递一个 `data` 属性给饼图组件,这个属性包含了用于渲染饼图的数据。最终,我们可以在页面中看到一个简单的饼图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值