Javascript I';我对将useEffect与useCallback一起使用的后果感到困惑
假设我有一个函数,其行为不会随时间而改变,并且我计划在Javascript I';我对将useEffect与useCallback一起使用的后果感到困惑,javascript,reactjs,react-hooks,eslint,Javascript,Reactjs,React Hooks,Eslint,假设我有一个函数,其行为不会随时间而改变,并且我计划在useffecthook中使用此函数,因此我将其作为一个依赖项包含,以满足react hooks/depsESLint规则: constdosomething=useCallback((args)=>{…},[]); useffect(()=>{ doSomething(); },[doSomething]); 这是丹·阿布拉莫夫(Dan Abramov)提出的建议解决方案,目前效果良好,但我对React文档中的这些描述感到困惑: useC
useffect
hook中使用此函数,因此我将其作为一个依赖项包含,以满足react hooks/deps
ESLint规则:
constdosomething=useCallback((args)=>{…},[]);
useffect(()=>{
doSomething();
},[doSomething]);
这是丹·阿布拉莫夫(Dan Abramov)提出的建议解决方案,目前效果良好,但我对React文档中的这些描述感到困惑:
useCallback(fn,deps)
相当于usemo(()=>fn,deps)
您可以将usemo
作为性能优化,而不是语义保证。将来,React可能会选择“忘记”一些以前记忆的值,并在下次渲染时重新计算这些值,例如为屏幕外组件释放内存。编写代码,使其在没有usemo
的情况下仍能工作,然后添加代码以优化性能
阅读这些,我的印象是,没有usemo
,上面的代码就无法工作,因为usemo
(因此useCallback
)是一种性能优化方法,而不是语义保证,因此useCallback
中包装的doSomething
函数相当于:
constdosomething=usemo(()=>(args)=>{…},[]);
它的记忆值“React可能会选择遗忘”,并且我的useffect
回调将再次错误运行
有时我使用REF来存储一个感觉安全但又不必要的函数:
constdosomething=useRef((args)=>{…});
useffect(()=>{
doSomething.current();
}, []);
这里有什么我不知道的吗?这里你可以读到
useCallback
和useMemo
之间的区别:我了解钩子当前的工作方式(例如useCallback
与useRef
类似),但我从React文档中得到了印象,未来,useCallback
的工作方式将类似于usemo
(如中所述,它将是一种性能优化功能,而不是跳过重播的语义保证)。在这里,您可以了解useCallback
和usemo
之间的区别:我了解挂钩目前的工作方式,(例如:useCallback
如何与现在的useRef
相似),但我从React文档中得到的印象是,useCallback
在未来的工作方式与usemo
类似(如中所述,它将是一种性能优化功能,而不是跳过重新渲染的语义保证)。