useMemo
memo类似于PureComponent作用是优化组件性能,防止组件触发重渲染
memo与PureComponent比较类似,前者是对Function Component的优化,后者是对Class Component的优化,都会对传入组件的数据进行浅比较,useCallback则会保证handleClick2不会发生变化
memo针对一个组件的渲染是否重复执行
<Foo />
usememo针对一段函数逻辑是否重复执行
() => {}
useEffect是在渲染之后完成的
useMemo是在渲染期间完成的--避免无用方法的调用
useMemo(() => [])
参数如果是空数组的话就会执行一次
useCallback
useMemo(() => {fn}) 等价于useCallback(fn)
# useCallback(减少render次数、减少计算量)
有人可能误认为useCallback可以用来解决创建函数造成的性能问题,其实恰恰相反。单个组件来看,useCallback只会更慢,因为inline函数是无论如何都会创建的,还会增加useCallback内部对inputs变化的检测
function A() {
const cb = () => {}; // 创建了
}
function B() {
const cb = React.userCallback(() => {}, [a, b]) // 还是创建了
}
useCallback的真正目的是在于缓存每次渲染时inline caallback的实例,这样方便配合上子组件shouldComponentUpdate或者React.memo起到减少不必要的渲染的作用。需要注意的是React.memo和React.useCallback一定要配对使用。缺了一个可能导致性能不升反降。毕竟无意义的浅比较也是消耗那么一点点性能。
返回一个memoized的回调函数,即返回一个函数的句柄,等同于函数的变量,因此useCallback的作用在于利用memoize减少无效的re-render,达到性能优化的作用
# useMemo(使用useMemo方法 避免无用方法的调用)
useMemo是拿来保持一个对象引用不变的。useMemo和useCallback都是React提供做性能优化的,比起classes,Hooks给了开发者更高的灵活度和自由,但是对开发者要求也搞了,因为hooks使用不恰当很容易导致性能问题
返回一个memoized值,useMemo函数每当deps发生变化的时候都会调用computeExpensiveValue内容,这是与useCallbacke最大的不同,useCallback不执行dosomething的内容,只是重新刷新函数句柄
TIP
句柄 官方上有这样一个等式:useCallback(fn, deps)相当于useMemo(() => fn, deps)。就是deps发生变化时候,useCallback返回一个可执行的fn的句柄,而useMemo则是执行() => fn,但是因为返回的是fn函数,因此当调用这种时,其实执行的是相同的fn函数的内容
# useMemo和useCallback的认识
- useMemo和useCallback都是是具有缓存作用的,只是它们缓存对象不一样,一个是属性,一个是缓存函数,特点都是,当缓存依赖的没变,去获取还是获取曾经的缓存
- useMemo是对函数组件的属性包装,返回一个具有缓存效果的新的属性,当依赖的属性没有变化的时候,这个返回新属性就会从缓存中获取之前的
- useCallback是对函数组件中的方法缓存,返回一个被缓存的方法
# 资料
useMemo的使用方式 (opens new window)
实例--react useCallback的常规使用方式? (opens new window)
说下 React 的 useEffect、useCallback、useMemo (opens new window)
React.memo和useMemo (opens new window)