【问题标题】:Can't access updated state inside useEffect hook无法访问 useEffect 挂钩内的更新状态
【发布时间】:2020-07-23 19:06:51
【问题描述】:

我有一个节点服务器,它监听load video 事件,然后发出load 事件,以加载视频。

我在客户端监听这个事件,如下所示:

useEffect(() => {
    socketRef.current = io.connect('/');

    socketRef.current.on("load", () => {
        loadVideo();
    })
}, []);

对于本例,loadVideo 函数只记录 videoID 的值,其设置如下:

<input type="text" placeholder="video link" value={videoID} onChange={e => setVideoID(e.target.value)} />

每当loadVideo 函数从 useEffect 内部执行时,它都会记录初始状态,这是一个空字符串,但如果我要从不在 useEffect 内部的某个其他函数调用该函数,那么它记录更新的值。谁能解释这是为什么?

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    这是因为您的 useEffect 没有依赖项,这意味着它仅在组件安装时调用。我会将videoId 添加为其依赖项。

    只是一个旁注,如果你在这里发布你的 loadVideo 代码,它不会受到伤害:)

    【讨论】:

    • ``` useEffect(() => { socketRef.current = io.connect('/'); socketRef.current.on("load", () => { loadVideo(); }) }, [videoId]); ```类似的东西
    • 没错
    • 感谢您的回答。 loadVideo 函数只是 console.logs 的 videoID 值。如果我不希望 useEffect 在每次 videoID 更改时运行,您将如何编写代码,因为我只想在单击按钮时触发 load 事件?
    • 那么您将忘记useEffect,只需将您的loadVideo 分配给onClick 事件,如下所示:`'。
    • 我正在考虑这种方法,但我认为我需要将socketRef.current.on("load", () =&gt; { loadVideo(); }) 放入useEffect 中,因为我不想设置多个load 事件侦听器和socket使用监听器本身,因为它将为所有用户运行loadVideo。
    猜你喜欢
    • 2019-09-23
    • 2021-05-24
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多