【发布时间】:2022-01-07 03:02:48
【问题描述】:
我在 stackoverflow 上发现了一些与此相关的问题,但没有什么能满足我在使用 useEffect 时经常遇到的用例。假设我有一些这样的代码:
const ApiViewer = (props) => {
const [result, setResult] = useState('')
useEffect(async () => {
setResult(await callApi(props.valueThatWillChangeButIOnlyCareAboutItsInitialValue))
}, [])
return <div>{result}</div>
}
exhaustive-deps 规则将抛出,要求我将 props.valueThatWillChangeButIOnlyCareAboutItsInitialValue 放入依赖数组中。我不想这样做,因为我只想要初始值。我可能会在某处单独使用该道具。
我也想不出另一种写法。
我也有其他人似乎有的问题,即使用我知道永远不会改变的功能/等。我不想将它们添加到这个数组中,看起来很愚蠢。
Dan Abramov 说通常禁用它是一个错误,以后会严重影响您。多年来我一直以这种方式使用它,在新项目中开始出现这条规则之前,我没有发现任何问题。
我使用 React 完全错了吗?
编辑:我已经更彻底地阅读了this 线程,并得出结论认为 Dan Abramov 真的很关心程序员,因为他希望他们关注have a job for life!我现在正在从我的项目中删除此规则。
【问题讨论】:
-
“我也有其他人似乎有的问题,即使用我知道永远不会改变的函数/等。我不想将它们添加到这个数组中,看起来很愚蠢。”您可以将“不更改”的函数移出每个渲染周期重新声明它们的范围或您可以简单地记住它们并将它们添加到依赖项数组中无论如何,因为它们现在将成为稳定的参考。不要禁用 React hooks linting 规则,它可能弊大于利,而不是仅仅为你想忽略的那些添加
// eslint-disable-next-line react-hooks/exhaustive-deps评论。 -
This comment 来自您链接的线程是最好的,恕我直言。它提到了我之前遇到的一个问题。您从
/thing/1导航到/thing/2,并且ThingDashboard组件用于两条路线。由于 DOM 没有进行有意义的更改,因此不会创建该组件的新实例,但之前渲染中的实例现在具有不同的 props 或上下文值。任何“挂载”运行的东西此时都不会运行,这可能是一个大而令人困惑的问题。
标签: reactjs react-hooks eslint