了解 React Native 如何渲染组件对于构建高效、高性能的应用程序至关重要。当组件的状态或属性发生变化时,React 会自动更新用户界面(UI)以反映这些变化。结果,React 再次调用组件的 render 方法来生成更新的 UI 表示。
在本文中,我们将探讨三个 React Hook 以及它们如何防止 React 中不必要的渲染
这些工具使我们能够通过避免不必要的重新渲染、提高性能和有效存储值来优化代码。
在本文结束时,我们将更好地了解如何使用这些方便的 React hooks 使我们的 React 应用程序更快、响应更快。
在React中,useMemo可以防止不必要的重新渲染并优化性能。
让我们探索一下 useMemo 钩子如何防止 React 组件中不必要的重新渲染。
通过记住函数的结果并跟踪其依赖关系,useMemo 确保仅在必要时重新计算该过程。
考虑以下示例:
import { useMemo, useState } from 'react'; function Page() { const [count, setCount] = useState(0); const [items] = useState(generateItems(300)); const selectedItem = useMemo(() => items.find((item) => item.id === count), [ count, items, ]); function generateItems(count) { const items = []; for (let i = 0; iCount: {count}
Selected Item: {selectedItem?.id}
); } export default Page;
上面的代码是一个名为Page的React组件,它使用useMemo来优化selectedItem计算。
解释如下:
使用 useMemo 通过记住 items.find 操作的结果来优化性能。它确保仅当依赖项(计数或项目)发生变化时才执行 selectedItem 的计算,从而防止后续渲染时不必要的重新计算。
记忆化应该选择性地用于计算密集型操作,因为它会给渲染过程带来额外的开销。
React 中的 useCallback 钩子允许记忆函数,防止它们在每个组件渲染期间被重新创建。通过利用 useCallback。只要其依赖关系保持不变,部件仅创建一次并在后续渲染中重复使用。
考虑以下示例:
import React, { useState, useCallback, memo } from 'react'; const allColors = ['red', 'green', 'blue', 'yellow', 'orange']; const shuffle = (array) => { const shuffledArray = [...array]; for (let i = shuffledArray.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i 1)); [shuffledArray[i], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i]]; } return shuffledArray; }; const Filter = memo(({ onChange }) => { console.log('Filter rendered!'); return ( onChange(e.target.value)} /> ); }); function Page() { const [colors, setColors] = useState(allColors); console.log(colors[0]) const handleFilter = useCallback((text) => { const filteredColors = allColors.filter((color) => color.includes(text.toLowerCase()) ); setColors(filteredColors); }, [colors]); return (); } export default Page;{colors.map((color) => (
- {color}
))}
上面的代码演示了 React 组件中的简单颜色过滤和洗牌功能。让我们一步步看一下:
useCallback 钩子用于记忆 handleFilter 函数,这意味着该函数仅创建一次,并且如果依赖项(在本例中为颜色状态)保持不变,则在后续渲染中重用。
此优化可防止接收 handleFilter 函数作为 prop 的子组件不必要的重新渲染,例如 Filter 组件。
它确保如果颜色状态没有改变,过滤器组件不会重新渲染,从而提高性能。
增强 React 应用程序性能并避免不必要的重新渲染的另一种方法是使用 useRef 钩子。使用 useRef,我们可以存储一个在渲染过程中持续存在的可变值,有效防止不必要的重新渲染。
这种技术允许我们维护对某个值的引用,而不会在该值发生变化时触发组件更新。通过利用引用的可变性,我们可以优化特定场景下的性能。
考虑以下示例:
import React, { useRef, useState } from 'react'; function App() { const [name, setName] = useState(''); const inputRef = useRef(null); function handleClick() { inputRef.current.focus(); } return (setName(e.target.value)} ref={inputRef} />); }
上面的示例有一个简单的输入字段和一个按钮。 useRef 钩子创建一个名为 inputRef 的引用。一旦单击按钮,就会调用handleClick 函数,该函数通过访问inputRef ref 对象的当前属性来关注输入元素。因此,它可以防止输入值更改时不必要的组件重新渲染。
为了确保 useRef 的最佳使用,请仅将其保留用于不影响组件渲染的可变值。如果可变值影响组件的渲染,则应将其存储在其状态中。
在本教程中,我们探讨了 React 重新渲染的概念及其对应用程序性能的潜在影响。我们深入研究了有助于减少不必要的重新渲染的优化技术。 React 提供了各种钩子,使我们能够增强应用程序的性能。我们可以利用这些钩子在渲染之间有效地存储值和函数,从而显着提高 React 应用程序性能。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3