我创建了自己的定制钩子 useDebouncedEffect
, 它将等待状态在延迟时间内没有更新后才执行 useEffect
.
在这个示例中, 当你停止点击按钮1秒后,该效果将记录到控制台。
沙盒示例
https://codesandbox.io/s/react-use-debounced-effect-6jppw
App.jsx
import { useState } from "react";
import { useDebouncedEffect } from "./useDebouncedEffect";
const App = () => {
const [value, setValue] = useState(0)
useDebouncedEffect(() => console.log(value), [value], 1000);
return (
<button onClick={() => setValue(value + 1)}>{value}</button>
)
}
export default App;
useDebouncedEffect.js
import { useEffect } from "react";
export const useDebouncedEffect = (effect, deps, delay) => {
useEffect(() => {
const handler = setTimeout(() => effect(), delay);
return () => clearTimeout(handler);
}, [...(deps || []), delay]);
}
如果您不希望看到警告并且要避免linter因为没有作为依赖项而抱怨,则需要添加禁用exhaustive-deps的注释。将effect作为依赖项添加将在每次渲染时触发useEffect。相反,您可以将检查添加到useDebouncedEffect
以确保它正在传递所有依赖项(请参见下文)。
向useDebouncedEffect
添加exhaustive dependencies检查
如果您想让eslint检查useDebouncedEffect
的exhaustive dependencies,可以将其添加到package.json
中的eslint配置中。
"eslintConfig": {
"extends": [
"react-app"
],
"rules": {
"react-hooks/exhaustive-deps": ["warn", {
"additionalHooks": "useDebouncedEffect"
}]
}
},
https://github.com/facebook/react/tree/master/packages/eslint-plugin-react-hooks#advanced-configuration
App
组件之外,并在useEffect
函数中调用它? - Tholle