国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

uni-app vue3 封裝socket 兼容微信小程序 釘釘小程序 H5 App 全局唯一

這篇具有很好參考價(jià)值的文章主要介紹了uni-app vue3 封裝socket 兼容微信小程序 釘釘小程序 H5 App 全局唯一。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

概要

前端小伙伴使用uni-app開(kāi)發(fā)長(zhǎng)連接通信的時(shí)候都會(huì)有以下疑問(wèn)

  • 在網(wǎng)上搜到的封裝socket都沒(méi)講怎么全局公用一個(gè)呢?
  • 同一個(gè) 子協(xié)議或者我我們叫type類(lèi)型型我想在兩個(gè)頁(yè)面都接受使用怎么做呢?

目前能搜到的socket 封裝好像都沒(méi)講清楚這個(gè)東西,或者壓根沒(méi)考慮
下面給大家詳細(xì)介紹下我封裝的方法 大家拿去就可以用。代碼在最后了

初始化 創(chuàng)建連接

  • 在合適的場(chǎng)景下創(chuàng)建 Socket 連接
  • 初始化后所有頁(yè)面均可使用
import socket from "@/components/lvSocket.js"
onLoad(()=>{ // 假設(shè)在onLoad周期需要初始化
	socket.connect();// 初始化 全局只需初始化一次
})
onUnload(()=>{
	socket.clearClose();// 關(guān)閉長(zhǎng)連接根據(jù)需要使用
})

接收事件

注意 type等于all時(shí)接收所有類(lèi)型參數(shù)

import socket from "@/components/lvSocket.js"

onLoad(()=>{ // 假設(shè)在onLoad周期需要初始化
	// 發(fā)送消息
	socket.send({
		"type": "msgList",// 傳輸類(lèi)型 
		"payLoad": {傳輸內(nèi)容}
	});
	socket.on("hei",shjian);// type=hei:接受hei類(lèi)型參數(shù)
	socket.on("hei",()=>{console.log('hei收到了')});// type=hei:接受hei類(lèi)型參數(shù)
	socket.on("heier",()=>{console.log('er收到了')});// type=heier:接受hei類(lèi)型參數(shù)
	socket.on("all",jieshouAll);// type=all:接受所有參數(shù) all為type類(lèi)型關(guān)鍵字
})

const shjian = (meg)=>{
	console.log('頁(yè)面收到hei數(shù)據(jù)',meg)
}

const jieshouAll = (meg)=>{
	console.log('服務(wù)端返回的所有數(shù)據(jù)都能接收到',meg)
}

// 頁(yè)面卸載清除事件回調(diào)
onUnload(()=>{
	socket.off();// 清空所有回調(diào)
	socket.off('hei');// 清除某個(gè)類(lèi)型所有回調(diào)
	socket.off('hei',jieshou);// 清除某個(gè)類(lèi)型中某個(gè)回調(diào)
})

示例

在兩個(gè)頁(yè)面 接受同一個(gè)類(lèi)型 也是互不影響的。 清除的時(shí)候別誤刪了其他事件哦

import socket from "@/components/lvSocket.js"
// index 頁(yè)面
	onLoad(()=>{
		socket.connect();// 初始化 全局只需初始化一次
		socket.on("hei",jieshou);// type=hei:接受hei類(lèi)型參數(shù)
		socket.on("all",jieshouAll);// type=all:接受所有參數(shù) all為type類(lèi)型關(guān)鍵字
	})
	
	const jieshou = (meg)=>{
		console.log('頁(yè)面收到數(shù)據(jù)',meg)
		socket.send({type:"pingaaaaa"});// 發(fā)送消息
	}
	const jieshouAll = (meg)=>{
		console.log('服務(wù)端返回的所有數(shù)據(jù)都能接收到',meg)
	}
	
	// 頁(yè)面卸載清除事件回調(diào)
	onUnload(()=>{
		socket.off();// 清空所有回調(diào)
		socket.off('hei');// 清除某個(gè)類(lèi)型所有回調(diào)
		socket.off('hei',jieshou);// 清除某個(gè)類(lèi)型中某個(gè)回調(diào)
		socket.clearClose();// 關(guān)閉長(zhǎng)連接根據(jù)需要使用
	})
	
// home頁(yè)面
	onLoad(()=>{
		socket.on("bookList",getBookList);// 接受參數(shù)
	})
	
	const getBookList = (meg)=>{
		console.log('頁(yè)面收到數(shù)據(jù)',meg)
	}
	
	// 頁(yè)面卸載清除事件回調(diào)
	onUnload(()=>{
		socket.off('bookList');// 清除某個(gè)類(lèi)型所有回調(diào)
	})
	

js代碼

在 src/components 路徑下創(chuàng)建 lvSocket.js 粘貼如下代碼到文件中
vue2使用請(qǐng)注意this指向問(wèn)題

/*
	假設(shè)后端響應(yīng)數(shù)據(jù)類(lèi)型是這樣的
	{ 
		type:'msglist',
		"payload":{
			... 數(shù)據(jù)在這里
		}
	}
	*/
/***
* @description: WebSocket 單例模式
* @author: lvhao
*/
class Socket {
	constructor() {
		this.socket = null;// socket實(shí)例
		this.isConnect = false;// 是否連接成功
		this.reconnectCount = 0;// 重連接次數(shù)
		this.reconnectTimer = null;// 重連定時(shí)器
		this.url = `ws://192.168.28.38:3000`
		this.isHandClose = false;// 是否是手動(dòng)關(guān)閉
		
		// 心跳定時(shí)器
		this.heartbeatInterval = null;
		
		// 收集事件綁定類(lèi)型
		this._map = new Map();
		
		// 收集未連接成功要發(fā)送的消息
		this._sendArr = [];
		
	}
	// 連接
	connect() {
		if (this.socket) return;// 正在連接
		const Token = uni.getStorageSync('Token');
		this.socket = uni.connectSocket({
			url:this.url,
			header: {
				"wsToken": `Bearer ${Token}`,
			},
			complete: ()=> {},
			multiple:true,
		})
		
		// 連接成功
		this.socket.onOpen(()=>{
			console.log("連接成功")
			this._onOpen();
		})
		// Socket 連接關(guān)閉事件
		this.socket.onClose(() => {
			console.log("連接關(guān)閉了")
			this._onClose();
		});
		// 監(jiān)聽(tīng) Socket 錯(cuò)誤事件
		this.socket.onError((err) => {
			console.log("Socket報(bào)錯(cuò)了",err)
			this._onError();
		});
		// 監(jiān)聽(tīng) WebSocket 接受到服務(wù)器的消息事件
		this.socket.onMessage((meg)=>{
			this._onMessage(meg)
		});
		
	}
	
	// 連接成功 重置參數(shù)
	_onOpen() {
		this.isConnect = true;// 是否連接成功
		this.reconnectCount = 0;// 重置重連次數(shù)
		clearTimeout(this.reconnectTimer);// 清空重連定時(shí)器
		this.isHandClose = false;// 是否是手動(dòng)關(guān)閉
		this._heartbeat();// 開(kāi)啟心跳
		
		// 未發(fā)送的消息全部發(fā)送
		this._sendArr.forEach(item=>{
			this.send(item);// 發(fā)送消息
		})
		this._sendArr = [];
	}
	
	// 監(jiān)聽(tīng) WebSocket 連接關(guān)閉事件
	_onClose() {
		this.socket = null;// 清空soket
		this.isConnect = false;// 是否連接成功
		this._clearHeartbeat();// 關(guān)閉心跳
		this._reconnect();// 重新連接
	}
	
	// 監(jiān)聽(tīng) WebSocket 錯(cuò)誤事件
	_onError() {
		
	}
	
	// 監(jiān)聽(tīng) WebSocket 接受到服務(wù)器的消息事件
	_onMessage(meg) {
		let data = JSON.parse(meg.data);// 收到的數(shù)據(jù)
		let receiveType = data.type;// 收到的type類(lèi)型
		// 觸發(fā)對(duì)應(yīng)type類(lèi)型事件  接受type為all時(shí)所有事件都會(huì)觸發(fā)
		for (let entry of this._map.entries()) {
			if(entry[1] === receiveType || entry[1] === 'all' ){
				entry[0](data.payLoad)
			}
		}
	}
	
	// 自動(dòng)重連
	_reconnect() {
		if(this.isHandClose)return;// 手動(dòng)關(guān)閉不重連
		if(this.socket)return;// 正在連接不處理
		if (this.reconnectCount < 10) {
			this.reconnectCount++;
			this.reconnectTimer = setTimeout(() => {
				console.log(`WebSocket 重連中,第 ${this.reconnectCount} 次嘗試...`);
				this.connect();//連接
			}, 5000);
		} else {
			console.log('WebSocket 重連失?。?);
		}
	}
	
	// 開(kāi)啟心跳
	_heartbeat(){
		this._clearHeartbeat();// 關(guān)閉心跳
		// 心跳10000ms發(fā)送一次
		this.heartbeatInterval = setInterval(()=>{
			this.send({type:'ping', "payLoad": {"ts": new Date().getTime()}})//心跳內(nèi)容
		},10000)
	}
	
	// 關(guān)閉心跳
	_clearHeartbeat(){
		clearInterval(this.heartbeatInterval)
	}
	
	// 發(fā)送消息
	send(data) {
		// 當(dāng)前未連接記錄內(nèi)容 隊(duì)列中沒(méi)有才放入 心跳除外
		if(!this.isConnect && data.type !== "ping" ){
			const hasEqualItem = this._sendArr.some(item => JSON.stringify(item) == JSON.stringify(data));
			if (!hasEqualItem) {
				this._sendArr.push(data);
			}
			return;
		}
		this.socket.send({'data':JSON.stringify(data)});
	}
	
	// 接受信息  type 類(lèi)型  fn 回調(diào)函數(shù)
	on(type,fn=()=>{}){
		this._map.set(fn,type);
	}
	
	// 關(guān)閉接受參數(shù)
	off(type,fn){// 關(guān)閉參數(shù)
		if(arguments.length === 0){
			// 清除全部
			this._map.clear();
		}else if(arguments.length === 1){
			// 清除某個(gè)事件類(lèi)型整體
			this._map.forEach((value, key) => {
				if (value === type) {
					this._map.delete(key);
				}
			});
		}else{
			// 清除某個(gè)事件類(lèi)型中某個(gè)回調(diào)
			if(this._map.get(fn) === type){
				this._map.delete(fn)
			}
		}
	}
	
	// 關(guān)閉
	clearClose() {
		this.isHandClose = true;// 手動(dòng)關(guān)閉
		clearTimeout(this.reconnectTimer);// 清空重連定時(shí)器
		if(this.socket && "close" in this.socket){
			this.socket.close(); // 關(guān)閉soket
		}
	}
	
}

export default new Socket()

自定義修改說(shuō)明

  • 后端參數(shù)
    代碼開(kāi)頭有提到默認(rèn)后端給到的數(shù)據(jù)為
    { 
    	type:'msglist',// 你和后端定義的數(shù)據(jù)type類(lèi)型
    	"data":{
    		"key":"value",// 這個(gè)type類(lèi)型對(duì)應(yīng)的數(shù)據(jù)
    		...
    	}
    }
    如果數(shù)據(jù)有修改。修改_onMessage函數(shù)修改傳入你們定義的數(shù)據(jù)即可
    
  • 心跳
    修改代碼中_heartbeat函數(shù) 修改心跳內(nèi)容和心跳間隔時(shí)間即可
    
  • 重連
    默認(rèn)最多重連1010次都失敗就不會(huì)重新連接了
    默認(rèn)重連間隔時(shí)間5秒
    只有連接失敗 或者服務(wù)報(bào)錯(cuò)才會(huì)重新連接  我們手動(dòng)關(guān)閉連接是不會(huì)重新連接的放心使用
    修改_reconnect函數(shù)中的10 為你想要的重連次數(shù)
    修改_reconnect函數(shù)中的5000 為你想要的重連間隔時(shí)間
    

小結(jié)

可以根據(jù)自己的需要對(duì)其進(jìn)行魔改。 不懂的地方可以聯(lián)系我?guī)痛蠹掖鹨?。v:H1274714546
歡迎有更好方案的小伙伴評(píng)論。分享轉(zhuǎn)載,請(qǐng)注明來(lái)源哦~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-543478.html

到了這里,關(guān)于uni-app vue3 封裝socket 兼容微信小程序 釘釘小程序 H5 App 全局唯一的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • uni-app實(shí)現(xiàn)點(diǎn)擊顯示隱藏列表,兼容微信小程序

    uni-app實(shí)現(xiàn)點(diǎn)擊顯示隱藏列表,兼容微信小程序

    效果:? ? 小程序打印的結(jié)果:值一直為true ? 如果你試過(guò)v-if不生效,又試了v-show,還是不行!!千萬(wàn)不要著急! 不是自己寫(xiě)的不對(duì),而是uni-app和微信小程序修改值的方式不一致造成的。反正就是不承認(rèn)是自己的問(wèn)題。 其實(shí)解決的辦法也很簡(jiǎn)單,就是要兼容兩端,寫(xiě)出符合

    2024年02月09日
    瀏覽(34)
  • uni-app實(shí)現(xiàn)自定義導(dǎo)航欄,兼容H5、App、微信小程序

    uni-app實(shí)現(xiàn)自定義導(dǎo)航欄,兼容H5、App、微信小程序

    很多情況下,系統(tǒng)自帶的導(dǎo)航欄無(wú)法滿足UI設(shè)計(jì)的要求,這時(shí)候就需要我們自定義導(dǎo)航欄來(lái)實(shí)現(xiàn)需求,要考慮跨端的多種情況,這里我們封裝成一個(gè)組件來(lái)使用,實(shí)現(xiàn)效果如下: 一、H5、App、微信小程序的區(qū)別 1.H5:導(dǎo)航欄高度可以設(shè)為44px,它沒(méi)有狀態(tài)欄,因?yàn)镠5端運(yùn)行在瀏覽

    2024年04月13日
    瀏覽(105)
  • Uni-app實(shí)現(xiàn)左右滑動(dòng)頁(yè)面內(nèi)容切換(兼容微信小程序)

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 ? ? ? ? 前言 ? ? ? ? 整體思路 ? ? ? ??一、HTML部分 ????????二、Script部分 ????????三、Style部分 ? ? ? ? ? (先聲明哦我可不是偷懶,只是想學(xué)術(shù)借鑒一下)因?yàn)樽罱性谧鲎笥一瑒?dòng)功能,

    2024年02月07日
    瀏覽(112)
  • uni-app Vue3實(shí)現(xiàn)一個(gè)酷炫的多功能音樂(lè)播放器支持微信小程序后臺(tái)播放

    uni-app Vue3實(shí)現(xiàn)一個(gè)酷炫的多功能音樂(lè)播放器支持微信小程序后臺(tái)播放

    本文存在多張gif演示圖,建議在 wifi 環(huán)境下閱讀?? 最近在做網(wǎng)易云音樂(lè)微信小程序開(kāi)源項(xiàng)目的時(shí)候,關(guān)于 播放器功能 參考了一些成熟的微信小程序,如 網(wǎng)易云音樂(lè)小程序 和 QQ音樂(lè)小程序 ,但是發(fā)現(xiàn)這些 小程序端 的播放器相對(duì)于 APP端 來(lái)說(shuō)較簡(jiǎn)單,只支持一些基礎(chǔ)功能,

    2024年01月24日
    瀏覽(104)
  • uni-app 微信小程序藍(lán)牙模塊的解耦封裝-持續(xù)更新

    core.js tool.js util.js main.js

    2024年03月27日
    瀏覽(30)
  • 【微信小程序】使用uni-app——開(kāi)發(fā)首頁(yè)搜索框?qū)Ш綑冢赏瑫r(shí)兼容APP、H5、小程序)

    【微信小程序】使用uni-app——開(kāi)發(fā)首頁(yè)搜索框?qū)Ш綑冢赏瑫r(shí)兼容APP、H5、小程序)

    目錄 前言 App、H5效果 小程序效果 一、兼容APP、H5的方式 二、兼容小程序 三、實(shí)現(xiàn)同時(shí)兼容 首頁(yè)都會(huì)提供一個(gè)搜索框給到客戶,讓客戶自己去搜索自己想要的內(nèi)容,這里就需要導(dǎo)航欄,來(lái)實(shí)現(xiàn)搜索頁(yè)面的跳轉(zhuǎn),效果如下 在常見(jiàn)titleNView配置代碼示例中可以看到基本樣式的代碼

    2024年02月03日
    瀏覽(104)
  • 語(yǔ)法速通 uni-app隨筆【uni-app】【微信小程序】【vue】

    語(yǔ)法速通 uni-app隨筆【uni-app】【微信小程序】【vue】

    其中, pages 目錄/ index 目錄【必有】: index.js 編寫(xiě)業(yè)務(wù)邏輯 【初始數(shù)據(jù),生命周期函數(shù)】 index.json 編寫(xiě)配置 index.wxml 編寫(xiě)模板 【可理解為本頁(yè)html】 index.wxss 【可理解為本頁(yè)css】 直接輸入敲回車(chē),連尖括號(hào)都不需要就可以標(biāo)簽補(bǔ)全 1)初始數(shù)據(jù)寫(xiě)死 在 index.wxml 引入變

    2024年02月12日
    瀏覽(228)
  • uni-app開(kāi)發(fā)微信小程序 vue3寫(xiě)法添加pinia

    uni-app開(kāi)發(fā)微信小程序 vue3寫(xiě)法添加pinia

    使用uni-app開(kāi)發(fā),選擇vue3語(yǔ)法,開(kāi)發(fā)工具是HBliuderX。雖然內(nèi)置有vuex,但是個(gè)人還是喜歡用Pinia,所以就添加進(jìn)去了。 Pinia官網(wǎng)連接 第一步: 在項(xiàng)目根目錄下執(zhí)行命令: npm install pinia 第二步: 配置main.js文件 第三步,使用: 創(chuàng)建store文件夾、創(chuàng)建store/index.js 然后創(chuàng)建store/modu

    2024年02月03日
    瀏覽(29)
  • 如何用uni-app+vue3+vant開(kāi)發(fā)微信小程序

    如何用uni-app+vue3+vant開(kāi)發(fā)微信小程序

    uni-app之前一直只支持vue2語(yǔ)法, 2021年8月:新版支持 了vue3 開(kāi)發(fā),App平臺(tái)編譯器升級(jí)為 Vite; 新版 uni-app 框架主要做了三大改進(jìn): 重寫(xiě)框架內(nèi)核:基于 vue3 + ts 重寫(xiě)內(nèi)置組件和API,實(shí)現(xiàn)更徹底、更高效的 tree-shaking ; 新增支持 Vite 構(gòu)建工具,在H5平臺(tái)實(shí)現(xiàn)秒開(kāi)預(yù)覽; 新增支持

    2024年02月09日
    瀏覽(22)
  • uni-app+vue3+vite+微信小程序開(kāi)發(fā)的問(wèn)題點(diǎn)

    目錄名稱(chēng)不能為api,否則會(huì)出現(xiàn) ├F10: PM┤ [vite] getaddrinfo ENOTFOUND rivtrust.jz-xxx.xyz ,修改為_(kāi)api; vue3的全局變量掛載 或者 全局變量的引入: 或者 axios在微信小程序上使用的問(wèn)題: 安裝模塊 出現(xiàn)adapter is not a function的解決方法 需要axios自定義適配器配置 整體代碼request.js: un

    2024年02月13日
    瀏覽(48)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包