react + @reduxjs/toolkit + mqtt 实现实时通讯

这里只写单一切片

因为在RTK reducer中,状态被immer库包装在代理对象中以检测修改。在缩减程序完成后,该代理对象将被撒销,以防止内存泄漏。所以这里需要使用异步的方式实现!


//创建小仓库节点
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"
import * as mqtt from 'mqtt/dist/mqtt' //mqtt
import { mqttUrl } from "../tools/common"


//订阅主题列表
const subscribeList = ['byd']

// 创建一个异步的action
export const fetchHomeMultidataAction = createAsyncThunk(
    "fetch/homemultidata",
    // 有传递过来两个个参数, 从store里面解构拿到dispatch
    async (extraInfo, { dispatch }) => {
        // 1.发送网络请求获取数据
        const client = mqtt.connect(mqttUrl)
        // mqtt连接
        client.on('connect', (e) => {
            console.log('连接成功:', mqttUrl)
            dispatch(changeConnectState(true))
            //订阅DT模块数据的消息
            subscribeList.forEach(it => {
                client.subscribe(it, { qos: 0 }, (error) => {
                    if (error) {
                        console.log(`订阅失败${it}`)
                        return
                    }
                })
            })
        })

        // 接收消息处理
        client.on('message', (topic, message) => {
            dispatch(accept_mqtt_data({[topic]:message.toString()}))
        })

        // 断开发起重连
        client.on('reconnect', (error) => {
            console.log('正在重连:', error)
        })

        // 链接异常处理
        client.on('error', (error) => {
            console.log('连接失败:', error)
            dispatch(changeConnectState(false))
        })
    }
)

//初始数据
const initialState = {
    //连接对象
    client: null,
    //当前传输数据
    mqtt_data: null,
    //是否连接
    mqtt_isConnect: false
}

//处理方法
const reducers = {
    //接收数据
    accept_mqtt_data(state, { payload }) {
        state.mqtt_data = payload
    },

    //切换连接状态
    changeConnectState(state, { payload }) {
        state.mqtt_isConnect = payload
    }
}

const stateSlice = createSlice({
    name: 'mqtt',
    initialState,
    reducers
})

export const { accept_mqtt_data, changeConnectState } = stateSlice.actions
export default stateSlice.reducer

上面只使用到了mqtt的接收,并没涉及到订阅, 如后续有需要再添加!

注意点: 在异步函数中dispatch调用的函数需要导出,不然找不到!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值