Vue.js+HighCharts实现动态请求展示时序数据

Jenny ·
更新时间:2024-11-10
· 1580 次阅读

本文实例为大家分享了Vue.js+HighCharts实现动态请求展示时序数据的具体代码,供大家参考,具体内容如下

<template>   <el-container>     <el-header>       <el-menu :default-active="activeIndex" class="el-menu-header" mode="horizontal" @select="handleSelect">         <el-menu-item index="1"><router-link :to="{path: '/yun/index' }">首页</router-link></el-menu-item>         <el-menu-item index="2"><router-link :to="{path: '/yun/list' }">服务器列表</router-link></el-menu-item>         <el-menu-item index="3">控制台</el-menu-item>         <el-menu-item index="4">消息中心</el-menu-item>         <el-menu-item index="5"><router-link :to="{path: '/yun/about' }">关于我们</router-link></el-menu-item>         <el-menu-item @click="toLogin()" v-if="userName === ''">登录</el-menu-item>         <el-menu-item>         <el-dropdown>           <span class="el-dropdown-link" v-if="userName !== ''">             {{ userName }}<i class="el-icon-arrow-down el-icon--right"></i>           </span>           <el-dropdown-menu slot="dropdown" v-if="userName!==''"> <!--            <el-dropdown-item>登录</el-dropdown-item>-->             <el-dropdown-item @click.native="toLogout">退出</el-dropdown-item>           </el-dropdown-menu>         </el-dropdown>         </el-menu-item>       </el-menu>     </el-header>     <el-container  style="height: 620px; border: 1px solid #eee">       <el-aside width="200px">         <el-menu           default-active="1"           class="el-menu-vertical-demo"           @open="handleOpen"           @close="handleClose">           <el-submenu index="1">             <template slot="title">               <i class="el-icon-location"></i>               <span>服务器列表</span>             </template>             <el-menu-item-group>               <template slot="title">分组一</template>               <el-menu-item index="1-1">选项1</el-menu-item>               <el-menu-item index="1-2">选项2</el-menu-item>             </el-menu-item-group>             <el-menu-item-group title="分组2">               <el-menu-item index="1-3">选项3</el-menu-item>             </el-menu-item-group>             <el-submenu index="1-4">               <template slot="title">选项4</template>               <el-menu-item index="1-4-1">选项1</el-menu-item>             </el-submenu>           </el-submenu>           <el-menu-item index="2">             <i class="el-icon-menu"></i>             <span slot="title">导航二</span>           </el-menu-item>           <el-menu-item index="3" disabled>             <i class="el-icon-document"></i>             <span slot="title">导航三</span>           </el-menu-item>           <el-menu-item index="4">             <i class="el-icon-setting"></i>             <span slot="title">导航四</span>           </el-menu-item>         </el-menu>       </el-aside>       <el-container>         <el-main>           <div class="x-bar">             <div :id="id" :option="option"></div>           </div>         </el-main> <!--        <el-footer>--> <!--        </el-footer>-->       </el-container>     </el-container>   </el-container> </template> <script>     import { mapMutations } from 'vuex';     import Vuex from 'vuex' //引入 Vuex     import store from '../store'     import HighCharts from 'highcharts'     export default {         name: "YunMonitorServerv",         data() {           return {             userName: "",             activeIndex: '1',             arr: [],             chartData: [],             username: this.$route.query.data,             idForm: {               id: "1"             },             id: 'testtt',             option: {               chart: {                 zoomType: 'x'               },               title: {                 text: 'cpu.0.percent.active'//表头文字               },               subtitle: {                 text: document.ontouchstart === undefined ?                   '鼠标拖动可以进行缩放' : '手势操作进行缩放'               },               xAxis: {                 type: 'datetime',                 dateTimeLabelFormats: {                   millisecond: '%H:%M:%S.%L',                   second: '%H:%M:%S',                   minute: '%H:%M',                   hour: '%H:%M',                   day: '%m-%d',                   week: '%m-%d',                   month: '%Y-%m',                   year: '%Y'                 }               },               tooltip: {                 dateTimeLabelFormats: {                   millisecond: '%H:%M:%S.%L',                   second: '%H:%M:%S',                   minute: '%H:%M',                   hour: '%H:%M',                   day: '%Y-%m-%d',                   week: '%m-%d',                   month: '%Y-%m',                   year: '%Y'                 }               },               yAxis: {                 title: {                   text: '使用率'                 }               },               legend: {                 enabled: false               },               plotOptions: {                 area: {                   fillColor: {                     linearGradient: {                       x1: 0,                       y1: 0,                       x2: 0,                       y2: 1                     },                     stops: [                       [0, HighCharts.getOptions().colors[0]],                       [1, HighCharts.Color(HighCharts.getOptions().colors[0]).setOpacity(0).get('rgba')]                     ]                   },                   marker: {                     radius: 2                   },                   lineWidth: 1,                   states: {                     hover: {                       lineWidth: 1                     }                   },                   threshold: null                 }               },               series: [{                 type: 'area',                 name: '使用率',                 data: [                 ]               }]             }           }         },         created() {         },         mounted() {           this.showCharts();         },         methods: {           ...mapMutations(['changeLogin']),           toLogout() {             localStorage.removeItem('Authorization');             localStorage.removeItem('Username');             this.$router.push(               {                 path: "/yun/login",               }             )           },           toLogin() {             this.$router.push(               {                 path: "/yun/login",               }             )           },           showCharts() {             this.flag = true             this.$http.get('http://localhost:8088/monitor/query/lidata-DL/cpu.0.percent.active/1600672572/1600672629',{               _timeout:5000,               onTimeout :(request) => {                 this.$message.error('请求超时');                 this.loading = false               }             }).then((response) => {               var res = JSON.parse(response.bodyText);               this.loading = false;               this.records = res.records;               var arr = res.records;               for(var i = 0;i < arr.length;i++){                  this.chartData.push(arr[i]);               }               var oSeries = {                   type: 'area',                   name: '功率',                   data: this.chartData               };               HighCharts.chart(this.id,this.option).addSeries(oSeries);             })           },           toVmDetail(url){             window.open(url)           },           handleSelect(key, keyPath) {             console.log(key, keyPath);           },           handleOpen(key, keyPath) {             console.log(key, keyPath);           },           handleClose(key, keyPath) {             console.log(key, keyPath);           },         }     } </script>

原本要求的数据格式是二维数组

series: [{     type: 'area',     name: 'area',     data: [         [1370131200000, 0.7695],         [1370217600000, 0.7648]     ] }]

然后get请求的数据返回的时候直接返回二维数组就行了

需要注意的就是二维数组的更新方式

有的时候,当我们手动对data中的数据修改时,vue却监听不到这些数据的变化,导致页面没有触发新一轮的更新。

注意:出现以上问题的原因在于,没有通过vue提供的方法对保存在data中的数据进行修改。强制性通过js对数据修改的那些方法,有一部分在vue中是不被认可的。

对于数组的更新,一种可以使用

pop 删除末项

push 添加一项

shift 删除第一项

unshift 添加第一项

splice 截取/修改/删除数组元素

sort 对数组排序

reverse 取反

另一种则可以通过set方法()

this.set 这是vue实例调用 set 这是vue实例调用set这是vue实例调用set()方法,专门用来修改数组的
第一个参数,已经存在data中的数据,要被修改的数组
第二个参数,要修改的数组下标
第三个参数,要修改的数组对应下标的值

this.$set (this.selectedarr, index, option)



VUE 数据 展示 动态 Vue.js js Highcharts

需要 登录 后方可回复, 如果你还没有账号请 注册新账号