Vue?echarts實例項目地區(qū)銷量趨勢堆疊折線圖實現(xiàn)詳解

最終效果如圖
組件結構設計
外部 Trendpage.vue
<!--針對于/trendpage 這條路徑顯示 測試顯示組件-->
<template>
<div class="comP1">
<Trend></Trend>
</div>
</template>
<script>
import Trend from "@/components/Trend";
export default {
name: "TrendPage",
components:{Trend}
}
</script>
<style scoped>
</style>內(nèi)部Trend.vue
<!-- 顯示地區(qū)銷量趨勢的折線圖表 -->
<template>
<div class="comP2" ref="trend_1"></div>
</template>
<script>
export default {
data () {
return {}
},
methods: {}
}
</script>
<style lang="less" scoped>
</style>初始化圖表+數(shù)據(jù)的獲取+更新圖表
設置好這些函數(shù) 在mounted生命周期內(nèi)調用
mounted() {
// 渲染DOM元素之后 初始化圖表實例 請求數(shù)據(jù) 監(jiān)聽頁面尺寸變化
this.initChart()
this.getData() // 請求數(shù)據(jù)
// 監(jiān)聽圖表尺寸發(fā)生變化時的 處理函數(shù) 自適應尺寸
window.addEventListener('resize',this.screenAdapter)
this.screenAdapter()
},找到盒子初始化圖表、這里只是簡單設置的直角坐標系
initChart(){
this.chartInstance = this.$echarts.init(this.$refs.trend_1,this.theme)
const initOption = {
grid:{
left:'3%',
top:'35%',
right:'4%',
bottom:'1%',
containLabel:true
},
tooltip:{ // 鼠標懸浮時的提示框
trigger:'axis'
},
legend:{
left: 20,
top: '15%',
icon:'circle'
},
xAxis: {
type:'category',
boundaryGap:false // 緊貼兩側邊緣
},
yAxis:{
type:'value'
}
}
this.chartInstance.setOption(initOption)
},發(fā)送請求、獲取數(shù)據(jù)
getData(){
const {data:res} = await this.$http.get('trend')
this.allData = res
this.updateChart()
},請求過來的數(shù)據(jù):
{
"map": {
"title": "地區(qū)銷量趨勢",
"base": 310,
"unit": "萬",
"data": [{
"name": "上海",
"data": ["155.13","154.65","171.46","164.38","237.23","300.65","240.29","232.07","193.31","136.70","48.64","90.20"]
}, {
"name": "北京",
"data": ["86.25","33.80","145.58","21.79","176.09","132.41","291.05","191.89","151.54","94.25","141.75","157.14"]
}, {
"name": "深圳",
"data": ["143.94","186.29","183.64","251.48","195.48","152.16","52.47","184.12","203.79","39.16","56.37","161.64"]
}, {
"name": "廣州",
"data": ["57.60","77.61","307.24","165.05","175.41","276.88","269.04","296.11","105.31","283.39","134.08","265.38"]
}, {
"name": "重慶",
"data": ["200.82","215.56","249.80","222.67","216.98","60.12","309.68","273.35","150.99","251.97","26.15","186.99"]
}]
},
"seller": {
"title": "商家銷量趨勢",
"base": 120,
"unit": "萬",
"data": [{
"name": "商家1",
"data": ["33.00","86.07","28.77","34.29","102.45","0.30","50.50","21.70","25.41","25.71","66.90","63.29"]
}, {
"name": "商家2",
"data": ["12.83","102.42","37.37","95.55","45.45","112.72","113.53","106.41","75.67","113.91", "37.32", "28.04"]
}, {
"name": "商家3",
"data": ["73.54","40.92","89.81","113.41","76.34","107.15","55.61","0.33","106.29","78.30","98.05","38.67"]
}, {
"name": "商家4",
"data": ["47.19","73.57","44.60","84.03","62.82","15.65","64.72","88.98","29.25","5.41","79.11","118.46"]
}, {
"name": "商家5",
"data": ["74.84","116.45","107.69","11.03","17.31","42.22","97.60","108.64","43.87","110.65","5.96","38.41"]
}]
},
"commodity": {
"title": "商品銷量趨勢",
"base": 50,
"unit": "萬",
"data": [{
"name": "女裝",
"data": ["47.71","13.34","19.30","7.93","41.93","23.01","22.63","26.91","0.62","39.23","48.74","29.48"]
}, {
"name": "手機數(shù)碼",
"data": ["46.66","46.52","23.65","1.73","44.26","47.07","17.86","40.20","3.78","31.46","28.01","8.63"]
}, {
"name": "男裝",
"data": ["26.98","30.71","42.59","29.50","26.86","17.65","30.15","15.85","9.28","30.20","32.35","34.46"]
}, {
"name": "大家電",
"data": ["20.26","46.23","43.84","46.75","28.29","32.36","45.30","16.73","40.40","45.07","29.86","41.92"]
}, {
"name": "美妝護膚",
"data": ["7.58","23.66","39.78","30.20","25.72","36.20","47.55","35.39","27.85","37.56","16.91", "3.91"]
}]
},
"common": {
"month": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]
},
"type": [{
"key": "map",
"text": "地區(qū)銷量趨勢"
}, {
"key": "seller",
"text": "商家銷量趨勢"
}, {
"key": "commodity",
"text": "商品銷量趨勢"
}]
}數(shù)據(jù)請求過來后在進行 相應處理 渲染圖表
data中預留的變量:
data(){
return{
chartInstance:null,// 預留初始化實例對象
allData:null, // 服務器請求過來的數(shù)據(jù)
showChoice:false, // 是否顯示可選項
choiceType:'map', // 顯示的數(shù)據(jù)類型
titleFontSize:0 // 指明標題的字體
}
},
1.準備好兩個數(shù)組 顏色透明度 0.5 ->0.1
2.抽取時間軸的數(shù)據(jù)
3.抽取組合 series 系列的數(shù)組
4.抽取 legend 分類提示
5.重新生成 option 調用 setOption 渲染圖表
updateChart(){
// 數(shù)據(jù)更新時 重新渲染
// 預設半透明顏色的值
const colorArr1 = [
'rgba(11,168,44,0.5)',
'rgba(44,110,255,0.5)',
'rgba(22,242,217,0.5)',
'rgba(254,33,30,0.5)',
'rgba(250,105,0,0.5)'
]
// 預設全透明顏色的值
const colorArr2 = [
'rgba(11,168,44,0.1)',
'rgba(44,110,255,0.1)',
'rgba(22,242,217,0.1)',
'rgba(254,33,30,0.1)',
'rgba(250,105,0,0.1)'
]
// 處理請求過來的 this.allData 數(shù)據(jù) 直接用變量 導進設置中
const timeArr = this.allData.common.month // 類目軸的月份
const valueArr = this.allData[this.choiceType].data // 數(shù)值軸的數(shù)據(jù)
const seriesArr = valueArr.map((item,index) => {
return {
type:'line', // 類型是折線圖
data:item.data, // 數(shù)據(jù)是每一項的data
stack:this.choiceType, // 設置成堆疊圖一樣的字符串就可以
name:item.name, // 每一項的提示 name
// 每一項面積顏色的設置 運用到 上面定義的兩個數(shù)組
areaStyle:{
color:new this.$echarts.graphic.LinearGradient(0,0,0,1,[
{
offset:0,
color:colorArr1[index]
},
{
offset:1,
color:colorArr2[index]
}
])
}
}
})
const legendArr = valueArr.map(item => {
return item.name
})
const dataOption = {
xAxis: {
data:timeArr
},
legend:{
data:legendArr
},
series:seriesArr
}
this.chartInstance.setOption(dataOption)
},尺寸變化的適配-第三篇文章已經(jīng)詳細講過
screenAdapter(){
// 頁面分辨率發(fā)生改變時 重新渲染
this.titleFontSize = this.$refs.trend_1.offsetWidth / 100 * 3.6
const adapterOption = {
// legend 是提示類目的文字 可以總的設置 也可以在單獨的 series 里設置
legend: {
itemWidth: this.titleFontSize,
itemHeight: this.titleFontSize,
itemGap: this.titleFontSize,
textStyle: {
fontSize: this.titleFontSize / 2
}
}
}
this.chartInstance.setOption(adapterOption)
this.chartInstance.resize()
},標題顯示以及對于數(shù)據(jù)的切換操作

請求過來的數(shù)據(jù)當中 有 三種類型 map seller commodity 默認是 map
在template 當中添加 標題選擇模塊 附加一定的樣式 使得標題顯示在對應的位置
- 整體的 位置 由title 樣式?jīng)Q定 動態(tài)樣式 comStyle 會隨著窗口變化和主題切換而改動
- showTitle 根據(jù)this.choiceType 動態(tài)決定標題
- icon-font 字體圖標 小箭頭 點擊切換 下拉標題的選擇
- v-for 渲染下拉標題 過濾掉當前選擇的標題
- 為每一小項 添加點擊事件 傳入 對應的key 更新this.choiceType 后重新渲染圖標 并隱藏下拉
<template>
<div class="comP3">
<div class="title" :style="comStyle">
<span>{{'▎ ' + showTitle}}</span>
<span class="iconfont title-icon" :style="comStyle" @click="showChoice = !showChoice"></span>
<div class="select-con"
:style="theme === 'chalk' ? 'background-color: #222733;' : 'background-color: #ffffff;'"
v-show="showChoice">
<div class="select-item" :style="marginStyle" v-for="item in selectTypes" :key="item.key" @click="handleSelect(item.key)">
{{item.text}}
</div>
</div>
</div>
<div class="comP2" ref="trend_1"></div>
</div>
</template>
<style scoped lang="less">
.title {
position: absolute;
left: 20px;
top: 20px;
z-index: 10;
cursor: pointer;
user-select: none;
color: white;
.title-icon {
margin-left: 10px;
}
.select-con {
/*background-color: #222733;*/
}
}
</style>與之對應的計算屬性和方法:
computed:{
...mapState(['theme']),
// 準備遍歷選項的 元數(shù)據(jù)
selectTypes(){
if (!this.allData){
return []
}else {
return this.allData.type.filter(item =>{
return item.key !== this.choiceType
})
}
},
// 顯示當前選中的標題
showTitle(){
if(!this.allData){
return ''
}else {
return this.allData[this.choiceType].title
}
},
// 設置給標題的樣式
comStyle(){
return `font-size:${this.titleFontSize}px;color:${getThemeValue(this.theme).titleColor}`
},
marginStyle(){
return `padding-left:${this.titleFontSize}px`
},
},
methods:{
handleSelect(currentType){
this.choiceType = currentType
this.updateChart()
this.showChoice = false
}
}
到此這篇關于Vue echarts實例項目地區(qū)銷量趨勢堆疊折線圖實現(xiàn)詳解的文章就介紹到這了,更多相關Vue echarts堆疊折線圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue改變數(shù)據(jù)后數(shù)據(jù)變化頁面不刷新的解決方法
這篇文章主要給大家介紹了關于vue改變數(shù)據(jù)后數(shù)據(jù)變化頁面不刷新的解決方法,vue比較常見的坑就是數(shù)據(jù)(后臺返回)更新了,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-07-07
使用vue-cli初始化項目時運行‘npm run dev’報錯及解決
這篇文章主要介紹了使用vue-cli初始化項目時運行‘npm run dev’報錯及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
Vue-cli3中如何引入ECharts并實現(xiàn)自適應
這篇文章主要介紹了Vue-cli3中如何引入ECharts并實現(xiàn)自適應,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

