聚势成锋 發表於 2023-4-11 16:49:00

react useMemo

<p><code>useMemo</code> 是 React 提供的一个用于优化组件性能的钩子函数。它可以缓存组件的计算结果,并在依赖项发生变化时重新计算。这可以避免在每次组件渲染时都重新计算相同的值,从而提高组件的性能。</p>
<p><code>useMemo</code> 的语法如下:</p>
<div class="cnblogs_code">
<pre>const memoizedValue = useMemo(() =&gt; computeExpensiveValue(a, b), );</pre>
</div>
<p>其中,<code>computeExpensiveValue</code> 是一个计算函数,它会在组件渲染时调用,并返回需要缓存的值。<code>a</code> 和 <code>b</code> 是计算函数的依赖项,当依赖项发生变化时,<code>useMemo</code> 会重新计算缓存的值。</p>
<p>使用 <code>useMemo</code> 的一个常见场景是在渲染大量数据时进行性能优化。例如,在渲染一个表格时,我们可能需要根据表格的数据进行一些复杂的计算,如计算每行数据的总和、平均值等。如果在每次渲染时都进行这些计算,会导致页面的响应变慢。使用 <code>useMemo</code> 可以缓存这些计算结果,并在数据发生变化时重新计算,从而提高页面的性能。</p>
<p>下面是一个使用 <code>useMemo</code> 的示例,该示例计算一个数组的总和:</p>
<div class="cnblogs_code">
<pre>import React, { useState, useMemo } from 'react'<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> App() {
const </span>= useState();

const sum </span>= useMemo(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    console.log(</span>'Calculating sum...'<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> numbers.reduce((acc, val) =&gt; acc + val, 0<span style="color: rgba(0, 0, 0, 1)">);
}, );

</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
    </span>&lt;div&gt;
      &lt;p&gt;Numbers: {numbers.join(', ')}&lt;/p&gt;
      &lt;p&gt;Sum: {sum}&lt;/p&gt;
      &lt;button onClick={() =&gt; setNumbers([...numbers, Math.floor(Math.random() * 10)])}&gt;<span style="color: rgba(0, 0, 0, 1)">
      Add Number
      </span>&lt;/button&gt;
    &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">);
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p>在上面的示例中,我们使用 <code>useMemo</code> 缓存了数组 <code>numbers</code> 的总和。当 <code>numbers</code> 发生变化时,<code>useMemo</code> 会重新计算总和。这样,我们就避免了在每次渲染时都重新计算总和的操作,从而提高了组件的性能。</p>
<p>需要注意的是,<code>useMemo</code> 的缓存值并不会在组件的多次渲染之间共享。每次渲染都会调用计算函数,并返回一个新的缓存值。因此,我们应该避免将 <code>useMemo</code> 的结果用作可变对象的引用,而应该将其用作值类型的数据。如果需要缓存可变对象,应该使用其他的缓存方案。</p>
<p>下面是一个使用 <code>useMemo</code> 优化表格组件性能的示例:</p>
<div class="cnblogs_code">
<pre>import React, { useMemo } from 'react'<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> Table(props) {
const { data } </span>=<span style="color: rgba(0, 0, 0, 1)"> props;

const columns </span>=<span style="color: rgba(0, 0, 0, 1)"> useMemo(
    () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> [
      {
      Header: </span>'ID'<span style="color: rgba(0, 0, 0, 1)">,
      accessor: </span>'id'<span style="color: rgba(0, 0, 0, 1)">,
      },
      {
      Header: </span>'Name'<span style="color: rgba(0, 0, 0, 1)">,
      accessor: </span>'name'<span style="color: rgba(0, 0, 0, 1)">,
      },
      {
      Header: </span>'Age'<span style="color: rgba(0, 0, 0, 1)">,
      accessor: </span>'age'<span style="color: rgba(0, 0, 0, 1)">,
      },
      {
      Header: </span>'Email'<span style="color: rgba(0, 0, 0, 1)">,
      accessor: </span>'email'<span style="color: rgba(0, 0, 0, 1)">,
      },
    ],
    []
);

const tableData </span>= useMemo(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    console.log(</span>'Computing table data...'<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> data.map((row) =&gt;<span style="color: rgba(0, 0, 0, 1)"> ({
      id: row.id,
      name: row.name,
      age: row.age,
      email: row.email,
    }));
}, );

</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
    </span>&lt;table&gt;
      &lt;thead&gt;
      &lt;tr&gt;<span style="color: rgba(0, 0, 0, 1)">
          {columns.map((column) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;th key={column.Header}&gt;{column.Header}&lt;/th&gt;
<span style="color: rgba(0, 0, 0, 1)">          ))}
      </span>&lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;<span style="color: rgba(0, 0, 0, 1)">
      {tableData.map((row) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> (
          </span>&lt;tr key={row.id}&gt;
            &lt;td&gt;{row.id}&lt;/td&gt;
            &lt;td&gt;{row.name}&lt;/td&gt;
            &lt;td&gt;{row.age}&lt;/td&gt;
            &lt;td&gt;{row.email}&lt;/td&gt;
          &lt;/tr&gt;
<span style="color: rgba(0, 0, 0, 1)">      ))}
      </span>&lt;/tbody&gt;
    &lt;/table&gt;
<span style="color: rgba(0, 0, 0, 1)">);
}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Table;</pre>
</div>
<p>在上面的示例中,我们使用了两个 <code>useMemo</code> 钩子函数:一个用于缓存表格的列定义,另一个用于缓存表格的数据。</p>
<p>在表格中,每次渲染都需要进行列的定义和数据的处理。由于这些操作可能比较耗时,因此我们可以使用 <code>useMemo</code> 缓存它们的结果。在第一次渲染时,<code>useMemo</code> 会计算出缓存的结果,并在后续渲染中直接使用缓存的结果,从而避免了重复计算的开销。</p>
<p>需要注意的是,我们在 <code>useMemo</code> 中指定了依赖项,以便在依赖项发生变化时重新计算缓存的结果。对于第一个 <code>useMemo</code>,我们没有指定任何依赖项,因为表格的列定义是静态的,不会随着时间的推移而改变。对于第二个 <code>useMemo</code>,我们指定了 <code>data</code> 作为依赖项,因为表格的数据可能会随着用户的操作而改变。</p>
<p>这样,我们就使用了 <code>useMemo</code> 钩子函数来优化表格组件的性能,从而提高了应用程序的响应速度。</p><br><br>
来源:https://www.cnblogs.com/wen-web/p/17306827.html
頁: [1]
查看完整版本: react useMemo