useEffect的第二个参数数组中某一项是个函数引发的重复渲染问题

224 阅读1分钟

问题:

在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。