发布于 2026-01-06 0 阅读
0

在 React 中使用 WebSocket

在 React 中使用 WebSocket

======================================================================================================================================================> 我提供全栈区块链开发服务:ERC20/721 代币创建、代币销售智能合约、白名单、借贷协议、营销推荐、DAO 开发等等。

包含前端集成。

如果您需要智能合约,请联系我。
如果您需要将前端与智能合约集成,请联系我。

请访问以下链接查看我的作品、客户评价和过往案例 => https://www.muratcanyuksel.xyz

或者发送邮件至mail@muratcanyuksel.xyz
==============================================================================================================================================================>

想了解更多编程知识,请订阅我的 YouTube 频道 => https://www.youtube.com/channel/UCP1hJydcsPZCwbn8rPiohsg

我上一个项目需要用到 WebSocket 来创建一个显示实时交易数据的网站。我对 WebSocket 一窍不通,花了几个小时才勉强入门。其实,这算是入门的唯一难点;其他部分都很简单。这篇短文希望能帮助其他人节省我当初摸索基础知识所花费的时间。

网上大多数教程都会提到“require”语法。你肯定知道。当你想在JS或React的组件中使用某个工具、组件或图片时,你会写类似这样的代码:`const something = require("./folder/something")`。正如我所说,我找到的大多数教程都是从这个语法开始的,这引导你一开始就使用require语法来操作WebSocket。这完全没有必要,甚至在今天看来可能已经过时了。我不确定它是否仍然有效,但我可以肯定的是,在我撰写本文的2021年12月9日,我使用的方法运行良好。那么,废话不多说,让我们来谈谈如何使用这个协议。

本文假设您具备 Vanilla JS 和 React.js 的基本知识,知道如何处理 json 格式和异步代码。

我使用 vite 初始化我的应用(使用以下命令:npm init vite@latest,然后从菜单中选择 react),但你也可以使用你自己的结构,或者使用 create-react-app。其实都无所谓。

如需更深入了解 WebSocket,请访问javascript.info

我们将建造什么?

我们将构建一个非常简单的单页 React.js 应用程序,它会从 bitstamp.net 获取连续数据并将其显示在页面上。数据会不断变化。

你使用哪种服务其实并不重要,只要是 WebSocket 就行,其余部分都是普通的 Javascript。

构建应用程序

我们首先通过编写以下代码连接到 Bitstamp 的 WebSocket 协议。现在,使用这个 ws 常量,我们可以订阅 Bitstamp 网站上定义的任何频道,并从中获取连续数据。您可以在这里const ws = new WebSocket("wss://ws.bitstamp.net");找到有关频道、属性等所有信息。

现在,我们来订阅一个频道。我将订阅 oder_book_v2 频道,并指定要查看 BTC/USD 汇率。此调用在 Bitstamp 的指南中有定义。您可以根据需要更改频道和货币。以下是调用代码:

 const apiCall = {
    event: "bts:subscribe",
    data: { channel: "order_book_btcusd" },
  };
Enter fullscreen mode Exit fullscreen mode

下一步是在打开时向服务器发送此调用 =>

  ws.onopen = (event) => {
    ws.send(JSON.stringify(apiCall));
  };
Enter fullscreen mode Exit fullscreen mode

现在我们想对每条数据进行一些处理。所以,每当我们从服务器收到一条消息时,我们都会执行一些操作。让我们用 try/catch 编写一个异步代码。


ws.onmessage = function (event) {
const json = JSON.parse(event.data);
console.log(`[message] Data received from server: ${json}`);
try {
if ((json.event = "data")) {

        console.log(json.data);
      }
    } catch (err) {
      // whatever you wish to do with the err
    }

};
Enter fullscreen mode Exit fullscreen mode

如果打开控制台,我们会看到服务器返回大量数据。就是这样。我们已经获取了数据,数据以数据流的形式传输,我们可以对它进行任何操作。就这么简单。

但我希望以特定的方式显示数据。我把代码贴出来,稍后会解释:

import React, { useState } from "react";

function  App() {
  //give an initial state so that the data won't be undefined at start
  const [bids, setBids] = useState([0]);

  const ws = new WebSocket("wss://ws.bitstamp.net");

  const apiCall = {
    event: "bts:subscribe",
    data: { channel: "order_book_btcusd" },
  };

  ws.onopen = (event) => {
    ws.send(JSON.stringify(apiCall));
  };

  ws.onmessage = function (event) {
    const json = JSON.parse(event.data);
    try {
      if ((json.event = "data")) {
        setBids(json.data.bids.slice(0, 5));
      }
    } catch (err) {
      console.log(err);
    }
  };
  //map the first 5 bids
  const firstBids = bids.map((item) => {
    return (
      <div>
        <p> {item}</p>
      </div>
    );
  });

  return <div>{firstBids}</div>;
}

export default  App;
Enter fullscreen mode Exit fullscreen mode

所以,这里发生了什么?正如你所看到的,这是一个非常基础的 React.js 应用组件。我使用了 useState hook,所以也把它和 React 一起导入了。

我定义状态并赋予它一个初始值。

我按照之前指示的步骤进行操作——只是,为了方便起见,我将状态设置为 json.data.bids(bids 是实时订单通道的一个属性,在 bitstamp 的页面上有指示),并将我将接收的数据量限制为 5。

我将接收到的数据进行映射,并保存在状态中(如你所知,React 会为每个项目指定一个键。这里我不会使用它。我通常使用 uniqid,你可以自己去了解一下。)

我返回映射后的数据,瞧!如果你也做了同样的操作,你应该会在屏幕上看到正好 5 行不断变化的数据。

希望这篇文章对某些人有所帮助。

=====================================================================================================================================================> 我提供全栈区块链开发服务:ERC20/721 代币创建、代币销售智能合约、白名单、借贷协议、营销推荐、DAO 开发等等。

包含前端集成。

如果您需要智能合约,请联系我。
如果您需要将前端与智能合约集成,请联系我。

请访问以下链接查看我的作品、客户评价和过往案例 => https://www.muratcanyuksel.xyz

或者发送邮件至mail@muratcanyuksel.xyz
==============================================================================================================================================================>

祝一切顺利,继续编程!

想了解更多编程知识,请订阅我的 YouTube 频道 => https://www.youtube.com/channel/UCP1hJydcsPZCwbn8rPiohsg

文章来源:https://dev.to/muratcanyuksel/using-websockets-with-react-50pi