您好,登錄后才能下訂單哦!
這篇文章主要介紹“VUE3+mqtt怎么封裝解決多頁面使用需重復連接等問題”,在日常操作中,相信很多人在VUE3+mqtt怎么封裝解決多頁面使用需重復連接等問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。