因此,在使用useEffect
调用依赖于状态的函数的 a 时,我遇到了以下情况。
例子:
// INSIDE APP COMPONENT
const [someState, setSomeState] = React.useState(0);
const [someTrigger, setSomeTrigger] = React.useState(false);
function someFunction() {
return someState + 1;
}
React.useEffect(() => {
const newState = someFunction(); // 'someFunction' IS BEING CALLED HERE
setSomeState(newState);
},[someTrigger])
问题:
在这种情况下,我应该someFunction
在内部声明useEffect()
还是将其保存在外部(但在组件的主体内部)是否安全?
我可以将它添加到dependency
数组中,但它会损害我的代码的可重复性,因为我想专注于trigger
.
由于useEffect()
将在新渲染后运行,是否可以安全地假设它将具有我在其中调用的函数的新副本?
是否有一个基本规则,什么时候应该在useEffect
钩子中声明函数,或者什么时候必须将它添加到依赖数组中?
编辑:请注意,必须useEffect
拥有这些函数的新副本,因为这些函数需要访问一些最新的state
变量。
笔记:
此代码在 CodeSandbox 上触发以下eslint 警告。虽然它工作得很好。
React Hook React.useEffect 缺少依赖项:'someFunction'。包括它或删除依赖数组。(react-hooks/exhaustive-deps)eslint
真实案例:
这是一个简化的例子。在我的真实案例中,这是一个带有过滤器组件的产品搜索页面。所以当我点击一个过滤器来激活它时(比如说,price <= 50
),我触发了一个useEffect()
“监听”activePriceFilters
状态变量的。然后,该效果调用一个函数(someFunction
在示例中),该函数将计算filteredList
并使用 new 设置新productList
状态filteredList
。
片段
function App() {
const [someState, setSomeState] = React.useState(0);
const [someTrigger, setSomeTrigger] = React.useState(false);
function someFunction() {
return someState + 1;
}
React.useEffect(() => {
const newState = someFunction();
setSomeState(newState);
},[someTrigger])
return(
<React.Fragment>
<div>I am App</div>
<div>My state: {someState}</div>
<button onClick={()=>setSomeTrigger((prevState) => !prevState)}>Click</button>
</React.Fragment>
);
}
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>