微信小程序--通过webSocket获取消息、监听数据、封装全局顶部消息通知

微信小程序–通过webSocket获取消息、监听数据、封装全局顶部消息通知

连接webSocket

推荐使用 SocketTask 的方式去管理 webSocket 链接,每一条链路的生命周期都更加可控,同时存在多个 webSocket 的链接的情况下使用 wx 前缀的方法可能会带来一些和预期不一致的情况。

在这里插入图片描述

这里推荐使用微信官方建议的SocketTask去管理webSocket链接,由于后面要做顶部消息提示,所以放到了app.js去处理。

// app.js
const { WS_API } = require('./utils/util')
App({
  onLaunch() {

  },
  connectWS() {
    let SocketTask
    let userInfo = wx.getStorageSync('userInfo')
    if (userInfo.uid) {
      SocketTask = wx.connectSocket({
        url: WS_API + userInfo.uid,
        success: (result) => {
          console.log(result, '连接成功')
        }
      })
      SocketTask.onOpen((res) => {
        console.log('连接成功')
      })
      SocketTask.onMessage(({ data }) => {
        if (data === '连接成功') return
        console.log(data, '接受到的数据')
        this.globalData.notify = data
      })
      SocketTask.onClose(() => {
        console.log('连接断开')
        this.connectWS()
      })
      SocketTask.onError((fail) => {
        console.log(fail, '连接失败')
      })
    }
  },
  globalData: {
    isLogin: false,
    notify: ''
	}
})

定义了连接的方法,接下来就是什么时候去调用了,这里放到了用户登录成功之后,改变app.js定义的全局参数,通过在app.js中监听这个参数的变化去调用连接。
在这里插入图片描述

监听数据

onLaunch() {
	// 这里当小程序重启的时候判断登录状态是否有效,有效则重连,失效则重新登录
    wx.checkSession({
      success: (res) => {
          if (res.errMsg === 'checkSession:ok') {
          this.connectWS()
        }
      },
      fail: (fail) => {
        wx.showModal({
          title: '提示',
          content: '登录状态失效请重新登录',
          showCancel: false,
          confirmText: '重新登陆',
          complete: () => {
            wx.clearStorageSync()
            wx.reLaunch({
              url: '/pages/login/login'
            })
          }
        })
      }
    })
    // 这里去监听全局参数isLogin的变化,为true调用方法连接
    Object.defineProperty(this.globalData, 'isLogin', {
      set: (val) => {
        if (val) {
          this.connectWS()
        }
      }
    })
  },

到这里在全局连接webSocket就做好了,接下来就是封装消息通知组件,将接收到的数据展示出来。

在这里插入图片描述

封装全局顶部消息通知

新建自定义组件,通知样式可根据自身情况封装,主要在js文件中去监听app.js中获取到的数据,并显示出来。

<!--components/myNotify/myNotify.wxml-->
<view class="myNotify_container">
  <van-transition 
    name="fade-down"
    show="{{show}}"
  >
    <view class="container_box">
      <van-icon name="circle" />
      <text class="container_boxText">{{text}}</text>
    </view>
  </van-transition>
</view>
/* components/myNotify/myNotify.wxss */
.myNotify_container {
  position: absolute;
  top: 7%;
  left: 50%;
  transform: translate(-50%,-50%);
  font-family: PingFangSC, PingFang SC;
  font-style: normal;
  width: 50%;
  z-index: 999;
}
.container_box {
  background-color: #fff;
  font-size: 24rpx;
  padding: 12rpx 20rpx;
  border-radius: 16rpx;
  box-shadow: inset 0rpx 0rpx 4rpx 4rpx rgba(0,0,0,0.05);
  color: #000;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  overflow: hidden;
  line-height: 50rpx;
}
.container_boxText {
  margin-left: 5rpx;
}
// components/myNotify/myNotify.js
const app = getApp()
Component({

  /**
   * 组件的属性列表
   */
  properties: {

  },
  observers: {
    'show': function (val) {
      if (val) {
      	// 设置只显示1.5s
        setTimeout(() => {
          this.setData({
            show: false
          })
        }, 1500);
      }
    }
  },
  lifetimes: {
    attached: async function () {
    // 监听 app.js 中的全局参数也就是获取到的数据 notify
      Object.defineProperty(app.globalData, 'notify', {
        set: (val) => {
          console.log(val, '监听到app数值变化')
          this.changeShow(val)
        }
      })
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
    show: false,
    text: ''
  },


  /**
   * 组件的方法列表
   */
  methods: {
    changeShow(text) {
      setTimeout(() => {
        this.setData({
          show: true,
          text
        })
      }, 1500);
    },
  }
})
{
  "component": true,
  "usingComponents": {
    "van-transition": "@vant/weapp/transition/index",
    "van-icon": "@vant/weapp/icon/index"
  }
}

使用

需要将组件挂载到要显示的页面,如果页面很多可以直接在app.json中全局注册组件。
在这里插入图片描述
然后直接在想要使用的页面直接挂载就好了。
在这里插入图片描述

实现效果

在这里插入图片描述

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
uniapp是一种跨平台的开发框架,可以用于开发手机应用程序。为了实现全局消息推送提示功能,可以结合vuex和websocket技术。 首先,我们可以使用vuex来管理应用程序的状态。vuex是一种专门用于Vue.js开发的状态管理模式,它可以将组件之间共享的状态集中管理,并且可以实现数据的响应式更新。 在vuex中,我们可以创建一个全局消息状态,包括未读消息的数量和消息列表。当收到新的消息时,可以通过vuex的方法来更新这些状态。组件可以通过vuex的计算属性或者方法来获取当前的未读消息数量和消息列表。 接下来,我们可以使用websocket来实现实时的消息推送功能。websocket是一种在客户和服务器之间进行双向通信的协议,它可以实现实时的数据传输。 在uniapp中,我们可以使用uni-app-plus插件来支持websocket的使用。可以在应用程序的入口文件中创建一个websocket连接,并且监听消息的入站事件。当收到新的消息时,可以通过websocket发送一个vuex的mutation来更新消息状态。 在组件中,可以监听vuex中消息状态的变化,并且在有新消息到达时显示一个推送提示。可以使用uni-app的原生弹框组件或者自定义样式来实现这个推送提示。 总结起来,使用uniapp开发手机app,结合vuex和websocket可以实现全局消息推送提示功能。通过vuex管理应用程序的状态,通过websocket实现实时的消息传输,结合组件的监听和显示,实现全局消息推送提示的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT·韩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值