首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让useEffect在组件挂载时只运行一次而不影响反应?

如何让useEffect在组件挂载时只运行一次而不影响反应?
EN

Stack Overflow用户
提问于 2020-12-03 00:51:48
回答 1查看 47关注 0票数 0

如果我希望useEffect在组件挂载时只运行一次,那么正确的方法是什么?检查以下示例:

代码语言:javascript
复制
const UseEffectCounter1 = () => {
    const [count, setCount] = useState(0);
    useEffect(() => {
        document.title = `You clicked ${count} times`;
    }, []);
    return (
        <div>
            <button onClick={() => {setCount(count + 1)}}>+1</button>
        </div>
    )
}

由于[]作为依赖项数组传递,因此会阻止重新呈现。代码运行正常,没有错误。“你点击了0次”只显示一次,点击按钮什么也不做,这符合“在组件挂载上只运行一次”的目的。

然而,这是说谎的反应,不建议在丹·阿布拉莫夫的文章here中。我应该将依赖项传递给依赖项数组,该数组被警告为React Hook useEffect has a missing dependency: 'count'。但是,如果我在依赖项数组中传递[count]useEffect会在组件挂载后开始更新。

useEffect只在组件挂载时更新的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 01:09:48

正如评论中提到的,如果您不打算每次更改计数时都更新标题,那么让useEffect钩子依赖于count是没有意义的。代码可能是:

代码语言:javascript
复制
const UseEffectCounter1 = () => {
    const [count, setCount] = useState(0);
    useEffect(() => {
        document.title = 'You clicked 0 times';
    }, []);
    return (
        <div>
            <button onClick={() => {setCount(count + 1)}}>+1</button>
        </div>
    )
}

无论如何,如果你真的想要避免硬编码的值,你可以这样做:

代码语言:javascript
复制
const UseEffectCounter1 = () => {
    const initCount = 0;
    const [count, setCount] = useState(initCount);
    useEffect(() => {
        document.title = `You clicked ${initCount} times`;
    }, [initCount]);
    return (
        <div>
            <button onClick={() => {setCount(count + 1)}}>+1</button>
        </div>
    )
}

因为initCount永远不会改变,所以useEffect钩子只会被触发一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65112532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档