为什么 useIsMounted return 是回调而不是值本身?
Why does useIsMounted return a callback instead of the value itself?
我指的是 usehooks-ts 中的 useIsMounted
。我试图理解为什么函数返回 useCallback(() => isMounted.current, [])
而不是 isMounted.current
.
我已经在仅使用 setTimeout
模拟异步工作的 CodeSandbox 中测试了这两个想法,并且我没有发现返回值而不是回调的任何问题。我错过了什么?
出于某种原因,这个 useIsMounted
钩子的作者决定 return 一个函数而不是 isMounted
布尔值。 returned 函数已记忆,因此它可以作为回调安全地传递给子组件。
虽然返回 isMounted.current
不起作用,但是 return 整个 isMounted
参考有效。
示例:
const useIsMounted = () => {
const isMounted = useRef(false);
useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
这要求消费者知道它是一个 React ref,并且他们需要解压当前的 ref 值。
function Child() {
const [data, setData] = useState("loading");
const isMounted = useIsMounted();
// simulate an api call and update state
useEffect(() => {
void delay(3000).then(() => {
if (isMounted.current) setData("OK"); // <-- access ref value
});
}, [isMounted]);
return <p>{data}</p>;
}
似乎 return 记忆函数只是一个设计决定。
我指的是 usehooks-ts 中的 useIsMounted
。我试图理解为什么函数返回 useCallback(() => isMounted.current, [])
而不是 isMounted.current
.
我已经在仅使用 setTimeout
模拟异步工作的 CodeSandbox 中测试了这两个想法,并且我没有发现返回值而不是回调的任何问题。我错过了什么?
出于某种原因,这个 useIsMounted
钩子的作者决定 return 一个函数而不是 isMounted
布尔值。 returned 函数已记忆,因此它可以作为回调安全地传递给子组件。
虽然返回 isMounted.current
不起作用,但是 return 整个 isMounted
参考有效。
示例:
const useIsMounted = () => {
const isMounted = useRef(false);
useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
这要求消费者知道它是一个 React ref,并且他们需要解压当前的 ref 值。
function Child() {
const [data, setData] = useState("loading");
const isMounted = useIsMounted();
// simulate an api call and update state
useEffect(() => {
void delay(3000).then(() => {
if (isMounted.current) setData("OK"); // <-- access ref value
});
}, [isMounted]);
return <p>{data}</p>;
}
似乎 return 记忆函数只是一个设计决定。