问题:
在hooks开发过程中某些时候useEffect的第二个参数是一个函数,此方法没有返回值return。 页面出现一直重复渲染。
原因:
useEffect的第二个参数某一项是一个方法,Effect之后页面重新渲染生成一个新的方法,重新触发Effect,以此循环导致。
解决:
使用useCallback对此方法进行缓存
//第一个参数接收一个函数,useCallback调用后返回一个新的被缓存的记忆函数
useCallback(fn, []); //return 一个新的function
此前也想到用useMemo,但是:
//第一个参数接收一个函数,useMemo调用后返回第一个参数函数return的被缓存的记忆的值
useMemo(() => fn, []); //return 一个fn的记忆function
useMemo(() => obj, []); //return 一个obj的记忆Object
至此得出useMemo和useCallback的相同和区别
相同
useMome和useCallback实现原理完全一致
useMemo(() => fn, []);
//等效于
useCallback(fn, []);
区别
useMemo缓存的是第一个参数函数return的值
useCallback缓存的是第一个参数函数
注意
为什么最终选择useCallback而不是useMemo,注意开头的问题,方法没有返回值,没有return。useMemo是对函数返回值的缓存,而useCallback是对该函数的缓存。所以不能使用useMemo。