【发布时间】:2023-02-15 16:32:40
【问题描述】:
我的 React 应用程序中有一个自定义挂钩,它公开了一个函数 (hookFn) 来计算 value。一旦更新了值(状态更改、触发 useEffect),挂钩就会通过回调函数提醒应用程序。问题是:在我的回调函数中,我希望能够通过hook.value 访问该值,但它似乎已经过时了!即使我知道值状态已更新!
代码沙盒:https://codesandbox.io/s/stoic-payne-bwp6j5?file=/src/App.js:0-910
import { useEffect, useRef, useState } from "react";
export default function App() {
const hook = useCustomHook();
useEffect(() => {
hook.hookFn(hookCallback);
}, []);
function hookCallback(value) {
console.log({givenValue: value, hookValue: hook.value});
}
return "See console for output";
}
function useCustomHook() {
const callbackRef = useRef(null);
const [value, setValue] = useState("initial value");
useEffect(() => {
if (callbackRef.current) {
callbackRef.current(value);
}
}, [value]);
function hookFn(callbackFn) {
callbackRef.current = callbackFn;
setValue("value set in hookFn");
}
return { hookFn, value };
}
仅供参考:在我的实际应用程序中,钩子用于搜索,随着更多搜索结果可用,它可能会多次调用回调函数。
有什么方法可以确保hook.value 有效吗?或者一般来说,钩子公开状态变量是不好的做法吗?
【问题讨论】:
-
您是否必须在实际应用中使用
setInterval?还是仅举个例子? -
@Jae 是的——这是一个可能很昂贵的搜索功能,所以我希望它异步运行。在应用程序的最终版本中,它可能会同时搜索本地缓存和 ajax 获取的数据,但我仍然可能会使用 setTimeout,因此它从一开始就异步运行。这听起来像是不好的做法吗?
标签: reactjs react-hooks