- 调用setState,就会触发组件的重新渲染,无论前后的state是否不同
- 父组件更新,子组件也会自动的更新
基于上面的两点,我们通常的解决方案是:使用immutable进行比较,在不相等的时候调用setState;在shouldComponentUpdate中判断前后的props和state,如果没有变化,则返回false来阻止更新。
useMemo
糟糕的代码
1 | import React from 'react'; |
每次count
或者val
变化都会触发组件的重新渲染,expensive()
函数就会重新执行。
使用useMemo
1 | export default function WithMemo() { |
这样,只会在count
值改变的时候执行函数,并且由于缓存了上一次的sum
值,因此可以放心地获取到最新的sum
值。
useCallback
使用场景是:有一个父组件,其中包含子组件,子组件接收一个函数作为props;通常而言,如果父组件更新了,子组件也会执行更新;但是大多数场景下,更新是没有必要的,我们可以借助useCallback来返回函数,然后把这个函数作为props传递给子组件;这样,子组件就能避免不必要的更新。
1 | import React, { useState, useCallback, useEffect } from 'react'; |
总结
- 可以发现和useEffect很像,最大的不同是,useEffect可以处理副作用,但是useMemo和useCallback不可以
- useCallback返回的是缓存的函数,我们可以借助ES6的set数据结构来判断这个函数是否发生改变