你們好,我是一葉,本篇是vue學習的第二篇,本篇將要講述vue結合axios動態引用echarts。vue
在vue中,異步刷新使用的是axios,相似於你們經常使用的ajax,其實axios已是vue的第二代異步工具了,第一代是vue-resource,不過官方已經中止更新了,axios各方面來講更好用,因此仍是比較推薦的。ios
首先來講說咱們的思路,echarts能渲染圖表,是由於series裏的data有數據,因此才能渲染出來。若是咱們把axios請求過來的值賦給data,是否是意味着echarts就可以動態刷新了。憑藉這個思路,因而本文就有內容了。git
在這裏我打算分兩部分來寫。一個是普通篇,僅僅是echarts和axios的用法;另外一個是進階篇,內容爲vuex、echarts和axios的結合使用。vuex內容較多,這裏只是引用,不進行詳細講解,關於vuex的詳細用法,之後我會單獨寫一篇文章,到時候我會把連接放進來。github
普通篇:ajax
目錄結構如圖1所示:vuex
圖1json
說得再好不如代碼直觀,主組件:index.vueaxios
1 <!-- index.vue --> 2 <template> 3 <div><div id="echartContainer" style="width:500px; height:500px"></div></div> 4 </template> 5 6 <script> 7 //從option.js中引入option 8 import { option } from '@/views/option'; 9 export default { 10 name: 'bar-chart', 11 data() { 12 return { 13 }; 14 }, 15 methods: { 16 drawBarChart() { 17 // 基於準備好的dom,初始化echarts實例 18 var myChart = this.$echarts.init(document.getElementById('echartContainer'), 'infographic'); 19 // 繪製基本圖表 20 myChart.setOption(option); 21 //加載動畫 22 myChart.showLoading(); 23 //axios異步獲取數據 24 this.$axios 25 .get('static/data/asyncBarChart.json') 26 .then(res => { 27 setTimeout(() => { 28 // 獲取到數據後隱藏加載動畫 29 myChart.hideLoading(); 30 // console.log(res.data); 31 myChart.setOption({ 32 xAxis: [ 33 { 34 data: res.data.cp //將異步請求獲取到的數據進行裝載 35 } 36 ], 37 series: [ 38 { 39 data: res.data.product 40 } 41 ] 42 }); 43 }, 500); //加載動畫時長爲0.5秒 44 }) 45 .catch(err => { 46 console.log(err); 47 }); 48 } 49 }, 50 mounted() { 51 //調用drawBarChart() 52 this.drawBarChart(); 53 } 54 }; 55 </script> 56 <style></style>
接下來是渲染echarts圖表的渲染函數:option.js微信
1 // option.js 2 export const option = { 3 // title: { text: '簡單柱狀圖' }, 4 tooltip: {}, 5 xAxis: { 6 data: [], 7 name: '產品' 8 }, 9 yAxis: {}, 10 series: [{ 11 name: '銷量', 12 type: 'bar', 13 data: [], 14 itemStyle: { 15 normal: { 16 color: 'rgb(145,199,174)' 17 } 18 } 19 }] 20 }
接下來是json文件:test.jsonecharts
1 { 2 "data":[ 3 { 4 "cp": ["週一", "週二", "週三", "週四", "週五", "週六", "週日"], 5 "product": [7, 20, 31, 10, 13, 20, 15] 6 } 7 ] 8 }
運行效果如圖2所示。
圖2
估計有小夥伴對myChart.showLoading()和myChart.hideLoading();這兩個函數迷糊了吧,這是加載動畫,前者顯示加載動畫,後者判斷得到數據後隱藏加載動畫。當你的圖表數據還沒進行渲染或者網速很差時,頁面一片空白豈不是很尷尬,因此有這個加載動畫來過渡一下避免這種尷尬。用法很簡單,一看代碼你就知道了。
1 //加載"加載動畫" 2 myChart.showLoading(); 3 setTimeout(() => { 4 本身定義的函數(){ 5 6 } 7 // 獲取到數據後隱藏加載動畫 8 myChart.hideLoading(); 9 }
以上就是普通篇的內容了,接下來就是進階篇。什麼是進階篇,就是引用vuex,使用store倉庫進行存儲數據。這裏我不會對vuex進行講述,由於後面我會單獨作一篇文章來說解,這裏只是當作工具引用而已,是幫助掌握vuex的小夥伴熟悉vuex和echarts的用法。
進階篇:
咱們先來看一看效果圖,如圖3所示。
圖3 運行效果圖
接下來是目錄結構,如圖4所示。
圖4 目錄結構圖
在代碼前咱們說一下思路,說個屁,都說了不詳細說vuex。翠花,上代碼。
父組件pie.vue
1 <!-- pie.vue --> 2 <template> 3 <div class="EchartsCoponent"> 4 <div > 5 <div v-for="(chardata,index) in rightData" :key="index"> 6 <EchartsCoponent :chartData="chardata" autoresize /> 7 </div> 8 </div> 9 </div> 10 </template> 11 12 <script> 13 import EchartsCoponent from '@/components/EchartsComponent' 14 export default { 15 name: 'echarts', 16 data () { 17 return { 18 rightData:[] 19 } 20 }, 21 mounted() { 22 this.bindData(); 23 }, 24 methods: { 25 bindData() { 26 this.$axios 27 .get('static/data/piedata.json') 28 .then(res => { 29 let pro = res.data; 30 this.$store.dispatch('axiostest', pro); 31 this.rightData = this.$store.state.MsgRight; 32 }) 33 .catch(err => { 34 console.log(err); 35 }); 36 } 37 }, 38 components: { 39 EchartsCoponent 40 } 41 } 42 </script> 43 <style scoped> 44 </style>
子組件EchartsComponent.vue:
1 <!-- EchartsComponent.vue --> 2 <template> 3 <div class="xiao-ring"><div style="width:140px;height:140px;margin: 0 auto;" :id="echarts" class="echarts" ref="echarts"></div></div> 4 </template> 5 6 <script> 7 // 引入echarts 8 import echarts from 'echarts'; 9 export default { 10 name: 'EchartsComponents', 11 props: { 12 // 接收父組件傳遞過來的信息 13 chartData: { 14 type: Array, 15 default: () => [] 16 } 17 }, 18 data() { 19 return {}; 20 }, 21 methods: { 22 drawChart() { 23 const vm = this; 24 // 基於準備好的dom,初始化echarts實例 25 var myChart = echarts.init(document.getElementById(this.echarts)); 26 // 繪製圖表 27 let options ={ 28 //標題設置 29 title: { 30 text: 'ECharts測試', 31 x: 'center', 32 y: 'bottom', 33 textStyle: { 34 fontSize: 16, 35 fontWeight: 'bolder', 36 color: '#999' 37 } 38 }, 39 // 鼠標移動到圖上的文字顯示 40 tooltip: { 41 trigger: 'item', 42 formatter: '{a} <br/>{b}: {c} ({d}%)' 43 }, 44 series: [ 45 { 46 name: '銷量', 47 type: 'pie', 48 radius: ['50%', '65%'], //變成空心圓,分別相似於x,y 49 // data: [5, 20, 36, 10, 10, 20] 50 51 label: { 52 normal: { 53 show: false, //隱藏指示文字 54 position: 'center' 55 }, 56 emphasis: { 57 show: true, 58 textStyle: { 59 fontSize: '15', 60 fontWeight: 'bold' 61 } 62 } 63 }, 64 //餅圖的指示線 65 labelLine: { 66 normal: { 67 show: false 68 } 69 }, 70 data: this.chartData 71 } 72 ] 73 } 74 myChart.setOption(options) 75 this.autoActive(myChart, options) 76 }, 77 autoActive(chart, option) { 78 this.intervalFun(chart, option) 79 }, 80 intervalFun(chart, option) { 81 let dataIndex = -1 82 let dataLen = option.series[0].data.length 83 this.interval = setInterval(() => { 84 chart.dispatchAction({ 85 type: 'downplay', 86 seriesIndex: 0, 87 dataIndex 88 }) 89 dataIndex = (dataIndex + 1) % dataLen 90 chart.dispatchAction({ 91 type: 'highlight', 92 seriesIndex: 0, 93 dataIndex 94 }) 95 }, 1000) 96 } 97 98 }, 99 computed: { 100 echarts() { 101 return 'echarts' + Math.random() * 100000; 102 } 103 }, 104 mounted: function() { 105 const vm = this; 106 vm.$nextTick(() => { 107 vm.drawChart(); 108 }); 109 }, 110 created: () => {} 111 }; 112 </script> 113 114 <style scoped> 115 .xiao-ring { 116 float: left; 117 margin: 0 auto; 118 text-align: center; 119 } 120 </style>
數據文件piedata.json:
1 [ 2 [ 3 {"value":335, "name":"直接訪問"}, 4 {"value":310, "name":"郵件營銷"}, 5 {"value":234, "name":"聯盟廣告"}, 6 {"value":135, "name":"視頻廣告"}, 7 {"value":1548, "name":"搜索引擎"} 8 ], 9 [ 10 {"value":335, "name":"直接訪問"}, 11 {"value":310, "name":"郵件營銷"}, 12 {"value":234, "name":"聯盟廣告"}, 13 {"value":135, "name":"視頻廣告"}, 14 {"value":1548, "name":"搜索引擎"} 15 ], 16 [ 17 {"value":335, "name":"直接訪問"}, 18 {"value":310, "name":"郵件營銷"}, 19 {"value":234, "name":"聯盟廣告"}, 20 {"value":135, "name":"視頻廣告"}, 21 {"value":1548, "name":"搜索引擎"} 22 ], 23 [ 24 {"value":335, "name":"直接訪問"}, 25 {"value":310, "name":"郵件營銷"}, 26 {"value":234, "name":"聯盟廣告"}, 27 {"value":135, "name":"視頻廣告"}, 28 {"value":1548, "name":"搜索引擎"} 29 ], 30 [ 31 {"value":335, "name":"直接訪問"}, 32 {"value":310, "name":"郵件營銷"}, 33 {"value":234, "name":"聯盟廣告"}, 34 {"value":135, "name":"視頻廣告"}, 35 {"value":1548, "name":"搜索引擎"} 36 ] 37 ]
代碼我放到了百度雲和github上了,下面是連接。
百度雲:
git:
以上就是本文的全部內容了,若是有不明白的,或者須要改進的,均可以留言或者私信我。哦,對了,昨天才看到微信設置不讓人加,因此聯繫到我就隨緣了,隨緣咱們便能相見。