成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在 React 中正確的使用 socket.io 客戶端?

開發 開發工具
本文的實現方式是使用狀態管理工具保存 socket 實例,供子組件使用,如果使用了 React Hooks,可以用其提供的 useContext API,實現起來也很簡單。

最近在一個 React 項目中,使用到了 socket.io 處理即時消息,這里面有幾點容易被忽視的問題,例如:在 React 單頁面應用中如何防止出現多個 socket 實例、在任意的的組件內如何方便的取到 socket 實例、對于某個事件不要隨著頁面切換出現多個監聽器。

在本文中,將會給大家分享下我在 React 中使用 Socket.io 客戶端的一些經驗,希望對此有疑惑的朋友給予一些幫助,也許你會有一些更好的實現方式,歡迎交流!

創建 Socket Context

本文的實現方式是使用狀態管理工具保存 socket 實例,供子組件使用,如果使用了 React Hooks,可以用其提供的 useContext API,實現起來也很簡單。

// contexts/socket.tsx
import { createContext, ReactNode, useContext } from 'react';
import io, { Socket } from 'socket.io-client';

const SOCKET_URL = 'ws://localhost:8080';
export const socket = io(SOCKET_URL, {
transports: ['websocket'],
});

const SocketContext = createContext<Socket>(socket);
SocketContext.displayName = 'SocketContext';

export const SocketProvider = ({ children }: { children: ReactNode }) => (
<SocketContext.Provider value={socket}>{children}</SocketContext.Provider>
);

export const useSocket = () => {
const context = useContext(SocketContext);
return context;
};

// contexts/index.tsx
import { ReactNode } from 'react';
import { SocketProvider } from './Socket';

const AppContextProviders = ({ children }: { children: ReactNode }) => (
<SocketProvider>{children}</SocketProvider>
);

export default AppContextProviders;

其中  const socket = io(SOCKET_URL)?,有些朋友可能就有疑問了,為什么不執行下 socket.connect() 呢?

socket.io 客戶端默認是自動鏈接的,如果聲明了 autoConnect 屬性為 false,則需要手動執行下鏈接。

以上,在頁面第一次加載時會初始化 socket,解決了第一個問題:“React 單頁面應用中如何防止出現多個 socket 實例”。

根組件提供 socket

在項目的 App.js 文件中引入我們自定義的 Providers,將 AppProviders 組件做為根組件放在最頂層,這樣被包裹的組件都可以使用 AppProviders 組件提供的屬性。也解決了第二個問題:“在任意的的組件內如何方便的取到 socket 實例”。

import AppProviders from './contexts';
import './App.css';

const App = () => (
<AppProviders>
...
</AppProviders>
);

export default App;

任意子組件中使用 socket

組件 A,監聽服務器發來的消息。

useEffect() 是 React 內置的一個 Hook,如果第二個參數依賴項數組為空,那么傳入的第一個函數在該組件內只會執行一次,依賴項數組只要有一個狀態被更新,useEffect() 傳入的第一個函數也將會被執行。

還需要注意的是 useEffect() 傳入的第一個函數,它又返回的函數在函數組件卸載時被調用,通常我們會用 useEffect() 模擬類組件的 componentDidMount、componentWillUnmount 行為。

在組件卸載時,使用 socket.off() 移除事件監聽器,實際上這可以預防內存泄漏,同時也解決了最開始提的第三個問題:“對于某個事件不要隨著頁面切換出現多個監聽器”。

import { useEffect } from 'react';
import { useSocket } from '../../contexts/Socket';

const ComponentA = () => {
const socket = useSocket();

useEffect(() => {
// componentDidMount
socket.on('message', handleMessage); // 監聽消息
return () => {
// componentWillUnmount
socket.off('message', handleMessage);
};
}, [socket]);

return ();
};

export default ComponentA;

組件 B,發送消息到服務器。

在我們的組件 B 中,也可以使用自定義的 useSocket Hook 獲取最開始初始化的 socket 實例,但這并不會產生一個新的 socket 實例。

import { useEffect } from 'react';
import { useSocket } from '../../contexts/Socket';

const ComponentB = () => {
const socket = useSocket();
const handleSendMessage = () => {
socket.emit('compress', data); // 發送消息
}

return <div>
// ...
<button onClick={handleSendMessage}>Send message</button>
</div>;
};

export default ComponentB;

責任編輯:武曉燕 來源: 編程界
相關推薦

2019-07-26 14:40:58

Vue.jsSocket.IO前端

2021-10-25 09:00:37

Node.jsJS前端

2015-08-05 09:33:21

Javawaitnotify

2023-11-26 18:31:41

Linux信號

2015-09-28 11:15:39

UbuntuQGit客戶端

2019-10-18 10:43:11

JPASpring Boot Flyway

2010-03-18 16:49:43

Java Socket

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2009-12-21 10:09:26

WCF創建客戶端服務對

2013-04-09 12:18:45

socket.ioC服務器

2010-12-17 10:16:33

OpenVAS

2011-08-17 10:10:59

2017-02-05 14:20:28

LinuxThunderbird郵件客戶端

2023-05-13 17:32:51

2011-03-21 14:53:36

Nagios監控Linux

2011-04-06 14:24:20

Nagios監控Linux

2010-05-26 09:26:43

Cassandra

2014-06-01 11:03:13

VDI零客戶端

2023-05-27 16:27:25

2010-03-18 17:30:46

Java Socket
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰8| 视频一区中文字幕 | a级在线免费观看 | 日韩成年人视频在线 | 精品免费国产视频 | 国产激情精品 | 一区二区欧美在线 | 国产在线网站 | 欧洲视频一区 | 日韩在线小视频 | 欧美一级视频在线观看 | 色吊丝2288sds中文字幕 | 精品自拍视频 | 久久久久国产精品免费免费搜索 | 亚洲欧美一区二区三区国产精品 | www.精品国产| 国产在线中文字幕 | 亚洲黄色在线免费观看 | 97avcc| 午夜专区 | 超碰在线人人 | 免费人成激情视频在线观看冫 | 日韩三片| 亚洲一区二区精品视频 | 99久久精品国产麻豆演员表 | 日韩成人在线一区 | 国产精品久久久久久高潮 | 欧美一区二区二区 | 亚洲精品www| 日操夜操 | 91 在线| 免费人成在线观看网站 | 一级片在线观看 | 国产日韩一区二区三免费高清 | 99久久免费精品国产免费高清 | 91极品尤物在线播放国产 | 国产乱码精品一区二区三区五月婷 | 国产成人精品免高潮在线观看 | 久久伊人久久 | 成人午夜免费福利视频 | 亚洲逼院|