zoukankan      html  css  js  c++  java
  • vue-echarts, vue 图表数据处理; axios 跨域代理

    1.vue-echarts 安装和组件引用

    插件官网 https://github.com/ecomfe/vue-echarts

    安装 npm install eacharts vue-echarts

    页面引入 import ECharts from 'vue-echarts'

    import ECharts from 'vue-echarts'
    import 'echarts/lib/chart/line'    // 折线图
    import "echarts/lib/component/title"    // 标题展示
    import "echarts/lib/component/legend"    // 图例展示
    import "echarts/lib/component/tooltip"    // 鼠标悬浮提示

    2.API 接口获取方法(axios)和options 赋值

    插件官网 https://github.com/axios/axios

      1⃣️安装 npm install axios

    main.js
    import axios from 'axios'
    Vue.prototype.$http = axios    // axios 请求接口数据配置
    covid_19.vue
    import axios from 'axios'
    // 使用
    axios.get('/fy/get').then((result) => { 数据处理 })

          2⃣️options 赋值

    options 在 return 中赋值异步和同步获取得到的折线图动画异常(非匀速过度或无动画);建议将对象 options 放到 axios 回调函数中赋值

        let self = this  
        axios.get("/fy/get").then((result) => {
            let res = result.data
            let tempTitle = eval('(' + res + ')').component[0]
            let tempData = tempTitle.trend
            console.log("****test*****", tempData)
            self.covid = {
                title: {// 标题
                    // text: '新增确诊/疑似病例',
                    text: tempTitle.title, 
                    textStyle: {
                        fontWeight: "normal",
                        color: "green", // 标题颜色
                        fontSize: 14
                       },
                 // left: '50px' 
                 },
           legend:{
           }
            ...省略代码块... } })

    3.异步同步方法生(命周期函数一般函数)

      异步方法

     1 test () {
     2             let self = this  
     3             axios.get("/fy/get").then((result) => {
     4                 let res = result.data
     5                 let tempTitle = eval('(' + res + ')').component[0]
     6                 let tempData = tempTitle.trend
     7                 console.log("****test*****", tempData)
     8                 self.covid = {
     9                     title: {// 标题
    10                         // text: '新增确诊/疑似病例',
    11                         text: tempTitle.title, 
    12                         textStyle: {
    13                             fontWeight: "normal",
    14                             color: "green", // 标题颜色
    15                             fontSize: 14
    16                             },
    17                         // left: '50px' 
    18                     },
    19                     legend: {// 图例
    20                         textStyle: {
    21                             fontSize: 14
    22                         },
    23                         data: ['疑似病例','新增病例'],
    24                         right:'right'
    25                     },
    26                     tooltip: {// 工具提示
    27                         trigger: 'axis',
    28                         axisPointer: {
    29                             type: 'cross'
    30                         }
    31                     },
    32                     xAxis: {
    33                         // type: 'category',
    34                         data: tempData.updateDate, // 在x轴显示时间
    35                         axisLabel: {    //横坐标字体颜色
    36                             show: true,
    37                             textStyle: {
    38                                 color: "red"
    39                             }
    40                         },
    41                         axisLine: {
    42                             lineStyle: {
    43                                 color: "red"
    44                             }
    45                         }
    46                     },
    47                     yAxis: {
    48                         type: 'value',
    49                         axisLabel: {    //纵坐标字体颜色
    50                             show: true,
    51                             textStyle: {
    52                                 color: "green"
    53                             }
    54                         },
    55                         axisLine: {
    56                             lineStyle: {
    57                                 color: "green"
    58                             }
    59                         }
    60                     },
    61                     series: [
    62                         {// 一系列
    63                             type: 'line',
    64                             name: '新增病例',
    65                             color: 'blue',  // 折线颜色
    66                             smooth: true,
    67                             data: tempData.list[4].data
    68                         },{// 一系列
    69                             type: 'line',
    70                             name: '疑似病例',
    71                             color: 'yellow',  // 折线颜色
    72                             smooth: true,
    73                             data: tempData.list[5].data
    74                         }
    75                     ],
    76                     animationDuration: 3000  
    77                 }
    View Code

      同步方法

    生命周期函数

     1 async created(){
     2     // 性能好于 beforeCreate (用时短 0.5s 左右) mounted (用时短 0.3s 左右)
     3     console.log("mounted",)
     4     let promisD =  await this.func()
     5     // console.log(promisD)
     6     let tempTitle = eval('(' + promisD.data + ')').component[0] // 为了取 title
     7     let tempData = tempTitle.trend // 目标数据
     8     console.log("mounted", tempData.updateDate)
     9     this.covid = {
    10         title: {// 标题
    11             // text: '新增确诊/疑似病例',
    12             text: tempTitle.title, 
    13             textStyle: {
    14                 fontWeight: "normal",
    15                 color: "green", // 标题颜色
    16                 fontSize: 14
    17              },
    18         // left: '50px' 
    19         },
    20         legend: {// 图例
    21             textStyle: {
    22                 fontSize: 14
    23             },
    24             data: ['疑似病例','新增病例'],
    25             right:'right'
    26         },
    27         tooltip: {// 工具提示
    28             trigger: 'axis',
    29             axisPointer: {
    30                 type: 'cross'
    31              }    
    32          },
    33          xAxis: {
    34             // type: 'category',
    35             data: tempData.updateDate, // 在x轴显示时间
    36                 axisLabel: {    //横坐标字体颜色
    37                     show: true,
    38                     textStyle: {
    39                         color: "red"
    40                     }
    41             },  
    42             axisLine: {
    43                     lineStyle: {
    44                         color: "red"
    45                     }
    46             }               
    47         },
    48         yAxis: {
    49             type: 'value',
    50                 axisLabel: {    //纵坐标字体颜色
    51                     show: true,
    52                     textStyle: {
    53                         color: "green"
    54                     }
    55                 },                         
    56             axisLine: {
    57                 lineStyle: {
    58                     color: "green"
    59                 }
    60             }
    61         },       
    62         series: [
    63             {// 一系列
    64              type: 'line',
    65                     name: '新增病例',
    66                     color: 'blue',  // 折线颜色
    67                     smooth: true,
    68                     data: tempData.list[4].data
    69              },{// 一系列
    70                     type: 'line',
    71                     name: '疑似病例',
    72                     color: 'yellow',  // 折线颜色
    73                     smooth: true,
    74                     data: tempData.list[5].data
    75             }       
    76         ],   
    77         animationDuration: 3000  
    78         }
    79     },  
    80 methods: {
    81     func () {   // axios 数据在不同场景下做不同的处理时(在对应的方法中取处理)或相同处理(返回数据直接在 then 中处理)
    82         return new Promise((resolve, reject) => {
    83             axios.get("/fy/get").then((res) => {
    84                 resolve(res)
    85             }).catch((error) => {
    86                     reject(error)
    87             })
    88         })
    89         // this.covid.xAxis.data = tempData.updateDate        
    90     },    
    91 }                                                                 
    View Code

    一般函数

    async initCovid () {
        // 同 create
        console.log("代码同 create 方法")

    重点:axios 跨域代理配置

    main.js
    axios.defaults.baseURL = '/api'  //关键代码 实际请求localhost:8080/api/fy/get/
    
    vue.config.js
    
    module.exports = {
        devServer: {
            proxy: {  // 注意不是 proxyTable
              '/api':{  // 找到 API 并替换前面地址
                  target: 'https://www.maomin.club', // 代理后真正请求 https://www.maomin.club/fy/get
                  changeOrigin: true,
                  pathRewrite: {
                    '^/api': ''
                  }
                }
            }
        }
    }  

     注意:在 beforeCreate 生命周期函数中 获取 data 中数据方式 this.$options.data().属性

                      调用methods 中方法 this.$options.methods.func()

    完整代码:

      1 <template>
      2     <v-chart class="echarts" :options="covid" :auto-resize="true"/>
      3 </template>
      4 
      5 <script>
      6 import ECharts from 'vue-echarts'
      7 import 'echarts/lib/chart/line'
      8 import "echarts/lib/component/title"
      9 import "echarts/lib/component/legend"
     10 import "echarts/lib/component/tooltip"
     11 import axios from 'axios'
     12 var timerShaft = [], confirmedCase = [], suspectedCase = []
     13 export default {
     14     components: {
     15         'v-chart': ECharts
     16     },
     17     data () {
     18         
     19         /** 
     20          * covid 在异步方法或同步方法中处理否则-后半折线动画异常(return 里赋值会失去动画效果)
     21          * 1.axios 异步获取 created
     22          * 2.axios 同步获取 
     23          */
     24         this.test() // 异步方法中处理数据
     25         this.initCovid() // 同步方法中处理数据 (加载时间不稳定 2.5s - 1.5s 波动)
     26         return {  
     27             covid:{}
     28         }
     29     },
     30     beforeCreate(){
     31         // 可以 修改 let promisD =  await this.$options.methods.func()
     32         // console.log("beforeCreate",)  
     33     },
     34     /** 
     35      * 生命周期函数中处理 
     36      */
     37     // async created(){
     38     //     // 性能好于 beforeCreate (用时短 0.5s 左右) mounted (用时短 0.3s 左右)
     39     //     console.log("mounted",)
     40     //     let promisD =  await this.func()
     41     //     // console.log(promisD)
     42     //     let tempTitle = eval('(' + promisD.data + ')').component[0] // 为了取 title
     43     //     let tempData = tempTitle.trend // 目标数据
     44     //     console.log("mounted", tempData.updateDate)
     45     //     this.covid = {
     46     //         title: {// 标题
     47     //             // text: '新增确诊/疑似病例',
     48     //             text: tempTitle.title, 
     49     //             textStyle: {
     50     //                 fontWeight: "normal",
     51     //                 color: "green", // 标题颜色
     52     //                 fontSize: 14
     53     //                 },
     54     //             // left: '50px' 
     55     //         },
     56     //         legend: {// 图例
     57     //             textStyle: {
     58     //                 fontSize: 14
     59     //             },
     60     //             data: ['疑似病例','新增病例'],
     61     //             right:'right'
     62     //         },
     63     //         tooltip: {// 工具提示
     64     //             trigger: 'axis',
     65     //             axisPointer: {
     66     //                 type: 'cross'
     67     //             }
     68     //         },
     69     //         xAxis: {
     70     //             // type: 'category',
     71     //             data: tempData.updateDate, // 在x轴显示时间
     72     //             axisLabel: {    //横坐标字体颜色
     73     //                 show: true,
     74     //                 textStyle: {
     75     //                     color: "red"
     76     //                 }
     77     //             },
     78     //             axisLine: {
     79     //                 lineStyle: {
     80     //                     color: "red"
     81     //                 }
     82     //             }
     83     //         },
     84     //         yAxis: {
     85     //             type: 'value',
     86     //             axisLabel: {    //纵坐标字体颜色
     87     //                 show: true,
     88     //                 textStyle: {
     89     //                     color: "green"
     90     //                 }
     91     //             },
     92     //             axisLine: {
     93     //                 lineStyle: {
     94     //                     color: "green"
     95     //                 }
     96     //             }
     97     //         },
     98     //         series: [
     99     //             {// 一系列
    100     //                 type: 'line',
    101     //                 name: '新增病例',
    102     //                 color: 'blue',  // 折线颜色
    103     //                 smooth: true,
    104     //                 data: tempData.list[4].data
    105     //             },{// 一系列
    106     //                 type: 'line',
    107     //                 name: '疑似病例',
    108     //                 color: 'yellow',  // 折线颜色
    109     //                 smooth: true,
    110     //                 data: tempData.list[5].data
    111     //             }
    112     //         ],
    113     //         animationDuration: 3000  
    114     //     }
    115     // },
    116 
    117     methods: {
    118         async initCovid () {
    119             // 同 create
    120             console.log("代码同 create 方法")
    121         },
    122         test () {
    123             let self = this  
    124             axios.get("/fy/get").then((result) => {
    125                 let res = result.data
    126                 let tempTitle = eval('(' + res + ')').component[0]
    127                 let tempData = tempTitle.trend
    128                 console.log("****test*****", tempData)
    129                 self.covid = {
    130                     title: {// 标题
    131                         // text: '新增确诊/疑似病例',
    132                         text: tempTitle.title, 
    133                         textStyle: {
    134                             fontWeight: "normal",
    135                             color: "green", // 标题颜色
    136                             fontSize: 14
    137                             },
    138                         // left: '50px' 
    139                     },
    140                     legend: {// 图例
    141                         textStyle: {
    142                             fontSize: 14
    143                         },
    144                         data: ['疑似病例','新增病例'],
    145                         right:'right'
    146                     },
    147                     tooltip: {// 工具提示
    148                         trigger: 'axis',
    149                         axisPointer: {
    150                             type: 'cross'
    151                         }
    152                     },
    153                     xAxis: {
    154                         // type: 'category',
    155                         data: tempData.updateDate, // 在x轴显示时间
    156                         axisLabel: {    //横坐标字体颜色
    157                             show: true,
    158                             textStyle: {
    159                                 color: "red"
    160                             }
    161                         },
    162                         axisLine: {
    163                             lineStyle: {
    164                                 color: "red"
    165                             }
    166                         }
    167                     },
    168                     yAxis: {
    169                         type: 'value',
    170                         axisLabel: {    //纵坐标字体颜色
    171                             show: true,
    172                             textStyle: {
    173                                 color: "green"
    174                             }
    175                         },
    176                         axisLine: {
    177                             lineStyle: {
    178                                 color: "green"
    179                             }
    180                         }
    181                     },
    182                     series: [
    183                         {// 一系列
    184                             type: 'line',
    185                             name: '新增病例',
    186                             color: 'blue',  // 折线颜色
    187                             smooth: true,
    188                             data: tempData.list[4].data
    189                         },{// 一系列
    190                             type: 'line',
    191                             name: '疑似病例',
    192                             color: 'yellow',  // 折线颜色
    193                             smooth: true,
    194                             data: tempData.list[5].data
    195                         }
    196                     ],
    197                     animationDuration: 3000  
    198                 }
    199             })
    200             
    201         },
    202         func () {   // axios 数据在不同场景下做不同的处理时(在对应的方法中取处理)或相同处理(返回数据直接在 then 中处理)
    203             return new Promise((resolve, reject) => {
    204                 axios.get("/fy/get").then((res) => {
    205                     resolve(res)
    206                 }).catch((error) => {
    207                     reject(error)
    208                 })
    209             })
    210             // this.covid.xAxis.data = tempData.updateDate        
    211         },
    212         monthDay () {
    213             let  currentDate = new Date();// 当天日期
    214             let currentDay = currentDate.getDate();// 具体某一天
    215             let month, date, confirmed=0, suspected=0// 定义变量 月和天
    216             for (let i = 20; i >= 0; i-- ) {// 取14天包括当天
    217                 let accordDate = currentDate.setDate(currentDay - i);// 符合条件的日期
    218                 month = new Date(accordDate).getMonth() + 1
    219                 date = new Date(accordDate).getDate()
    220                 confirmed = confirmed + 100
    221                 suspected = suspected + 500
    222                 confirmedCase.push(confirmed)
    223                 suspectedCase.push(suspected)
    224                 timerShaft.push(month + '.' + date)   
    225             }
    226             // console.log('eee', timerShaft)
    227             //  console.log('case', confirmedCase)
    228         }
    229     }
    230 }
    231 </script> 
    232 <style>
    233     #container{
    234          100%;
    235         height: 100%;
    236     }
    237     .echarts {
    238         /* :auto-resize 自动大小默认是 false */
    239         /*  auto;
    240         height: 50%; */
    241     }
    242 </style>
    View Code

    demo 地址: https://github.com/dopocheng/alone-part/tree/master/src/views/echarts/covid-19

  • 相关阅读:
    C++中派生类与基类的同名成员调用机制
    一元运算符重载
    二元运算符重载
    const修饰符在不同位置带来的效应
    C++中指针与引用的区别
    基本的查找算法
    排序算法
    指针是怎么回事
    面试总结(1)
    价值观作业
  • 原文地址:https://www.cnblogs.com/dopocheng/p/12372786.html
Copyright © 2011-2022 走看看