亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新

Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新

發布時間:2023-05-11 14:54:21 來源:億速云 閱讀:125 作者:iii 欄目:開發技術

這篇文章主要介紹“Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新”,在日常操作中,相信很多人在Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

先看下后臺返回的數據結構是什么樣子的

[
  {
    "name":"商家1",
    "value":"99"
  },
  {
    "name":"商家2",
    "value":"199"
  },
  {
    "name":"商家3",
    "value":"222"
  },
  {
    "name":"商家4",
    "value":"99"
  },
  {
    "name":"商家5",
    "value":"499"
  },
  {
    "name":"商家6",
    "value":"252"
  },
  {
    "name":"商家7",
    "value":"199"
  },
  {
    "name":"商家8",
    "value":"29"
  },
  {
    "name":"商家9",
    "value":"232"
  },{
    "name":"商家10",
    "value":"99"
  },
  {
    "name":"商家11",
    "value":"77"
  },
  {
    "name":"商家12",
    "value":"82"
  },
  {
    "name":"商家13",
    "value":"99"
  },
  {
    "name":"商家14",
    "value":"19"
  },
  {
    "name":"商家15",
    "value":"22"
  },
  {
    "name":"商家16",
    "value":"522"
  }
]

開始實現前端的代碼

html

<div class="com-page">
<div class="com-container">
  <div class="com-chart" ref="seller_ref"></div>
</div>
</div>

css

html,body,#app{
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  overflow: hidden;
}
.com-page {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

.com-container {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
}

.com-chart {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

data

data() {
    return {
      chartInstance: null,  //初始化echartInstance對象
      allData: null,    //接收的后臺數據
      currentPage: 1, //當前顯示的頁數
      totalPage: 0, //一共有多少頁
      timerId: null //定時器標識
    }
  },

methods

initChart方法

initChart() {
     //初始化echartInstance對象
     //chalk是我們定義的主題,echarts官方有案例,怎么使用可以百度一下,不喜歡可以直接刪掉
      this.chartInstance = this.$echarts.init(this.$refs.seller_ref, 'chalk')
      //對圖表初始化配置對控制
      const initOption = {
        title: {
          text: '▎商家銷售統計',
          left: 20,
          top: 20
        },
        grid: {
          top: '20%',
          left: '3%',
          right: '6%',
          bottom: '3%',
          containLabel: true // 距離是包含坐標軸上的文字
        },
        xAxis: {
          type: 'value'
        },
        yAxis: {
          type: 'category'
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'line',
            z: 0,
            lineStyle: {
              color: '#2D3443'
            }
          }
        },
        series: [{
          type: 'bar',
          label: {
            show: true,
            position: 'right',
            textStyle: {
              color: 'white'
            }
          },
          itemStyle: {
            // 指明顏色漸變的方向
            // 指明不同百分比之下顏色的值
            color: new this.$echarts.graphic.LinearGradient(0, 0, 1, 0, [
              // 百分之0狀態之下的顏色值
              {
                offset: 0,
                color: '#5052EE'
              },
              // 百分之100狀態之下的顏色值
              {
                offset: 1,
                color: '#AB6EE5'
              }
            ])
          }
        }]
      }
      this.chartInstance.setOption(initOption)
      //對圖表對象進行鼠標事件監聽
      //鼠標移入,定時器停止
      this.chartInstance.on('mouseover', () => {
        clearInterval(this.timerId)
      })
      //鼠標移出,定時器開始
      this.chartInstance.on('mouseout', () => {
        this.startInterval()
      })
    },

getData方法

這里還是用http請求獲取的數據,后面我再講怎么用WebSocket獲取我們的數據

 async getData() {
      const {
        data: res
      } = await this.$http.get('seller')
      this.allData = res
      //對數據進行排序
      this.allData.sort((a, b) => {
        return a.value - b.value //從小到大排序
      })
      //每五個元素顯示一頁
      this.totalPage = this.allData.length % 5 === 0 ? this.allData.length / 5 : this.allData.length / 5 + 1
      this.updateChart()
      //啟動定時器
      this.startInterval()
    },

updateChart方法

//更新圖表
    updateChart() {
      //起始的位置
      const start = (this.currentPage - 1) * 5 
      //結束的位置
      //起始為0,所以展示1-5
      const end = this.currentPage * 5 
      const showData = this.allData.slice(start, end)
      const sellerNames = showData.map((item) => {
        return item.name
      })
      const sellerValue = showData.map((item) => {
        return item.value
      })
      const dataOption = {
        yAxis: {
          data: sellerNames
        },
        series: [{
          data: sellerValue
        }]
      }
      this.chartInstance.setOption(dataOption)
    },

startInterval方法

//定時器,數據每3秒更新一次
 startInterval() {
      if (this.timerId) {
        clearInterval(this.timerId)
      }
      this.timerId = setInterval(() => {
        this.currentPage++
        if (this.currentPage > this.totalPage) {
          this.currentPage = 1
        }
        this.updateChart()
      }, 3000)
    },

screenAdapter方法

 //屏幕適配
    screenAdapter() {
      const titleFontSize = this.$refs.seller_ref.offsetWidth / 100 * 3.6
      console.log(titleFontSize)
      const adapterOption = {
        title: {
          textStyle: {
            fontSize: titleFontSize
          }
        },
        tooltip: {
          axisPointer: {
            lineStyle: {
              width: titleFontSize
            }
          }
        },
        series: [{
          barWidth: titleFontSize,
          //圓角大小
          itemStyle: {
            barBorderRadius: [0, titleFontSize / 2, titleFontSize / 2, 0],
          }
        }]
      }
      this.chartInstance.setOption(adapterOption)
      //手動調用圖表對象resize
      this.chartInstance.resize()
    }

mounted

  mounted() {
    this.initChart()
    this.getData()
    window.addEventListener('resize', this.screenAdapter)
    this.screenAdapter()
  },

destroyed

  destroyed() {
    clearInterval(this.timerId)
    window.removeEventListener('resize', this.screenAdapter)
  },

好了,完事

下面我把如何用WebSocket獲取數據說一下

封裝了一個WebSocket

export default class SocketService {
  /**
   * 單例
   */
  static instance = null
  static get Instance() {
    if (!this.instance) {
      this.instance = new SocketService()
    }
    return this.instance
  }

  // 和服務端連接的socket對象
  ws = null

  // 存儲回調函數
  callBackMapping = {}

  // 標識是否連接成功
  connected = false

  // 記錄重試的次數
  sendRetryCount = 0

  // 重新連接嘗試的次數
  connectRetryCount = 0

  //  定義連接服務器的方法
  connect() {
    // 連接服務器
    if (!window.WebSocket) {
      return console.log('您的瀏覽器不支持WebSocket')
    }
    this.ws = new WebSocket('ws://localhost:9998')

    // 連接成功的事件
    this.ws.onopen = () => {
      console.log('連接服務端成功了')
      this.connected = true
      // 重置重新連接的次數
      this.connectRetryCount = 0
    }
    // 1.連接服務端失敗
    // 2.當連接成功之后, 服務器關閉的情況
    this.ws.onclose = () => {
      console.log('連接服務端失敗')
      this.connected = false
      this.connectRetryCount++
      setTimeout(() => {
        this.connect()
      }, 500 * this.connectRetryCount)
    }
    // 得到服務端發送過來的數據
    this.ws.onmessage = msg => {
      console.log('從服務端獲取到了數據')
      // 真正服務端發送過來的原始數據時在msg中的data字段
      // console.log(msg.data)
      const recvData = JSON.parse(msg.data)
      const socketType = recvData.socketType
      // 判斷回調函數是否存在
      if (this.callBackMapping[socketType]) {
        const action = recvData.action
        if (action === 'getData') {
          const realData = JSON.parse(recvData.data)
          this.callBackMapping[socketType].call(this, realData)
        } else if (action === 'fullScreen') {
          this.callBackMapping[socketType].call(this, recvData)
        } else if (action === 'themeChange') {
          this.callBackMapping[socketType].call(this, recvData)
        }
      }
    }
  }

  // 回調函數的注冊
  registerCallBack (socketType, callBack) {
    this.callBackMapping[socketType] = callBack
  }

  // 取消某一個回調函數
  unRegisterCallBack (socketType) {
    this.callBackMapping[socketType] = null
  }

  // 發送數據的方法
  send (data) {
    // 判斷此時此刻有沒有連接成功
    if (this.connected) {
      this.sendRetryCount = 0
      this.ws.send(JSON.stringify(data))
    } else {
      this.sendRetryCount++
      setTimeout(() => {
        this.send(data)
      }, this.sendRetryCount * 500)
    }
  }
}

在main.js中進行連接,掛載原型

//對服務端進行連接
import SocketService from '../utils/socket_service'
SocketService.Instance.connect()
// 其他的組件  this.$socket
Vue.prototype.$socket = SocketService.Instance

然后在組件中

  created() {
    //在組件創建完成之后進行回調函數注冊
    this.$socket.registerCallBack('trendData',this.getData)
  },
  
   mounted() {
    this.initChart();
    //發送數據給服務器,告訴服務器,我現在需要數據
    this.$socket.send({
      action:'getData',
      socketType:'trendData',
      chartName:'trend',
      value:''
    })
    window.addEventListener("resize", this.screenAdapter);
    this.screenAdapter();
  },
  
  destroyed() {
    window.removeEventListener("resize", this.screenAdapter);
    //取消
    this.$socket.unRegisterCallBack('trendData')
  },
  methods:{
  //res就是服務端發送給客戶端的圖表數據
    getData(res) {
      this.allData = res;
      this.updateChart();
    },
    }

這樣就實現了后端發生變化,前端即時更新視圖

至于為什么WebSocket這樣封裝,因為后臺定了規則

const path = require('path')
const fileUtils = require('../utils/file_utils')
const WebSocket = require('ws')
// 創建WebSocket服務端的對象, 綁定的端口號是9998
const wss = new WebSocket.Server({
  port: 9998
})
// 服務端開啟了監聽
module.exports.listen = () => {
  // 對客戶端的連接事件進行監聽
  // client:代表的是客戶端的連接socket對象
  wss.on('connection', client => {
    console.log('有客戶端連接成功了...')
    // 對客戶端的連接對象進行message事件的監聽
    // msg: 由客戶端發給服務端的數據
    client.on('message',async msg => {
      console.log('客戶端發送數據給服務端了: ' + msg)
      let payload = JSON.parse(msg)
      const action = payload.action
      if (action === 'getData') {
        let filePath = '../data/' + payload.chartName + '.json'
        // payload.chartName // trend seller map rank hot stock
        filePath = path.join(__dirname, filePath)
        const ret = await fileUtils.getFileJsonData(filePath)
        // 需要在服務端獲取到數據的基礎之上, 增加一個data的字段
        // data所對應的值,就是某個json文件的內容
        payload.data = ret
        client.send(JSON.stringify(payload))
      } else {
        // 原封不動的將所接收到的數據轉發給每一個處于連接狀態的客戶端
        // wss.clients // 所有客戶端的連接
        wss.clients.forEach(client => {
          client.send(msg)
        })
      }
      // 由服務端往客戶端發送數據
      // client.send('hello socket from backend')
    })
  })
}

到此,關于“Vue怎么使用Echarts實現橫向柱狀圖并通過WebSocket即時通訊更新”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仙居县| 赫章县| 农安县| 兴业县| 青神县| 东光县| 庄浪县| 望江县| 汤阴县| 鹤岗市| 德庆县| 阿巴嘎旗| 瓦房店市| 林芝县| 鹤壁市| 华坪县| 镇原县| 封开县| 合江县| 阜新| 托里县| 沛县| 永安市| 邵阳市| 临邑县| 伊川县| 商丘市| 安吉县| 石景山区| 迭部县| 怀来县| 浪卡子县| 天水市| 塘沽区| 达尔| 永平县| 山东省| 新丰县| 金寨县| 青浦区| 达拉特旗|