您好,登錄后才能下訂單哦!
今天小編給大家分享一下VUE3+mqtt如何封裝解決多頁面使用需重復連接等問題的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
在做的一個項目中多個頁面都需要使用到mqtt接收消息,但這樣的話每個頁面就都需要連接一次mqtt,并且要再次配置options信息、訂閱主題、接收消息,非常的不方便,因此琢磨將mqtt封裝到vuex中,使其可以多頁面通用,這樣只需要連接訂閱一次,接收到的消息可以存儲在vuex中。
npm install mqtt
使用export default暴露出app
import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' const app = createApp(App) app.use(ElementPlus) app.use(store).use(router).mount('#app') export default app
將mqtt服務封裝到VUEX中,可以解決多頁面需要用到mqtt接收消息時,每個頁面都要再次配置、連接、訂閱主題等問題
import { createStore } from 'vuex' import main from "../main";//main.ts文件中要暴露app import router from '@/router';// 引入vuex export default createStore({ state: { topics: [],//訂閱話題 }, mutations: { //mqtt服務 MQTT_SERVICE(state, event){ // mqtt連接成功 main.config.globalProperties.$mqtt.on('connect', (e) => { console.log('連接成功:', e) // console.log(state.topics) main.config.globalProperties.$mqtt.subscribe(state.topics, { qos: 1 }, (error) => { if (!error) { console.log('訂閱成功') } else { console.log('訂閱失敗') } }) }) // 接收消息處理 main.config.globalProperties.$mqtt.on('message', (topic, message) => { console.log('收到來自', topic, '的消息', message.toString()) }) // 斷開發起重連 main.config.globalProperties.$mqtt.on('reconnect', (error) => { console.log('正在重連:', error) }) // 鏈接異常處理 main.config.globalProperties.$mqtt.on('error', (error) => { console.log('連接失敗:', error) }) }, //發布消息 MQTT_PUBLISH(state, {topic, msg}){ console.log(topic) main.config.globalProperties.$mqtt.publish(topic, msg) }, //斷開MQTT MQTT_CLOSE(state, event){ console.log('斷開MQTT'); main.config.globalProperties.$mqtt.end() }, }, actions: { }, modules: { } })
在src下的utils下新建一個js文件:mqttConfig.js
import $store from "@/store/index"; export function getOptions(){ let options = { connectTimeout: 40000, clientId: 'mqttId', clean: true, username: admin, password: admin } return options } export function setTopics(){ //此處修改VUEX中的值建議通過actions、mutations修改state值 $store.state.topics = [ 'topic01','topic02','topic03''topic04''topic05'] }
這里是在一個所有頁面都要用到的一個公共組件中引入使用的,也可以在main.js中使用(看引入方法二)
方法一:公共組件中引入
import { computed, reactive, ref ,defineComponent, onMounted, onUnmounted } from 'vue-demi'; import $store from "@/store/index";//引入VUEX import main from "../main";//main.ts文件中要暴露app import { getOptions, setTopics } from "@/utils/mqttConfig.js" import mqtt from 'mqtt'//引入mqtt //mqtt鏈接地址 let mqttUrl = 'ws://broker.emqx.io:8084' export default defineComponent ({ name:'msgDisplay', setup(){ onMounted(() => { //mqtt連接 main.config.globalProperties.$mqtt = mqtt.connect(mqttUrl, getOptions()) //設置訂閱主題 setTopics() //啟動mqtt狀態監聽 $store.commit('MQTT_SERVICE') }) onUnmounted(() => { $store.commit('MQTT_CLOSE') //斷開mqtt }) return { } } }) </script>
方法二:main中引入
該方法需要在main中創建連接,在首頁的渲染生命周期中啟動mqtt狀態監聽
main.js:
import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' const app = createApp(App) import mqtt from 'mqtt' import { getOptions, setTopics } from "./utils/mqttConfig.js" let mqttUrl = 'ws://broker.emqx.io:8084' //mqtt連接 app.config.globalProperties.$mqtt = mqtt.connect(mqttUrl, getOptions()) //設置訂閱主題 setTopics() app.use(ElementPlus) app.use(store).use(router).mount('#app') export default app
首頁.vue:
<script> import { onMounted, defineComponent, onUnmounted } from 'vue'; import $store from "@/store/index"; export default defineComponent ({ setup(){ onMounted(() => { //啟動mqtt狀態監聽 $store.commit('MQTT_SERVICE') }) onUnmounted(() => { //關閉項目時斷開mqtt //此處僅適用于從首頁跳轉到下一個頁面后首頁沒有被銷毀的情況,其它情況自行修改 $store.commit('MQTT_CLOSE') }) } }) </script>
以上就是“VUE3+mqtt如何封裝解決多頁面使用需重復連接等問題”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。