亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用React18和WebSocket構(gòu)建實(shí)時(shí)通信功能詳解

 更新時(shí)間:2024年01月02日 09:59:51   作者:Evan不懂前端  
WebSocket是一種在Web應(yīng)用中實(shí)現(xiàn)雙向通信的協(xié)議,它允許服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù),而不需要客戶端發(fā)起請(qǐng)求,本文將探索如何在React?18應(yīng)用中使用WebSocket來實(shí)現(xiàn)實(shí)時(shí)通信,感興趣的可以了解下

1. 引言

WebSocket是一種在Web應(yīng)用中實(shí)現(xiàn)雙向通信的協(xié)議。它允許服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù),而不需要客戶端發(fā)起請(qǐng)求。在現(xiàn)代的實(shí)時(shí)應(yīng)用中,WebSocket經(jīng)常用于實(shí)時(shí)數(shù)據(jù)傳輸、聊天功能、實(shí)時(shí)通知和多人協(xié)作等場(chǎng)景。在本篇博客中,我們將探索如何在React 18應(yīng)用中使用WebSocket來實(shí)現(xiàn)實(shí)時(shí)通信。

2. 準(zhǔn)備工作

在開始之前,我們需要安裝React 18,并確定你已經(jīng)掌握了React Hooks的基本知識(shí)。此外,我們還將使用WebSocket的npm包來實(shí)現(xiàn)WebSocket連接。你可以通過以下命令使用npm或yarn來安裝它:

npm install websocket
# 或
yarn add websocket

3. 編寫自定義鉤子

import { useEffect, useRef, useState } from 'react';
import WebSocketClient from 'websocket';


export function useWebSocket(accessToken: string, requestName: string): SocketType {
  const clientRef = useRef<WebSocketClient | null>(null);
  const [isActive, setIsActive] = useState<boolean>(false);
  const [socketClient, setSockClient] = useState<WebSocketClient | null>(null);
  // 獲取url
  let port = window.location.port;
  let wsUrl = '';

  if (window.location.protocol === 'https:') {
    //如果當(dāng)前是HTTPS加密的,那么使用wss
    if (!port) {
      port = '4174';
    }
    wsUrl = 'wss:';
  } else {
    if (!port) {
      port = '8080';
    }
    wsUrl = 'ws:';
  }
  wsUrl +=
    `//${window.location.hostname}:${port}/api/ws/plugins/${requestName}?token=` +
    accessToken;
  if (!socketClient) {
    setSockClient(new WebSocketClient(wsUrl, isActive)); // 創(chuàng)建 WebSocketClient 實(shí)例并傳入 URL 和活動(dòng)狀態(tài) isActive
  }

  useEffect(() => {
    clientRef.current = socketClient;
    if (!socketClient?.socket) {
      socketClient?.start(); // 啟動(dòng)WebSocket連接
    }
    return () => {
      socketClient?.close(); // 組件卸載時(shí)關(guān)閉WebSocket連接
    };
  }, []);

  // 建立 WebSocket 連接
  const connect = () => {
    const client = clientRef.current;

    if (client) {
      client.connect(); // 建立WebSocket連接
    }
  };

  // 關(guān)閉 WebSocket 連接
  const close = () => {
    const client = clientRef.current;

    if (client) {
      client.close(); // 關(guān)閉WebSocket連接
    }
  };

  // 訂閱消息處理程序
  const subscribe = (handler: MessageHandler) => {
    const client = clientRef.current;

    setIsActive(true);
    if (client) {
      client.subscribe(handler);
    }
  };

  // 取消訂閱消息
  const unsubscribe = () => {
    const client = clientRef.current;

    if (client && isActive) {
      setIsActive(false);
      client.unsubscribe();
    }
  };

  // 發(fā)送消息
  const send = (message: string) => {
    const client = clientRef.current;

    if (client && client.socket?.readyState === WebSocket.OPEN) {
      client.send(message); // 發(fā)送消息
    } else if (client && client.socket?.readyState === WebSocket.CLOSED) {
      // WebSocket連接未建立或已關(guān)閉,需要重新建立連接
      client.connect(); // 建立WebSocket連接
    }
  };

  return { connect, close, subscribe, unsubscribe, send };
}

在上述代碼中,我們使用useRef來保存WebSocketClient實(shí)例,使用useState來管理isActive和socketClient狀態(tài)。通過創(chuàng)建WebSocket連接的URL和accessToken,我們可以在useEffect鉤子中實(shí)例化WebSocketClient。然后使用useEffect鉤子來啟動(dòng)和關(guān)閉WebSocket連接,并在組件卸載時(shí)關(guān)閉連接。

4. 創(chuàng)建WebSocketProvider

為了在整個(gè)應(yīng)用中共享WebSocket連接對(duì)象,我們需要?jiǎng)?chuàng)建一個(gè)WebSocketProvider組件。這個(gè)組件將使用提供者模式將連接對(duì)象提供給子組件。

在你的項(xiàng)目中創(chuàng)建一個(gè)名為WebSocketProvider.js的文件,并添加以下代碼:

import React, { useContext, useEffect } from 'react';
import { useWebSocket } from './useWebSocket';

const WebSocketContext = React.createContext();

export const useWebSocketContext = () => {
  return useContext(WebSocketContext);
};

export const WebSocketProvider = ({ children, accessToken }) => {
  const webSocket = useWebSocket(accessToken);

  useEffect(() => {
    webSocket.connect();

    return () => {
      webSocket.close();
    };
  }, [webSocket]);

  return (
    <WebSocketContext.Provider value={webSocket}>
      {children}
    </WebSocketContext.Provider>
  );
};

在上述代碼中,我們使用useWebSocket鉤子來獲取WebSocket連接對(duì)象,并在useEffect鉤子中連接WebSocket,并在組件卸載時(shí)關(guān)閉連接。然后,我們將連接對(duì)象提供給子組件,通過創(chuàng)建一個(gè)WebSocketContext.Provider。

5. 在組件中使用共享連接

現(xiàn)在,我們可以在應(yīng)用的任何組件中使用共享的WebSocket連接了。

假設(shè)我們有一個(gè)名為ChatComponent的組件,它需要使用WebSocket連接來實(shí)現(xiàn)實(shí)時(shí)聊天功能。在ChatComponent.js文件中,添加以下代碼:

import React from 'react';
import { useWebSocketContext } from './WebSocketProvider';

function ChatComponent() {
  const webSocket = useWebSocketContext();

  const sendMessage = () => {
    if (webSocket) {
      webSocket.send('Hello, WebSocket!');
    }
  };

  return (
    <div>
      <button onClick={sendMessage}>Send Message</button>
    </div>
  );
}

export default ChatComponent;

在上述代碼中,我們使用useWebSocketContext來獲取WebSocket連接對(duì)象。然后,我們可以在組件中調(diào)用send方法來發(fā)送消息。

6. 示例應(yīng)用:實(shí)時(shí)聊天

我們使用上述代碼,創(chuàng)建一個(gè)實(shí)時(shí)聊天應(yīng)用作為示例。在你的項(xiàng)目中,創(chuàng)建一個(gè)名為RealTimeChatApp的文件夾,然后在文件夾中創(chuàng)建以下文件:

  • `RealTimeChatApp.js:` 主應(yīng)用組件
  • `ChatComponent.js:` 實(shí)時(shí)聊天組件
  • `WebSocketProvider.js`: `WebSocket`連接提供者

在RealTimeChatApp.js中,添加以下代碼:

import React from 'react';
import ChatComponent from './ChatComponent';
import { WebSocketProvider } from './WebSocketProvider';

function RealTimeChatApp() {
  const accessToken = 'your_access_token'; // 替換為你的訪問令牌

  return (
    <WebSocketProvider accessToken={accessToken}>
      <div>
        <h1>Real Time Chat App</h1>
        <ChatComponent />
      </div>
    </WebSocketProvider>
  );
}

export default RealTimeChatApp;

然后,在ChatComponent.js中,添加以下代碼:

import React from 'react';
import { useWebSocketContext } from './WebSocketProvider';
function ChatComponent() {
  const webSocket = useWebSocketContext();
  const [messages, setMessages] = React.useState([]);
  const [newMessage, setNewMessage] = React.useState('');

  React.useEffect(() => {
    const messageHandler = (message) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    };
    webSocket.subscribe(messageHandler);

    return () => {
      webSocket.unsubscribe();
    };
  }, [webSocket]);

  const sendMessage = () => {
    if (webSocket) {
      webSocket.send(newMessage);
      setNewMessage('');
    }
  };

  return (
    <div>
      <div>
        {messages.map((message, index) => (
          <div key={index}>{message}</div>
        ))}
      </div>
      <div>
        <input
          type="text"
          value={newMessage}
          onChange={(e) => setNewMessage(e.target.value)}
        />
        <button onClick={sendMessage}>Send</button>
      </div>
    </div>
  );
}

export default ChatComponent;

最后,啟動(dòng)你的應(yīng)用,訪問RealTimeChatApp組件,即可在瀏覽器中查看實(shí)時(shí)聊天功能。

7. 總結(jié)

本文介紹了如何在React 18應(yīng)用中使用WebSocket來實(shí)現(xiàn)實(shí)時(shí)通信,并展示了如何通過自定義鉤子和提供者模式來共享WebSocket連接對(duì)象。通過這種方式,我們可以在多個(gè)組件中使用同一個(gè)連接對(duì)象,從而避免了不必要的連接重復(fù)實(shí)例化和性能開銷。WebSocket在現(xiàn)代實(shí)時(shí)應(yīng)用中發(fā)揮著重要作用,幫助我們實(shí)現(xiàn)更高效的通信和用戶體驗(yàn)。

希望本文能夠幫助你理解如何在React 18中使用WebSocket,并在應(yīng)用中實(shí)現(xiàn)共享連接的目標(biāo)。如果你想進(jìn)一步探索WebSocket的高級(jí)用法,可以深入了解WebSocket的各種選項(xiàng)和特性,以滿足你的實(shí)際需求。

以上就是使用React18和WebSocket構(gòu)建實(shí)時(shí)通信功能詳解的詳細(xì)內(nèi)容,更多關(guān)于React18 WebSocket構(gòu)建實(shí)時(shí)通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件

    React實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件

    本文主要介紹了React實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel文件,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Header組件熱門搜索欄的實(shí)現(xiàn)示例

    Header組件熱門搜索欄的實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Header組件熱門搜索欄的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 原生實(shí)現(xiàn)一個(gè)react-redux的代碼示例

    原生實(shí)現(xiàn)一個(gè)react-redux的代碼示例

    這篇文章主要介紹了原生實(shí)現(xiàn)一個(gè)react-redux的代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • React中使用dnd-kit實(shí)現(xiàn)拖曳排序功能

    React中使用dnd-kit實(shí)現(xiàn)拖曳排序功能

    在這篇文章中,我將帶著大家一起探究React中使用dnd-kit實(shí)現(xiàn)拖曳排序功能,由于前陣子需要在開發(fā) Picals 的時(shí)候,需要實(shí)現(xiàn)一些拖動(dòng)排序的功能,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • react 項(xiàng)目 中使用 Dllplugin 打包優(yōu)化技巧

    react 項(xiàng)目 中使用 Dllplugin 打包優(yōu)化技巧

    在用 Webpack 打包的時(shí)候,對(duì)于一些不經(jīng)常更新的第三方庫,比如 react,lodash,vue 我們希望能和自己的代碼分離開,這篇文章主要介紹了react 項(xiàng)目 中 使用 Dllplugin 打包優(yōu)化,需要的朋友可以參考下
    2023-01-01
  • react如何獲取URL中參數(shù)

    react如何獲取URL中參數(shù)

    這篇文章主要介紹了react如何獲取URL中參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • React 實(shí)現(xiàn)表單組件的示例代碼

    React 實(shí)現(xiàn)表單組件的示例代碼

    本文主要介紹了React 實(shí)現(xiàn)表單組件的示例代碼,支持包括輸入狀態(tài)管理,表單驗(yàn)證,錯(cuò)誤信息展示,表單提交,動(dòng)態(tài)表單元素等功能,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • React 中 setState使用小結(jié)

    React 中 setState使用小結(jié)

    這篇文章主要介紹了React 中 setState使用小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • 一文詳解React中Hook的作用和用處

    一文詳解React中Hook的作用和用處

    Hook是一種函數(shù),它可以讓你在函數(shù)組件中“掛鉤”到React狀態(tài)和生命周期等特性,這篇文章主要和大家介紹了React中Hook的作用和用處,希望對(duì)大家有所幫助
    2023-05-05
  • React Native自定義路由管理的深入理解

    React Native自定義路由管理的深入理解

    路由管理的功能主要指的頁面跳轉(zhuǎn)、goBack、帶參數(shù)跳轉(zhuǎn)等功能,這篇文章主要給大家介紹了關(guān)于React Native自定義路由管理的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評(píng)論