Memoized 值的定义和使用

Hook useMemo() 提供了一个创建 Memoized 值的方法,允许对依赖项数组进行监控,仅当依赖项数组发生改变时才重新使用创建函数计算 memoized 值。Memoized 值有助于避免在每次渲染时都进行高开销的计算。useMemo() 的使用格式为 useMemo(fn, deps)。具体使用可参考以下示例。

const value = useMemo(() => computeValue(a, b), [a, b]);

在示例中,当依赖数组 [a, b] 中的任何一个值发生变化,React 都将重新计算新的值。如果不提供依赖数组,那么 React 在每次渲染时都会计算新的值。传入 useMemo() 的函数会在渲染期执行,请记住不要在这里执行任何副作用操作。useMemo() 中的依赖数组并不会被传入创建函数作为参数,所以就目前的 React 版本,不要尝试在创建函数中利用参数来访问依赖数组。

React 并不保证所有的 Memoized 值都能在依赖数组不发生变化时不被计算,例如在离屏组件中,React 会将组件状态从内存中丢弃,并在需要时重新计算,在这种情况下,Memoized 值就不会被记住。所以在编写应用时,可以先不使用 useMemo(),待代码可执行后,再使用 useMemo() 进行优化。

useMemo() 中的创建函数可以返回各式各样的对象,甚至可以被用来跳过子节点的重新渲染,这只需要在创建函数中返回一个组件即可。但是需要注意的是,Hook 调用不能被放置在循环中,如果需要在列表中使用,可以将列表项抽取成一个独立的组件来处理。

Warning

不是什么时候都必须要使用useMemo来优化组件中对于数据的处理,一般来说只有创建或者循环了成千上万个对象才会出现需要优化的问题。在不确定一段代码是否需要优化之前可以使用console.timeconsole.timeEnd两个方法来对一段处理所消耗的时间进行测量。useMemo不会使渲染变快,它的作用只是可以帮助组件跳过不必要的更新。