我有一个子组件,它在useEffect
中执行fetch
,然后调用传入的onChange
处理程序.子组件被重新呈现3次(并执行fetch
3次),所有这些都是因为父组件的onChange
函数"更改"了.
要求父母将onChange
包装在useCallback
中是可行的,但似乎是错误的,因为父母不应该关心子元素是如何实现的.我还可以让子元素缓存onChange
(可能有useRef
或像usePrevious
这样的定制钩子),并判断useEffect
是否发生了更改,但这似乎也有点过头了.
对于这种模式,有没有最佳实践?(理想情况下不需要重做或类似的)
import { useEffect, useState } from 'react';
const Child = ({ onChange, value }) => {
useEffect(() => {
console.log("called");
fetch(`blah/${value}`)
.then((result) => onChange(result))
.catch((error) => onChange(error));
}, [value, onChange]);
return <div>Child</div>;
};
export default function Parent () {
const [result, setResult] = useState();
return (
<div>
{result}
<Child
value={0}
onChange={r => {
setResult(r.toString());
}}
/>
</div>
);
}