Vue echarts实例项目地区销量趋势堆叠折线图实现详解

最终效果如图

组件结构设计

外部 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>

内部Trend.vue

<!-- 显示地区销量趋势的折线图表 -->
<template>
<div class="comP2" ref="trend_1"></div>
</template>
<script>
export default {
data () {
return {}
},
methods: {}
}
</script>
<style lang="less" scoped>
</style>

初始化图表+数据的获取+更新图表

设置好这些函数 在mounted生命周期内调用

    mounted() {
      // 渲染DOM元素之后 初始化图表实例 请求数据 监听页面尺寸变化
      this.initChart()
       this.getData()  // 请求数据
      // 监听图表尺寸发生变化时的 处理函数   自适应尺寸
      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)
      },

发送请求、获取数据

      getData(){
        const {data:res} = await this.$http.get('trend')
        this.allData = res
        this.updateChart()
      },

请求过来的数据:

{
    "map": {
        "title": "地区销量趋势",
        "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": "手机数码",
            "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": "地区销量趋势"
    }, {
        "key": "seller",
        "text": "商家销量趋势"
    }, {
        "key": "commodity",
        "text": "商品销量趋势"
    }]
}

数据请求过来后在进行 相应处理 渲染图表

data中预留的变量:

data(){
  return{
    chartInstance:null,// 预留初始化实例对象
    allData:null, // 服务器请求过来的数据
    showChoice:false, // 是否显示可选项
    choiceType:'map', // 显示的数据类型
    titleFontSize:0 // 指明标题的字体
  }
},

1.准备好两个数组 颜色透明度 0.5 ->0.1

2.抽取时间轴的数据

3.抽取组合 series 系列的数组

4.抽取 legend 分类提示

5.重新生成 option 调用 setOption 渲染图表

      updateChart(){
        // 数据更新时 重新渲染
        // 预设半透明颜色的值
        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 数据 直接用变量 导进设置中
        const timeArr = this.allData.common.month // 类目轴的月份
        const valueArr = this.allData[this.choiceType].data // 数值轴的数据
        const seriesArr = valueArr.map((item,index) => {
          return {
            type:'line', // 类型是折线图
            data:item.data, // 数据是每一项的data
            stack:this.choiceType, // 设置成堆叠图一样的字符串就可以
            name:item.name, // 每一项的提示 name
            // 每一项面积颜色的设置 运用到 上面定义的两个数组
            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)
      },

尺寸变化的适配-第三篇文章已经详细讲过

      screenAdapter(){
        // 页面分辨率发生改变时 重新渲染
        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()
      },

标题显示以及对于数据的切换操作

请求过来的数据当中 有 三种类型 map seller commodity 默认是 map

在template 当中添加 标题选择模块 附加一定的样式 使得标题显示在对应的位置

  1. 整体的 位置 由title 样式决定 动态样式 comStyle 会随着窗口变化和主题切换而改动
  2. showTitle 根据this.choiceType 动态决定标题
  3. icon-font 字体图标 小箭头 点击切换 下拉标题的选择
  4. v-for 渲染下拉标题 过滤掉当前选择的标题
  5. 为每一小项 添加点击事件 传入 对应的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']),
      // 准备遍历选项的 元数据
      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实例项目地区销量趋势堆叠折线图实现详解的文章就介绍到这了,更多相关Vue echarts堆叠折线图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue echarts模拟后端数据流程详解

    目录 KOA2的使用 安装 Koa app.js入口文件 KOA2的使用 KOA2是由Express 原班人马打造. 环境依赖 Node v7.6.0 及以上. 支持 async 和 await 洋葱模型的中间件 写响应函数(中间件) 响应函数是通过use的方式才能产生效果, 这个函数有两个参数, ctx :上下文, 指的是请求所处于的Web容器,我们可以通过 ctx.request 拿到请求对象, 也可 以通过 ctx.response 拿到响应对象 next :内层中间件执行的入口 模拟服务

  • vue中的echarts实现宽度自适应的解决方案

    今天项目中需要使用到 echarts 为了自适应.找到了.以下解决方案. 效果图 代码 <template> <!-- 这是图表开始 --> <div class="chart"> <div ref="main1" style="width: 600px;height:400px;" ></div> <div ref="main2" style="wi

  • Vue echarts画甘特图流程详细讲解

    vue项目中添加echarts,只需要增加echarts依赖,然后在main.js中引入echarts就可以使用了. 1.npm install echarts --save 2.修改main.js import * as echarts from 'echarts' Vue.prototype.$echarts = echarts 3.具体页面使用: <template> <div class="about"> <h1>This is echart

  • vue项目中vue-echarts讲解及常用图表实现方案(推荐)

    目录 1.图表主题颜色的修改 2.XY轴体颜色和文本颜色修改 3.横向柱状图的显示 4.过滤xy轴文本内容 5.Y轴文本显示在轴线内 6.在柱状条头部添加标签内容 7.自定义图例修改 8.环比图中间显示内容 图表类的项目操作一般常见于管理平台系统,移动端项目中并不是特别常见,不常见不代表没有,在一些商城类应用中,商家需要看到商品的销量分析,盈利分析等,就需要用到图标,比较常用的图标库,像百度的ECHARTS,蚂蚁金服的AntV都是不错的图标库,感兴趣的读者可以直接到他们的官网阅读相关的资料,笔者

  • Vue中使用Echarts可视化图表宽度自适应的完美解决方案

    目录 一.问题阐述: 二.解决思路: 三.最终效果: 一.问题阐述: 开发H5项目中应用到Echarts数据可视化,由于H5主要使用在手机,屏幕宽度大大限制了图表的展现,问题如下. 上图中x轴的数据是动态的,从2022年切换到2021年数据变化,此时如果x轴的数据过多就会显得格外拥挤. 二.解决思路: 我的解决方案是,在放置Echarts的容器(div)外层再套一层容器(div),外层容器宽度固定设置手机屏幕宽,并设置溢出显示滚动条(width: 100%;overflow: auto),内层E

  • Vue echarts实例项目商家销量统计图实现详解

    目录 组件结构设计 发送请求获取对应的数据并进行相应操作 当窗口尺寸发生变化时的操作 总体效果如图 组件结构设计 SellerPage.vue <!--针对于/sellerpage 这条路径显示 测试显示组件--> <template> <div class="comP1"> <Seller></Seller> </div> </template> <script> import Selle

  • vue中设置echarts宽度自适应的代码步骤

    目录 问题描述 无自适应效果图 有自适应效果图 代码步骤 问题描述 我们使用vue做项目的时候,常常需要做到echarts图表的自适应,一般是根据页面的宽度做对应的适应.本文记录一下设置echarts图表的自适应的步骤.我们先看一下没有做echarts自适应的效果 无自适应效果图 我们发现echarts图的宽度并没有随着页面宽度的变化而变化 有自适应效果图 很显然,这个才是我们想要的效果 代码步骤 echart图表本身提供了一个resize的函数,我们只需要监听页面的resize变化以后,去执行

  • Vue echarts实例项目地区销量趋势堆叠折线图实现详解

    最终效果如图 组件结构设计 外部 Trendpage.vue <!--针对于/trendpage 这条路径显示 测试显示组件--> <template> <div class="comP1"> <Trend></Trend> </div> </template> <script> import Trend from "@/components/Trend"; export

  • Vue微信项目按需授权登录策略实践思路详解

    项目采用Vue作为开发框架,用户浏览页面时有两种情况: 一种是需要用户先登录之后才能继续浏览: 另一种是用户无需登录即可随意浏览. 在无需用户登录的页面中,可能包含需要用户信息的操作,此时就需要用户登录之后方能进行后续操作.因此,需要对授权登录策略进行区分. 思路 1.一般而言,我们为微信开发的H5页面,进入页面的时候就进行鉴权,要求用户登录之后才能继续浏览.但由于产品需求,这个项目我们需要对不同页面的鉴权策略进行划分,按照一般与特殊进行设计: 2.一般情况,用户进入页面第一时间要求用户授权登录

  • vue项目网站全局置灰功能实现示例详解

    目录 1.前端独立实现 2.通过后台管理控制设置网站的整体置灰样式 1.前端独立实现 两种不同的逻辑,一种是前端自己实现,一种是结合后台管理系统来控制,网站是正常还是置灰. 直接在public文件夹下的index.html文件的html标签里加上style="filter:grayscale(100%)",总的就是<html style="filter:grayscale(100%)"> 2.通过后台管理控制设置网站的整体置灰样式 1.先给public文

  • Vue项目的网络请求代理到封装步骤详解

    目录 1.创建vue项目 2.安装axios 3.进行config.js配置 4.main.js里引入 5.src目录下新建Utils文件夹,在内封装request.js 6.以login路由为示例 src文件下新建api文件,在api内新建login.js 7.在页面内引入方法,并使用 1.创建vue项目 vue create demo demo是项目名称 2.安装axios 进入demo里面打开终端(黑窗口),执行 npm install axios 3.进行config.js配置 devS

  • vue.js的computed,filter,get,set的用法及区别详解

    1.vue.js的computed方法: 处理复杂逻辑,基于依赖缓存,当依赖发生改变时会重新取值.用methods也可以实现同样的效果,但methods在重新渲染的时候会重新调用执行,在性能上computed优于methods,当不需要缓存时可用methods. 实例1:computed和methods实现翻转字符串 <template> <div> <input v-model="message"> <p>原始字符串: {{ messa

  • 基于vue中css预加载使用sass的配置方式详解

    1.安装sass的依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-dev node-sass 2.在build文件夹下的webpack.base.conf.js的rules里面添加配置,如下红色部分 { test: /\.sass$/, loaders: ['style', 'css', 'sass'] } <span style="color:#454545;"

  • Vue监听数据渲染DOM完以后执行某个函数详解

    实例如下: vm.$watch('某data数据',function(val){ vm.$nextTick(function() { 某事件(); }); }) 以上这篇Vue监听数据渲染DOM完以后执行某个函数详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Vue.js 2.x之组件的定义和注册图文详解

    前言 什么是组件 组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可. 模块化和组件化的区别 模块化:是从代码逻辑的角度进行划分的:方便代码分层开发,保证每个功能模块的职能单一 组件化:是从UI界面的角度进行划分的:前端的组件化,方便UI组件的重用 全局组件的定义和注册 组件Component是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码. 全局组件的定义和注

  • vue下拉刷新组件的开发及slot的使用详解

    "下拉刷新"和"上滑加载更多"功能在前端.尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的"blink"功能和各位探讨下[下拉刷新]组件的开发: 正式开篇 在前端项目的 components 文件夹下新建 pullRefreshView 文件夹,在其中新建组件 index.vue:(它代表"整个屏幕",通过slot插入页面其他内容而不是传统的设置遮罩层触发下拉刷新) 首先需要编写下拉刷新组件的 template,

随机推荐