最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端實(shí)現(xiàn)簡(jiǎn)單的sse封裝方式(React hook Vue3)

 更新時(shí)間:2024年08月29日 09:27:25   作者:bigHead-  
這篇文章主要介紹了前端實(shí)現(xiàn)簡(jiǎn)單的sse封裝方式(React hook Vue3),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

什么是SSE?

所謂的SSE(Sever-Sent Event),就是瀏覽器向服務(wù)器發(fā)送了一個(gè)HTTP請(qǐng)求,保持長連接,服務(wù)器不斷單向地向?yàn)g覽器推送“信息”,這么做是為了節(jié)省網(wǎng)絡(luò)資源,不用一直發(fā)請(qǐng)求,建立新連接。

  • 優(yōu)點(diǎn):SSE和WebSocket相比,最大的優(yōu)勢(shì)是便利,服務(wù)端不需要第三方組件,開發(fā)難度低,SSE和輪詢相比它不用處理很多請(qǐng)求,不用每次建立新連接,延遲低。
  • 缺點(diǎn):如果客戶端有很多需要保持很多長連接,這回占用大量內(nèi)存和連接數(shù)。

封裝簡(jiǎn)單的SSE,以React hook為例

可參考簡(jiǎn)單的websocket封裝

新建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)閉或者沒有鏈接成功'},
        ]

        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(重連)。

通過這幾個(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)閉或者沒有鏈接成功" },
    ];

    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)文章

  • Vue基本指令實(shí)例圖文講解

    Vue基本指令實(shí)例圖文講解

    這篇文章主要介紹了Vue基本指令實(shí)例圖文講解,文章將基本指令講解的很清楚,有對(duì)于指令不太懂的同學(xué)可以跟著學(xué)習(xí)研究下
    2021-02-02
  • Vue條件渲染與循環(huán)渲染實(shí)戰(zhàn)詳解

    Vue條件渲染與循環(huán)渲染實(shí)戰(zhàn)詳解

    這篇文章給大家介紹Vue條件渲染與循環(huán)渲染的相關(guān)知識(shí),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2026-03-03
  • 詳解Vue的options

    詳解Vue的options

    options顧名思義是選項(xiàng)的意思,或稱為構(gòu)造選項(xiàng)。是在創(chuàng)建vue實(shí)例時(shí)傳入的參數(shù),是一個(gè)對(duì)象。該對(duì)象包含哪些屬性?每個(gè)屬性都是什么含義?本篇文章就來帶大家詳細(xì)了解其中的奧秘
    2021-05-05
  • 淺談vue實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    淺談vue實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    本篇文章主要介紹了淺談vue實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 組件中多個(gè)el-upload存在導(dǎo)致上傳圖片失效的問題及解決

    組件中多個(gè)el-upload存在導(dǎo)致上傳圖片失效的問題及解決

    這篇文章主要介紹了組件中多個(gè)el-upload存在導(dǎo)致上傳圖片失效的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue+element實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼注冊(cè)的示例

    vue+element實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼注冊(cè)的示例

    本文主要介紹了vue+element實(shí)現(xiàn)手機(jī)號(hào)驗(yàn)證碼注冊(cè)的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • vue3中reactive的對(duì)象清空所引發(fā)的問題解決方案(清空不了和清空之后再去賦值就賦值不了)

    vue3中reactive的對(duì)象清空所引發(fā)的問題解決方案(清空不了和清空之后再去賦值就賦值不了)

    在使用reactive定義的變量時(shí),直接賦值會(huì)失去響應(yīng)式,為了清空?filters并確保響應(yīng)式,可以使用Object.assign({},?filters)或者遍歷對(duì)象逐個(gè)清除屬性,本文介紹vue3中reactive的對(duì)象清空所引發(fā)的問題解決方案(清空不了和清空之后再去賦值就賦值不了),感興趣的朋友一起看看吧
    2025-02-02
  • Vue中sync修飾符分析原理及用法示例

    Vue中sync修飾符分析原理及用法示例

    在vue中,子組件如果想修改父組件的變量,一般做法是通過綁定事件的方法,父組件向子組件傳遞修改變量的方法,子組件觸發(fā)修改變量的方法執(zhí)行,這種方式中規(guī)中矩;另一種方法是使用sync修飾符,此方法可以減少很多代碼量
    2022-08-08
  • vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單

    vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單

    這篇文章主要介紹了vue后臺(tái)管理如何配置動(dòng)態(tài)路由菜單,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue指令之v-for的使用說明

    Vue指令之v-for的使用說明

    這篇文章主要介紹了Vue指令之v-for的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評(píng)論

长兴县| 融水| 高邑县| 左贡县| 锡林郭勒盟| 延安市| 达日县| 综艺| 章丘市| 卓尼县| 乌兰浩特市| 和田市| 柳河县| 休宁县| 当阳市| 大竹县| 南江县| 西昌市| 贡觉县| 盐亭县| 新民市| 界首市| 清丰县| 冷水江市| 甘肃省| 乌苏市| 海兴县| 文化| 介休市| 桐乡市| 永宁县| 银川市| 松滋市| 溧阳市| 香河县| 怀化市| 定南县| 南雄市| 抚远县| 吐鲁番市| 望城县|