javascript - 在函数中反应 useEffect
问题描述
我一直在尝试找到一种像这样使用 useEffect 的方法,但我认为我做得不对:
const [searching, setSearching] = useState(false);
function OnSearch(e) {
const searchValue = e.target.value;
useEffect(() => {
setSearching(true);
}, []);
clearTimeout(timer);
timer = setTimeout(() => {
setSearching(false);
window.location.href = '/block/' + searchValue;
}, 2000);
}
任何形式的帮助或指导将不胜感激。
解决方案
我假设useState
您在那里使用过此代码位于功能组件内。您不需要或想要useEffect
那里,只需将其删除并setSearching(true)
直接执行:
const [searching, setSearching] = useState(false);
function OnSearch(e) {
const searchValue = e.target.value;
setSearching(true);
clearTimeout(timer);
timer = setTimeout(() => {
setSearching(false);
window.location.href = '/block/' + searchValue;
}, 2000);
}
(事实上,你不仅不需要它,而且除了组件函数或钩子函数的顶层之外,你不能在任何地方使用钩子。所以不能在事件处理程序中使用。)
这就留下了timer
变量的问题。它不能只是组件函数中的局部变量,因为它将在每次渲染时重新创建。对于这样的非状态实例数据,您可以通过 使用对象useRef
,然后在该对象上使用属性,这将在组件的生命周期内保持一致:
const [instance] = useRef({});
所以这给了我们:
const [instance] = useRef({});
const [searching, setSearching] = useState(false);
function OnSearch(e) {
const searchValue = e.target.value;
setSearching(true);
clearTimeout(instance.timer);
instance.timer = setTimeout(() => {
setSearching(false);
window.location.href = '/block/' + searchValue;
}, 2000);
}
旁注:在 JavaScript 中,最普遍的约定是只有构造函数和(在 React 中)组件函数被大写,而不是其他类型的函数。所以onSearch
而不是OnSearch
. 你当然可以在自己的代码中做你喜欢的事情,但是在与他人合作或寻求帮助时,遵守约定有助于保持沟通清晰。
推荐阅读
- python - 以交互方式将 python matplotlib 嵌入到我的演示文稿中的可能方法
- json - 在颤振中使用built_value创建不可变模型时出错
- php - 在 Woocommerce 中基于地理 IP 国家禁用除 BACS 之外的所有支付网关
- reactjs - 在 Jenkins 中运行 Jests 测试时无法从 index.js 中找到模块“joi”
- c - 在 C 中比较字符串的最快方法
- python - Caffe 模型无法学习
- c# - 屏蔽帐号以仅查看 DevExpress GridViewDataColumn 中的最后 4 位数字
- python - 如何在 iris 数据集上使用逻辑回归来修复值错误
- git - 2次提交之间的GIT下载zip
- angular - Angular 2将相同的点击事件绑定到多个元素并更改类