美文网首页
vue中SignalR全局封装

vue中SignalR全局封装

作者: 不语u | 来源:发表于2021-11-26 16:03 被阅读0次

一、SignalR

是什么我就不多说了,可自行去官网查阅

二、使用步骤

1.安装signalr,无需安装其他如jquery之类的

cnpm install @aspnet/signalr 

2.新建一个名为signalR.js的文件

import * as signalR from "@aspnet/signalr";
export default {
  SR: {},
  //初始化连接
  initSR: function() {
    let that = this;
    if (!localStorage.userInfo) return;
    let userInfo = JSON.parse(localStorage.userInfo);
    // 1.获取系统中定义的baseURL
    let url = window.PLATFROM_CONFIG.baseURL.replace(/http:/g, "");
    // 2.初始化连接
    that.SR = new signalR.HubConnectionBuilder()
      .withUrl(url + "signalr", {
        accessTokenFactory: () => encodeURI(userInfo.encryptedAccessToken),
      })
      .configureLogging(signalR.LogLevel.Information)
      .build();
    // 3.携带参数
    that.SR.qs = {
      enc_auth_token: encodeURI(userInfo.encryptedAccessToken),
    };
    // 4.启动连接的方法
    async function start() {
      try {
        await that.SR.start();
        console.log("signaR连接成功");
      } catch (err) {
        console.log("err", err);
        setTimeout(start, 5000);
      }
    }
    // 5.关闭之后重连
    that.SR.onclose(async () => {
      await start();
    });
    // 6.启动连接
    start();
  },
  // 停止连接(这个方法好像没啥用,先放着吧)
  stopSR: function() {
    let that = this;
    async function stop() {
      try {
        await that.SR.stop();
        console.log("signaR退出成功");
      } catch (err) {}
    }
    stop();
  },
};

3.在main.js中引入并挂载到全局

import signaR from "signaR的路径";
Vue.prototype.signaR = signaR;

4.初始化
我的需求是登陆之后连接服务器,所以我将初始化连接(initSR)的步骤放在了登陆成功获取到token时

this.signaR.initSR();

但同时我又发现,当界面刷新时,由main.js中全局挂载的signaR会消失,所以需要在App.vue中再初始化一遍

  mounted() {
    // 初始化signaR连接
    this.signaR.initSR()
  },

5.使用
我的需求是订阅服务器中getNotification这个主题,当服务器那边任务处理完成时,就会给我发送一条消息,我拿到这条消息并根据消息内容进行下面的工作

  mounted() {
    this.signaR.SR.on('getNotification', function (notification) {
      // 接收后要做的事
      console.log('getNotification', notification)
    })
  }

特别注意:当此组件生命周期结束时,记得销毁注册的这个方法,不然会导致重复触发上面这个回调(我尝试了官网中所用的off方法,无效,所以自己手动清空这个数组,有更好的方法麻烦也告知一下)

  destroyed() {
    // 手动销毁此主题,不然会反复订阅,反复触发getnotification
    this.signaR.SR.methods.getnotification = []
  },

相关文章

  • vue中SignalR全局封装

    一、SignalR 是什么我就不多说了,可自行去官网[https://docs.microsoft.com/en-...

  • Vue 全局组件封装

    在Vue项目的开发中,我们需要对一些常用的组件进行封装复用,这时我们需要用到Vue提供的全局组件API来封装我们的...

  • vue打包app做文件下载功能

    //全局封装的下载方法Vue.prototype.downLoad=function(data){constu=n...

  • vue封装全局组件

    首先写是需要封装的组件 NavBarTitle.vue 然后在同目录创建一个NavBarTitle.js文件Nav...

  • 微信小程序 wx.request 全局封装 并使用 Async

    之前有写过request封装,本次写一个像 react、vue 一样使用 Async await 的全局封装 在 ...

  • 2018-05-13 vue 组件方面

    组件可以扩展 HTML 元素,封装可重用的代码。 全局组件: Vue.c...

  • vue组件

    vue组件 标签(空格分隔): vue 组件可以扩展HTML元素,封装可重用代码。 注册 组件的注册有两种: 全局...

  • 14Vue- 组件引入

    为了扩展HTML元素,封装可重用的代码组件的注册方式:a. 全局组件:Vue.component来创建:Vue.c...

  • Element-UI库的BackTop组件的二次封装

    封装Backtop全局组件 components组件文件中新建backtop文件夹然后新建BackTop.vue ...

  • vue之全局组建封装

    很久没更新内容了,最主要是人懒,(꒦_꒦) ! 今天开始总结这一年在工作中的点滴积累,已供以后查阅! VUE 已经...

网友评论

      本文标题:vue中SignalR全局封装

      本文链接:https://www.haomeiwen.com/subject/fbqxxrtx.html