Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does useState() duplicate websocket events?

My react component is receiving messages from a server via a websocket. When I try to update state using useState() the sockets get duplicated.

If I do this...

import React, {useState} from 'react'

export default () => {

    let[message, setMessage] = useState()

    let ws = new WebSocket("ws://blah");

    ws.onmessage = (e) => {
        let obj = JSON.parse(e.data);

        // event name
        console.log(obj.event);

        // event data
        console.log(obj.value);

        // setMessage(obj.value)

        ws.close
    }
    return <div>
            {message}

    </div>
}

Then the console shows each message on its own as expected

But if I comment back in setMessage(object.value) then all the connections are duplicated for every message

Somehow the setMessage() causes connections to be accumulated

like image 643
Kittovski Avatar asked Dec 14 '25 18:12

Kittovski


1 Answers

That's because you're are creating a new websocket on every render.

Since connecting to a web socket is a "side effect" you'll want to use useEffect

import React, {useState} from 'react'

export default () => {

  let [message, setMessage] = useState()

  React.useEffect(() => {
    let ws = new WebSocket("ws://blah");

    ws.onmessage = (e) => {
      let obj = JSON.parse(e.data);

      // event name
      console.log(obj.event);

      // event data
      console.log(obj.value);

      setMessage(obj.value);
    };

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


  return (
    <div>
      {message}
    </div>
  );
}
like image 131
Galupuf Avatar answered Dec 18 '25 11:12

Galupuf



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!