websocket React useContext在useeffect中未定义

xdyibdwo  于 2023-10-20  发布在  React
关注(0)|答案(2)|浏览(104)

我正在编写一个带有Django channels和react的聊天应用。我想当一个新的消息被发送时,有一个当前用户的className。
我已经在上下文中有了当前用户,所以我只需要调用它并获取它。但是当我尝试在useEffect中获取用户时,它返回{}。

const {currentUser} = useContext(AuthContext)
useEffect(()=> {
        chatSocket.onmessage = function(e) {
            console.log(currentUser)
            const data = JSON.parse(e.data);
            setMessages(old => [...old, <p ref={oneRef} className={currentUser[0]?.username}>{data.message}</p>])
        };  
    },[])

我也需要useEffect,所以我不能只是删除它。我不想每次发送新消息时都调用axios调用。currentUser是一个对象。

93ze6v8z

93ze6v8z1#

但是当我尝试在useEffect中获取用户时,它返回undefined。
你是不是忘了把currentUser包含在 *dependecy数组 * 中?

const { currentUser } = useContext(AuthContext);
const ref = useRef(false);

useEffect(()=> {
    if (!ref.current) return;

    if (currentUser) {
       ref.current = true;

       chatSocket.onmessage = function(e) {
          console.log(currentUser)
          const data = JSON.parse(e.data);
          setMessages(old => [...old, <p ref={oneRef} className={currentUser[0]?.username}>{data.message}</p>])
       };  
    }
}, [currentUser])
7gcisfzg

7gcisfzg2#

正如kinduser所说,我只是添加了currentUser作为依赖关系。因为消息是重复的,我用清理函数解决了它。现在代码看起来像这样。

useEffect(()=> {
        let ran = true;
        chatSocket.onmessage = function(e) {
            if (ran == true) {
                console.log(checker) 
                const data = JSON.parse(e.data);
                setMessages(old => [...old, <p ref={oneRef} className={currentUser[0]?.username}>{data.message}</p>])
                setChecker(false)
            }
        }

        return () => {
            ran = false;
        };
        
        
    },[currentUser])

相关问题