大家好,我是一叶,本篇是vue学习的第二篇,本篇将要讲述vue结合axios动态引用echarts。

  在vue中,异步刷新使用的是axios,类似于大家常用的ajax,其实axios已经是vue的第二代异步工具了,第一代是vue-resource,不过官方已经停止更新了,axios各方面来说更好用,所以还是比较推荐的。

  首先来说说我们的思路,echarts能渲染图表,是因为series里的data有数据,所以才能渲染出来。如果我们把axios请求过来的值赋给data,是不是意味着echarts就能够动态刷新了。凭借这个思路,于是本文就有内容了。

  在这里我打算分两部分来写。一个是普通篇,仅仅是echarts和axios的用法;另一个是进阶篇,内容为vuex、echarts和axios的结合使用。vuex内容较多,这里只是引用,不进行详细讲解,关于vuex的详细用法,以后我会单独写一篇文章,到时候我会把链接放进来。

  普通篇:

  目录结构如图1所示:

图1

  说得再好不如代码直观,主组件:index.vue

 <!-- index.vue -->
<template>
<div><div id="echartContainer" style="width:500px; height:500px"></div></div>
</template> <script>
//从option.js中引入option
import { option } from '@/views/option';
export default {
name: 'bar-chart',
data() {
return {
};
},
methods: {
drawBarChart() {
// 基于准备好的dom,初始化echarts实例
var myChart = this.$echarts.init(document.getElementById('echartContainer'), 'infographic');
// 绘制基本图表
myChart.setOption(option);
//加载动画
myChart.showLoading();
//axios异步获取数据
this.$axios
.get('static/data/asyncBarChart.json')
.then(res => {
setTimeout(() => {
// 获取到数据后隐藏加载动画
myChart.hideLoading();
// console.log(res.data);
myChart.setOption({
xAxis: [
{
data: res.data.cp //将异步请求获取到的数据进行装载
}
],
series: [
{
data: res.data.product
}
]
});
}, 500); //加载动画时长为0.5秒
})
.catch(err => {
console.log(err);
});
}
},
mounted() {
//调用drawBarChart()
this.drawBarChart();
}
};
</script>
<style></style>

  接下来是渲染echarts图表的渲染函数:option.js

 // option.js
export const option = {
// title: { text: '简单柱状图' },
tooltip: {},
xAxis: {
data: [],
name: '产品'
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [],
itemStyle: {
normal: {
color: 'rgb(145,199,174)'
}
}
}]
}

  接下来是json文件:test.json

 {
"data":[
{
"cp": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
"product": [7, 20, 31, 10, 13, 20, 15]
}
]
}

  运行效果如图2所示。

图2

  估计有小伙伴对myChart.showLoading()和myChart.hideLoading();这两个函数迷糊了吧,这是加载动画,前者显示加载动画,后者判断获得数据后隐藏加载动画。当你的图表数据还没进行渲染或者网速不好时,页面一片空白岂不是很尴尬,所以有这个加载动画来过渡一下避免这种尴尬。用法很简单,一看代码你就知道了。

 //加载"加载动画"
myChart.showLoading();
setTimeout(() => {
自己定义的函数(){ }
// 获取到数据后隐藏加载动画
myChart.hideLoading();
}

  以上就是普通篇的内容了,接下来就是进阶篇。什么是进阶篇,就是引用vuex,使用store仓库进行存储数据。这里我不会对vuex进行讲述,因为后面我会单独做一篇文章来讲解,这里只是当做工具引用而已,是帮助掌握vuex的小伙伴熟悉vuex和echarts的用法。

  进阶篇:

  我们先来看一看效果图,如图3所示。

图3 运行效果图

  接下来是目录结构,如图4所示。

图4 目录结构图

  在代码前我们说一下思路,说个屁,都说了不详细说vuex。翠花,上代码。

  父组件pie.vue

 <!-- pie.vue -->
<template>
<div class="EchartsCoponent">
<div >
<div v-for="(chardata,index) in rightData" :key="index">
<EchartsCoponent :chartData="chardata" autoresize />
</div>
</div>
</div>
</template> <script>
import EchartsCoponent from '@/components/EchartsComponent'
export default {
name: 'echarts',
data () {
return {
rightData:[]
}
},
mounted() {
this.bindData();
},
methods: {
bindData() {
this.$axios
.get('static/data/piedata.json')
.then(res => {
let pro = res.data;
this.$store.dispatch('axiostest', pro);
this.rightData = this.$store.state.MsgRight;
})
.catch(err => {
console.log(err);
});
}
},
components: {
EchartsCoponent
}
}
</script>
<style scoped>
</style>

  子组件EchartsComponent.vue:

 <!-- EchartsComponent.vue -->
<template>
<div class="xiao-ring"><div style="width:140px;height:140px;margin: 0 auto;" :id="echarts" class="echarts" ref="echarts"></div></div>
</template> <script>
// 引入echarts
import echarts from 'echarts';
export default {
name: 'EchartsComponents',
props: {
// 接收父组件传递过来的信息
chartData: {
type: Array,
default: () => []
}
},
data() {
return {};
},
methods: {
drawChart() {
const vm = this;
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById(this.echarts));
// 绘制图表
let options ={
//标题设置
title: {
text: 'ECharts测试',
x: 'center',
y: 'bottom',
textStyle: {
fontSize: 16,
fontWeight: 'bolder',
color: '#999'
}
},
// 鼠标移动到图上的文字显示
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
series: [
{
name: '销量',
type: 'pie',
radius: ['50%', '65%'], //变成空心圆,分别类似于x,y
// data: [5, 20, 36, 10, 10, 20] label: {
normal: {
show: false, //隐藏指示文字
position: 'center'
},
emphasis: {
show: true,
textStyle: {
fontSize: '15',
fontWeight: 'bold'
}
}
},
//饼图的指示线
labelLine: {
normal: {
show: false
}
},
data: this.chartData
}
]
}
myChart.setOption(options)
this.autoActive(myChart, options)
},
autoActive(chart, option) {
this.intervalFun(chart, option)
},
intervalFun(chart, option) {
let dataIndex = -1
let dataLen = option.series[0].data.length
this.interval = setInterval(() => {
chart.dispatchAction({
type: 'downplay',
seriesIndex: 0,
dataIndex
})
dataIndex = (dataIndex + 1) % dataLen
chart.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex
})
}, 1000)
} },
computed: {
echarts() {
return 'echarts' + Math.random() * 100000;
}
},
mounted: function() {
const vm = this;
vm.$nextTick(() => {
vm.drawChart();
});
},
created: () => {}
};
</script> <style scoped>
.xiao-ring {
float: left;
margin: 0 auto;
text-align: center;
}
</style>

  数据文件piedata.json:

 [
[
{"value":335, "name":"直接访问"},
{"value":310, "name":"邮件营销"},
{"value":234, "name":"联盟广告"},
{"value":135, "name":"视频广告"},
{"value":1548, "name":"搜索引擎"}
],
[
{"value":335, "name":"直接访问"},
{"value":310, "name":"邮件营销"},
{"value":234, "name":"联盟广告"},
{"value":135, "name":"视频广告"},
{"value":1548, "name":"搜索引擎"}
],
[
{"value":335, "name":"直接访问"},
{"value":310, "name":"邮件营销"},
{"value":234, "name":"联盟广告"},
{"value":135, "name":"视频广告"},
{"value":1548, "name":"搜索引擎"}
],
[
{"value":335, "name":"直接访问"},
{"value":310, "name":"邮件营销"},
{"value":234, "name":"联盟广告"},
{"value":135, "name":"视频广告"},
{"value":1548, "name":"搜索引擎"}
],
[
{"value":335, "name":"直接访问"},
{"value":310, "name":"邮件营销"},
{"value":234, "name":"联盟广告"},
{"value":135, "name":"视频广告"},
{"value":1548, "name":"搜索引擎"}
]
]

  代码我放到了百度云和github上了,下面是链接。

  百度云:

  git:

以上就是本文的所有内容了,如果有不明白的,或者需要改进的,都可以留言或者私信我。哦,对了,昨天才看到微信设置不让人加,所以联系到我就随缘了,随缘我们便能相见。

vue学习【二】vue结合axios动态引用echarts的更多相关文章

  1. Vue学习(二)-Vue中组件间传值常用的几种方式

    版本说明:vue-cli:3.0 主要分为两类: 1.父子组件间的传值 2.非父子组件间的传值 1.父子组件间传值 父组件向子组件传值 第一种方式: props 父组件嵌套的子组件中,使用v-bind ...

  2. day 82 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  3. day 81 Vue学习二之vue结合项目简单使用、this指向问题

    Vue学习二之vue结合项目简单使用.this指向问题   本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...

  4. vue学习目录 vue初识 this指向问题 vue组件传值 过滤器 钩子函数 路由 全家桶 脚手架 vuecli element-ui axios bus

    vue学习目录 vue学习目录 Vue学习一之vue初识 Vue学习二之vue结合项目简单使用.this指向问题 Vue学习三之vue组件 Vue学习四之过滤器.钩子函数.路由.全家桶等 Vue学习之 ...

  5. Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

    ===重点重点开始 ========================== (三) 组件化开发 1.创建组件构造器: Vue.extends() 2.注册组件: Vue.component() 3.使用 ...

  6. Vue学习笔记-Vue.js-2.X 学习(一)===>基本知识学习

    一  使用环境: windows 7 64位操作系统 二  IDE:VSCode/PyCharm 三  Vue.js官网: https://cn.vuejs.org/ 四  下载安装引用 方式1:直接 ...

  7. Vue学习笔记-Vue.js-2.X 学习(四)===>脚手架Vue-CLI(基本工作和创建)

    (五) 脚手架Vue-CLI 一 Vue-CLI前提(nodejs和webpack) 二  Vue学习-nodejs按装配置,Node.js 就是运行在服务端的 JavaScript. 1. 去nod ...

  8. vue学习之vue基本功能初探

    vue学习之vue基本功能初探: 采用简洁的模板语法将声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div> ...

  9. Vue学习笔记-Vue.js-2.X 学习(六)===>脚手架Vue-CLI(项目说明-Babel)

    五  Vue学习-vue-cli脚手架学习(创建只选一个选项:Babel) 1. 项目目录说明 node_modules : 包管理文件夹 public : 静态资源 src : 源代码 gitign ...

随机推荐

  1. Mysql和Orcale的区别

    有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORAC ...

  2. 套接字之select系统调用

    select是IO多路复用的一种方式,用来等待一个列表中的多个描述符的可读可写状态: SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_ ...

  3. python3笔记十九:os和ospath模块

    一:学习内容 os模块 ospath模块 获取指定目录下所有文件和目录 二:os模块 包含了普遍的操作系统功能,需要导入该模块:import os 当前所在位置目录结构为: 目录操作 1.获取当前目录 ...

  4. LeetCode 49. 字母异位词分组(Group Anagrams)

    题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "ta ...

  5. laravel中事件的监听和订阅

    一.前言 更新员工部门主管的时候,需要重新更新一下缓存,这个会比较耗时.所以计划放到队列中来执行.后来想了想,其实用一下事件监听也能实现.人家都说好,然是我也没感觉到有什么好的. 二.正文 1. 在p ...

  6. 认识一下java神器Btrace

    转载: http://calvin1978.blogcn.com/articles/btrace1.html BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都 ...

  7. centos6.4编译gcc6.4

    #!/bin/bash dir=$(pwd) echo $dir cd $dir #wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz .tar ...

  8. 如何解决Struts2和Servlet共存问题

    我之前用Servlet写过二维码扫描登录,结果把它整合到ssh框架中,发现Servlet和Struts存在共存问题,这是因为当我们在页面在请求应用时,struts2将会截获所有请求,对于servlet ...

  9. Input 输入框

    Input 输入框 通过鼠标或键盘输入字符 <el-input v-model="input" placeholder="请输入内容"></e ...

  10. c#端口扫描器wpf+socket

    布局如下 <Window x:Class="PortTest.MainWindow" xmlns="http://schemas.microsoft.com/win ...