前端實(shí)現(xiàn)簡(jiǎn)單的sse封裝方式(React hook Vue3)
什么是SSE?
所謂的SSE(Sever-Sent Event),就是瀏覽器向服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求,保持長(zhǎng)連接,服務(wù)器不斷單向地向?yàn)g覽器推送“信息”,這么做是為了節(jié)省網(wǎng)絡(luò)資源,不用一直發(fā)請(qǐng)求,建立新連接。
- 優(yōu)點(diǎn):SSE和WebSocket相比,最大的優(yōu)勢(shì)是便利,服務(wù)端不需要第三方組件,開(kāi)發(fā)難度低,SSE和輪詢相比它不用處理很多請(qǐng)求,不用每次建立新連接,延遲低。
- 缺點(diǎn):如果客戶端有很多需要保持很多長(zhǎng)連接,這回占用大量?jī)?nèi)存和連接數(shù)。
封裝簡(jiǎn)單的SSE,以React hook為例
新建sse.ts文件
import {useState, useRef, useEffect} from 'react' const useSSE = (url: string) => { const source = useRef<EventSource | null>(null) //接收到的sse數(shù)據(jù) const [sseData, setSseData] = useState({}) // sse狀態(tài) const [sseReadyState, setSseReadyState] = useState({ key: 0, value: '正在鏈接中', }) const creatSource = () => { const stateArr = [ {key: 0, value: '正在鏈接中'}, {key: 1, value: '已經(jīng)鏈接并且可以通訊'}, {key: 2, value: '連接已關(guān)閉或者沒(méi)有鏈接成功'}, ] try { source.current = new EventSource(url) source.current.onopen = (_e) => { setSseReadyState(stateArr[source.current?.readyState ?? 0]) } source.current.onerror = (e) => { setSseReadyState(stateArr[source.current?.readyState ?? 0]) } source.current.onmessage = (e) => { setSseData({...JSON.parse(e.data)}) } } catch (error) { console.log(error) } } const sourceInit = () => { if (!source.current || source.current.readyState === 2) { creatSource() } } // 關(guān)閉 WebSocket const closeSource = () => { source.current?.close() } //重連 const reconnectSSE = () => { try { closeSource() source.current = null creatSource() } catch (e) { console.log(e) } } useEffect(() => { sourceInit() },[]) return { sseData, sseReadyState, closeSource, reconnectSSE, } } export default useSSE
這里一共暴露出四個(gè)參數(shù)。
分別是 sseData(接收到的 sse數(shù)據(jù))、sseReadyState(當(dāng)前 sse狀態(tài))、closeSource(關(guān)閉 sse)、reconnectSSE(重連)。
通過(guò)這幾個(gè)簡(jiǎn)單的參數(shù)能夠覆蓋一般場(chǎng)景的需要。
下面代碼為使用方法
import React, { useState, useEffect } from 'react' import useWebsocket from '../../tools/webSocket' export default function () { const {sseData,sseReadyState, closeSource,reconnectSSE} = useSSE(url) useEffect(() => { console.log( '當(dāng)前狀態(tài)',sseReadyState) },[sseReadyState]) useEffect(() => { console.log( '接收到的數(shù)據(jù)',sseData) }, [sseData]) }
使用vue3實(shí)現(xiàn)
import { ref } from "vue"; const useSSE = (url: string) => { const source = ref<EventSource | null>(null); //接收到的sse數(shù)據(jù) const sseData = ref({}); // sse狀態(tài) const readyState = ref({ key: 0, value: "正在鏈接中" }); const creatSource = () => { const stateArr = [ { key: 0, value: "正在鏈接中" }, { key: 1, value: "已經(jīng)鏈接并且可以通訊" }, { key: 2, value: "連接已關(guān)閉或者沒(méi)有鏈接成功" }, ]; try { source.value= new EventSource(url); source.value.onopen = (e) => { readyState.value = stateArr[source.value?.readyState ?? 0]; }; source.value.onerror = (e) => { readyState.value = stateArr[source.value?.readyState ?? 0]; }; source.value.onmessage = (e) => { e.data && (sseData.value = { ...JSON.parse(e.data) }); }; } catch (error) { console.log(error); } }; const sourceInit = () => { if (!source.value|| source.value.readyState === 2) { creatSource(); } }; // 關(guān)閉 WebSocket const closeSource = () => { source.value?.close(); }; //重連 const reconnectSSE = () => { try { closeSource(); source.value= null; creatSource(); } catch (e) { console.log(e); } }; return { sseData, readyState, sourceInit, closeSource, reconnectSSE, }; }; export default useSSE;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3中ref和reactive的使用場(chǎng)景詳解
這篇文章主要介紹了Vue3中ref和reactive的使用場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04uniapp仿微信聊天界面效果實(shí)例(vue3組合式版本)
這篇文章主要介紹了uniapp仿微信聊天界面的相關(guān)資料,這里提及了一個(gè)時(shí)間工具包timeMethod.js,該工具包可能提供了一系列時(shí)間處理的功能,如格式化日期、計(jì)算時(shí)間差等,以便在消息格式中正確展示時(shí)間信息,使用此類工具包可以大大提高開(kāi)發(fā)效率,需要的朋友可以參考下2024-10-10vue 在單頁(yè)面應(yīng)用里使用二級(jí)套嵌路由
這篇文章主要介紹了vue 在單頁(yè)面應(yīng)用里使用二級(jí)套嵌路由,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2020-12-12vue使用echarts實(shí)現(xiàn)水平柱形圖實(shí)例
這篇文章主要介紹了vue使用echarts實(shí)現(xiàn)水平柱形圖實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09vue使用localStorage保存登錄信息 適用于移動(dòng)端、PC端
這篇文章主要為大家詳細(xì)介紹了vue使用localStorage保存登錄信息 適用于移動(dòng)端、PC端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Vue實(shí)現(xiàn)網(wǎng)頁(yè)轉(zhuǎn)PDF方法流程詳解
在日常的工作中,有時(shí)候會(huì)碰到需要將某個(gè)網(wǎng)址網(wǎng)頁(yè)保存成為pdf的情況,這篇文章主要介紹了用Vue實(shí)現(xiàn)網(wǎng)頁(yè)轉(zhuǎn)PDF的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Vue觸發(fā)隱藏input file的方法實(shí)例詳解
這篇文章主要介紹了Vue觸發(fā)隱藏input file的方法實(shí)例詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08