useMemo 和 useCallback 是两个强大的 React hook,它们在防止不必要的重新渲染方面发挥着至关重要的作用,从而优化组件性能。它们是开发人员创建响应迅速且高效的 React 应用程序的必备工具。
在本指南中,我们将深入解释 useMemo 和 useCallback 的相似之处以及彼此之间的区别。我们将了解如何实施它们,何时使用每一个。
通常在React中大多数计算都很快,但有时你会对非常大的数组进行计算,或者一些不需要在每次重新渲染时执行的昂贵计算。
useMemo 和 useCallback 钩子可以通过缓存重新渲染之间那些昂贵的计算来帮助解决这个问题。
useMemo 是 React hook,它缓存重新渲染之间的计算结果,它需要两个参数:
要缓存重新渲染之间的计算,请将其包装在组件顶层的 useMemo 挂钩。
useMemo(fn, 依赖项)
const App = () => { const useMemo(() => { filterTodo(todos, tab) }, [todos, tab]) return(...) } export default App
注意 useMemo 的第一个参数是一个没有参数的函数。
第一次React会计算useMemo第一个参数的结果值,然后记住第二个参数,即依赖项列表。 React 会在重新渲染之间缓存计算结果,并且仅当其中一个依赖项值发生变化时才重新计算结果。
useCallback 钩子与 useMemo 钩子相同,唯一的区别是该钩子将缓存函数(useCallback 的第一个参数)而不计算值。该函数还可以接受与 useMemo 不同的参数。
要使用useCallback,您需要传递参数:
const cachedFn = useCallback(fn, dependency)
import { useCallback } from 'react'; export default function ProductPage({ productId }) { const handleSubmit = useCallback((orderDetails) => { post('/product/' + productId + '/buy', { referrer, orderDetails, }); }, [productId, referrer]);
如果您主要关心优化计算结果,请使用 useMemo。
如果您主要关心的是防止由于函数更改而导致不必要的重新渲染,请使用 useCallback。
有时你会有一个需要重新渲染的父组件,这也会导致子组件的重新渲染。可以使用备忘录来缓存组件。
假设我们有一个具有主题状态的 Todolist 组件,以及一个作为子组件的 List 组件。每当主题状态更改时,列表组件都会重新渲染,这是不必要的。要解决这个问题,请使用备忘录。
我们用 memo 包装 List 的功能组件。
export default function TodoList({ todos, tab, theme }) { // ... return ( <div className={theme}> <List items={visibleTodos} /> </div> ); }
import { memo } from 'react'; const List = memo(function List({ items }) { // ... });
在这篇综合指南中,我们了解了 useMemo 和 useCallback 钩子,如何使用它们,何时使用它们,并解释了它们对于优化 React 应用程序性能的好处。
以上是理解 `useMemo` 和 `useCallback`:综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!