当前位置:   article > 正文

vue3类型uniapp调用signalr_uniapp signalr

uniapp signalr

目录

背景

安装

renderjs

1选择一个tab页面承载renderjs代码

2编写业务逻辑代码

3编写renderjs代码


背景

后端使用.net6开发,长链接选择了微软的signalr而非原生的websocket

前端uniapp下vue3类型开发的app,需要通过长链接获取后端推送的消息

安装

npm install @microsoft/signalr

虽然安装和前端一样,但是无法像前端一样使用

renderjs

uniapp提供renderjs来帮助完成操作DOM、运行web端js库等功能

https://uniapp.dcloud.net.cn/tutorial/renderjs.html#renderjsuni-app,uniCloud,serverlesshttps://uniapp.dcloud.net.cn/tutorial/renderjs.html#renderjs这里signalr作为web端的js库 就必须使用这种方法

官方使用的示例是以echarts库作为示例的,可以下载示例项目参考代码

1 选择一个tab页面承载renderjs代码

这里我们选择[我的]'mine'页面

注意选择的tab页面需要是登录后首先进入的页面!因为需要用onMounted来启动signalr!

并在页面上添加元素

<view id='token' v-show='false'>{{token}}</view>

因为renderjs代码是无法调用uniapp的api的,所以只能通过这种方式获取缓存中的token

2 编写业务逻辑代码

注意:不支持<script setup>

vue3的话 必须使用setup函数,并且将renderjs调用的函数return出去

  1. <script>
  2. export default {
  3. setup() {
  4. //提供给renderjs调用的函数
  5. const test = param => {
  6. //用来处理业务逻辑
  7. console.log('test',param}
  8. }
  9. return{
  10. test
  11. }
  12. }
  13. }
  14. </script>

3 编写renderjs代码

renderjs里面封装signalr相关的代码

这里需要新建一个<script>标签,即同一个页面有两个script标签!

  1. <script lang="renderjs" module="signalr">
  2. const signalR = require("@microsoft/signalr");
  3. export default {
  4. data() {
  5. return {
  6. connection: null,
  7. connected: false,//当前signalr是否连接上
  8. token: ''//连接signalr 后台需要token身份验证
  9. }
  10. },
  11. mounted() {
  12. setInterval(() => {
  13. this.start()
  14. }, 10 * 1000)
  15. },
  16. methods: {
  17. start() {
  18. let token = document.getElementById('token').innerHTML
  19. if (!token) {
  20. this.clear()
  21. return
  22. } else {
  23. if (token === this.token) {
  24. //token没变
  25. if (this.connection) {
  26. if (!this.connected) {
  27. // 还没连上 重新连
  28. this.connect()
  29. }
  30. } else {
  31. this.init(token)
  32. this.connect()
  33. }
  34. } else {
  35. //token变了 重新建立连接!
  36. this.token = token
  37. this.clear()
  38. this.init(token)
  39. this.connect()
  40. }
  41. }
  42. },
  43. clear() {
  44. //清空signalr
  45. this.disconnect()
  46. this.connection = null
  47. },
  48. async connect() {
  49. //连接signalr
  50. try {
  51. await this.connection.start()
  52. this.connected = true
  53. } catch (err) {
  54. this.connected = false
  55. }
  56. },
  57. async disconnect() {
  58. if (this.connection) {
  59. await this.connection.stop()
  60. this.connected = false
  61. } else {
  62. this.connected = false
  63. }
  64. },
  65. init(token) {
  66. this.connection = new signalR.HubConnectionBuilder()
  67. .withUrl(你的服务器signalrUrl, {
  68. accessTokenFactory: () => token
  69. })
  70. .configureLogging(signalR.LogLevel.Information)
  71. .build();
  72. this.connection.onclose(async error => {
  73. this.connected = false
  74. })
  75. this.connection.on(你的signalr方法名称, res => {
  76. //!!重要!! 调用实际业务逻辑方法(之前定义的test方法)
  77. this.$ownerInstance.callMethod('test', res)
  78. })
  79. }
  80. }
  81. }
  82. </script>

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/123958
推荐阅读
相关标签
  

闽ICP备14008679号