Vue 結(jié)合 SignalR 實(shí)現(xiàn)前后端實(shí)時(shí)消息同步

前端要實(shí)現(xiàn)即時(shí)通訊一般要看后端使用的什么樣的語言。在公司的一個(gè)項(xiàng)目中需要根據(jù)數(shù)據(jù)庫(kù)變化數(shù)據(jù)變化,一開始使用定時(shí)器輪詢請(qǐng)求數(shù)據(jù),后來后端有時(shí)間搞即時(shí)通訊后,總算可以拋棄這種最暴力的做法了。
后端.net,即時(shí)通訊是用的SignalR 類庫(kù)。對(duì)于這個(gè)需要前端也進(jìn)行相對(duì)應(yīng)的設(shè)置。首先SignalR依賴jquery,需要在項(xiàng)目中先引入jquery,和signalr。我是在index.html中直接cdn映入的jquery。<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
然后再項(xiàng)目中的vue.config.js中配置

configureWebpack: {
    externals: {
      'jquery': '$',
      '@riophae/vue-treeselect': 'VueTreeselect'
    }
  },

然后安裝signalr,自己根據(jù)需要選擇npm還是cnpm。

npm i signalr
cnpm i signalr

安裝好后在main.js引入。這時(shí)候就可以在Vue項(xiàng)目中使用SignalR了

import 'signalr'

utils中新建一個(gè)signalr.js

import { Message } from 'element-ui'
import $ from 'jquery'
import global from './global'
import store from '../store'
const HUBNAME = '后臺(tái)定義的名字'

// 服務(wù)器調(diào)用客戶端方法
const printNewOrder = {
  name: '與后臺(tái)約定的方法',
  method: function() {
    store.dispatch('dashboard/getwarning').then((res) => {
      // console.log(res)
    }).catch(err => {
      console.log(err)
    })
  }
}

// 客戶端的方法
const clientMethodSets = [printNewOrder] // 將需要注冊(cè)的方法放進(jìn)集合

// 建立連接
export function startConnection() {
  // 后臺(tái)的url
  const hub = $.hubConnection(global.imgURL)
  const proxy = createHubProxy(hub) // 需要先注冊(cè)方法再連接
  hub.start().done((connection) => {
    // console.log(connection)
    console.log('現(xiàn)在已連接,連接ID=' + connection.id)
    store.dispatch('dashboard/getwarning').then((res) => {
      // console.log(res)
    }).catch(err => {
      console.log(err)
    })
  }).fail(() => {
    Message('連接失敗')
    // console.log('無法連接')
  })
  hub.error(function(error) {
    // Message('SignalR error: ' + error)
    console.log('SignalR error: ' + error)
  })
  hub.connectionSlow(function() { // 當(dāng)客戶端檢測(cè)到慢速或頻繁刪除連接時(shí)引發(fā)
    console.log('我們目前遇到連接困難.')
  })
  hub.disconnected(function() { // 當(dāng)連接已斷開連接時(shí)引發(fā)
    console.log('連接已斷開')
  })
  return proxy
}
// 手動(dòng)創(chuàng)建proxy
export function createHubProxy(hub) {
  const proxy = hub.createHubProxy(HUBNAME)
  // 注冊(cè)客戶端方法
  clientMethodSets.map((item) => {
    proxy.on(item.name, item.method)
  })
  return proxy
}

這樣,在組件引入signalr.js后調(diào)用startConnection方法即可建立連接。
index.vue中調(diào)用。我是將數(shù)據(jù)存在vuex當(dāng)中??梢愿鶕?jù)自己的需求去調(diào)用。

import { startConnection } from '@/utils/signalr'
import { mapState } from 'vuex'
computed: {
    ...mapState({
      warnList: state => state.dashboard.warnList
    })
  },
  watch: {
    warnList(val) {
      this.addwarningMarker()
    }
  },
created() {
    this.GetComDict()
    this.getAllData()
    // 即時(shí)通訊建立連接
    startConnection()
  },

好了?;揪褪沁@些。歡迎各位大神可以給點(diǎn)改進(jìn)意見。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容