【问题标题】:Why is my effect running multiple times, slowing the application after a few sends?为什么我的效果运行多次,几次发送后应用程序变慢?
【发布时间】:2020-02-21 23:11:53
【问题描述】:

我使用了当前的代码,但是我得到了多个 console.logs,我在这里做错了什么? 我尝试使用 useCallback 和 useMemo,但也许我用错了?

    useEffect(() => {
        io.on('message', data => {
            console.log(data);
            setMessages([...messages, {...data}]);
        });
    }, [messages]);

    const sendMessage = async event => {
        event.preventDefault();
        if (!message) return;

        io.emit('message', {
            conversationId: conversation._id,
            message: {
                user: {
                    name: user.name,
                    _id: user._id
                },
                text: message,
                createdAt: Date.now()
            }
        });

        const data = {
            conversationId: conversation._id,
            text: message,
            fromUserId: user._id
        };
        setMessage("");
        await axios.post('/api/chat/send-message', data);
    };

【问题讨论】:

    标签: reactjs socket.io


    【解决方案1】:
    useEffect(() => {
        io.on('message', data => {
            console.log(data);
            setMessages([...messages, {...data}]);
        });
    }, [messages]);
    

    此效果将事件处理程序添加到message 事件。每当依赖数组中的messages 发生变化时,它就会运行。所以我认为每次设置messages 时都会建立多个事件处理程序。

    您可能希望提供一个清理函数,将旧处理程序解除绑定作为效果的返回值,以便清理旧处理程序。

    类似:

    useEffect(() => {
        const handler = data => {
            console.log(data);
            setMessages([...messages, {...data}]);
        };
        io.on('message', handler);
    
        return function cleanup() {
           // Or whatever the unbind handler syntax is for whatever io is.
           io.off('message', handler);
        };
    }, [messages]);
    

    【讨论】:

    • 很高兴它有帮助!不要忘记投票并接受有用的答案。欢迎使用 Stack Overflow!
    • 我不能投票,因为我的声誉不够高
    • 您仍然可以接受已接受的答案。只需点击答案左侧的勾号图标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多