使用 React / Websockets 渲染用户数

Posted

技术标签:

【中文标题】使用 React / Websockets 渲染用户数【英文标题】:Render User Count With React / Websockets 【发布时间】:2018-02-21 02:50:05 【问题描述】:

我有一个服务器文件,它在这里使用 Websockets 发送数据。如您所见,我有一个计数器,我定义为clientCount,我想根据连接到我的主机的用户数量来增加/减少它。到目前为止,我能够在我的控制台中显示连接,但不能在我的 React 应用程序中显示。

const wss = new SocketServer( server );

let clientCount = 0;

wss.on('connection', (ws) => 
  console.log('Client connected');
  clientCount++;

  console.log(clientCount);

  ws.on('message', (message) => 
    console.log('Message from client', message);

    let parsedMessage = JSON.parse(message);

    parsedMessage.id = uuid();
    console.log(message); 

    wss.clients.forEach(function each(client)  
      if (client.readyState === ws.OPEN) 
        client.send(JSON.stringify(parsedMessage));
      
    );
  );

  ws.on('close', () => 
    console.log('Client disconnected');
    clientCount--;
  );

); 

在我的 React 应用程序中,在我的 componentDidMount() 下,我正在配置我的状态以使用用户名/内容显示在我的控制台中,但这是不相关的信息。

在我的render 在段落标记内调用中,我想在该字段中显示在线用户数量,并在每次连接到主机时更新,然后断开连接。如何显示这些信息?

componentDidMount() 

    this.socket = new WebSocket("ws://localhost:3001")

    this.socket.onmessage = (event) => 

      let message = JSON.parse(event.data)

      this.setState(
        messages: this.state.messages.concat([
          username: message.username,
          content: message.content,
          id: message.id
        ])
      )

      console.log(JSON.parse(event.data));
    


  render() 
    const currentUser, messages = this.state

    return (
      <div>
        <nav className="navbar">
          <a href="/" className="navbar-brand">Chatty</a>
          <p>RENDER USER COUNT HERE</p>
        </nav>

        <MessageList messages=messages />      
        <ChatBar userProp=currentUser.name messages=messages submitMessage=this.newMessage/>
      </div>
    );
  

【问题讨论】:

使用的是什么SocketServer 类? @Aaron 考虑使用connection 【参考方案1】:

您可以使clientCount 可观察。然后在你的反应组件中订阅它的变化。每次clientCount 更改时,使用 setState 触发视图更新。

喜欢这个

class YourComp extends Component 
  constructor(props) 
    super(props)
    this.state =  count: 0     
  

  onCountChange = (newCount) => 
    this.setState( count: newCount)
  

  componentDidMount() 
    clientCountObservable.subscribe(this.onCountChange)
  

  componentWillUnmount() 
    clientCountObservable.unsubscribe(this.onCountChange)
  

一个简单的 Observable 就像

class Observable 
  constructor(value) 
    this.value = value
    this.subscribers = []
  

  subscribe(subscriber) 
    this.subscribers.push(subscriber)
  

  unsubscribe(subscriber) 
    const index = this.subscribers.indexOf(subscriber)
    if (index > -1) 
      this.subscribers.splice(index, 1)
    
  

  setValue(value) 
    this.value = value

    this.subscribers.forEach(sb => sb(value))
  

  getValue() 
    return this.value
  

您可以创建自己的 observable 类,或使用其他一些 npm 包。

【讨论】:

感谢您的回答。 clientCountObservable 究竟来自哪里?我必须自己做吗? 您可以创建自己的 Observable 类。有很多方法可以创建它。

以上是关于使用 React / Websockets 渲染用户数的主要内容,如果未能解决你的问题,请参考以下文章

使用 React、Redux 和 Websocket 处理请求

React Native 和使用 websockets

通过 websockets 向聊天组件(react.js)添加消息

在 create-react-app 中使用 Socket.io-client 的 WebSockets 代理

使用 WebSockets 的反应原生应用程序中的架构

React Native 和 Websockets (sockets.io) 的 XMLHttpRequest 错误