NextJS-如何在React的useEffect中执行一些代码.StrictMode孩子吗?



我有一个问题。我正在开发一个nextJS应用程序。React渲染我的组件两次。我知道这是因为StrictMode。但是在ReactnextJS文件中我发现他们强烈建议我们使用StrictMode。但在我的应用程序的一部分,我正在工作,我使用useEffect,我想要一些代码在useEffect运行只是一次,而不是两次!因为在那里运行两次代码,会产生严重的bug。那么我该怎么做呢?我怎么能做一些事情,使反应运行一些代码在useEffect一次?我把[]作为useEffect的依赖,但它没有工作!例如:

`//inside a component that is a child of React.StrictMode
useEffect(() => {
/* strict mode cuses adding something to body twice. I want to add it just once and without using cleanup function */
document.body.appendChild(something)
//it runs twice, too. I dont want it!
console.log('test')
}, [])
`

谢谢你的帮助!

一般的建议是每个效果都应该返回一个" cleanup ";函数,初始的effect + cleanup应该是no-op(因此effect->cleanup->effect = effect)。在您的示例中,您可以在清理中删除附加的DOM节点:

useEffect(() => {
const node = document.body.appendChild(something)
return () => document.body.removeChild(node);
}, [])

严格模式的目标是在未来版本的react中捕获类似的问题,在这种情况下,效果可能会在奇怪的情况下运行两次(react可能会卸载和重新安装组件,然后错误就会出现)。

如果你让某些东西依赖于useEffect函数,那么它只在"某些东西"发生变化时才运行它呢?不幸的是,渲染两次以清除副作用只是严格模式的工作方式,并且没有一个好的方法来解决这个问题。虽然它是推荐的,但我并不总是使用它,而且我是nextjs的忠实用户。

最新更新