reactjs 优化React组件渲染:何时优先考虑重新渲染较大的组件,而不是创建额外的小组件以提高性能?

nhaq1z21  于 3个月前  发布在  React
关注(0)|答案(2)|浏览(41)

已关闭。此问题需要更多focused。目前不接受回答。
**要改进此问题吗?**更新此问题,使其仅针对editing this post的一个问题。

6天前关闭
Improve this question
例如

function NavBar() {
  const { products } = React.useContext(StoreContext);

  return (
    <nav style={{ display: 'flex', gap: '1rem' }}>
      <a>Home</a>
      <a>
        Basket<span style={{ marginLeft: '0.5rem' }}>{products.length}</span>
      </a>
    </nav>
  );
}

字符串
实施例B

function NavBar2() {
  const { products } = React.useContext(StoreContext);
  return (
    <nav style={{ display: 'flex', gap: '1rem' }}>
      <a>Home</a>
      <a>
        Basket
        <ProductCount />
      </a>
    </nav>
  );
}

function ProductCount() {
  const { products } = React.useContext(StoreContext);

  return <span style={{ marginLeft: '0.5rem' }}>{products.length}</span>;
}


假设NavBar是一个大组件,它可以处理UserProfile的细节和很多东西。在这两个例子中,哪一个性能更好?创建一个像ProductCount这样的小组件是富有成效的,还是为react创建和维护另一个组件带来不必要的开销?
我想如果我把useContext放在我使用值的地方,我可以避免不必要的渲染组件,它不直接链接到值(这里是NavBar)。例如,如果产品得到更新,在示例A中,整个NavBar将被重新渲染,这可能是一个大组件,但在示例B中,只有ProductCount被重新渲染

xqk2d5yq

xqk2d5yq1#

没有足够的信息来说明哪一种性能更好,但从用户的Angular 来看,这两种方式都不太可能产生明显的影响。
如何检索和存储要显示的数据可能是性能差距所在。在本例中,您需要从服务器检索多少产品、图像质量、定价是否动态等变量更有可能影响性能。
随着扩展而最大化性能的一些最佳做法包括:
1.保持组件的小型化和可重用性,并将其仅用于显示信息
1.使用钩子控制信息的获取,并将需要的信息作为props传递给组件
1.昂贵的计算、API调用等应该包含在钩子中,并用useMemo或useCallback Package 。
文档中的Thinking-in-React是一个很好的资源,可以更好地理解如何将UI分解为组件。
你可以通过构建你的应用程序以有效地重用组件来进一步提高性能。我在下面包含了一个如何构建购物车的示例。
创建两个新文件,第一个文件名为CartLineItem.jsx,如下所示。

import React from 'react';
//pass your item details to the component as props. I've destructured the props for readability
export default function CartLineItem({ name, description, count }) {
    return (
        <div>
            <span>{name}</span>
            <span>{description}</span>
            <span>{count}</span>
        </div>
    );
}

字符串
第二个文件名为OrderSummary.jsx,在其中显示购物车的所有行项目以供查看。我们向该组件传递一个itemArray,它可以使用Reducer钩子进行更新,并与useContext钩子共享。

import React from 'react';
import CartLineItem from '../components/CartLineItem';
//pass your product details to the component as props. I've destructured the props to make it more readable
//by mapping the array you're able to re-use the same component to display each cart item on a seperate line
export default function OrderSummary(itemArray) {
    return (
        <>
            <div>Order Summary</div>
            {itemArray.map((item) => {
                return (
                    <CartLineItem
                        name={item.name}
                        count={item.count}
                        description={item.description}
                    />
                );
            })}
        </>
    );
}


以上是非常高级的,只是一个例子,说明了如何构建React应用程序以提高性能。使用React有很多很多不同的方法来提高性能,但大多数都取决于您的具体用例。
希望上面的内容能给你一些新的见解,让你了解如何构建你的React应用程序,以最大限度地提高性能并减少开发时间。
祝你一路顺风!

2lpgd968

2lpgd9682#

我告诉我的开发人员使用的经验法则是similar to the react documentation about keeping higher-order components as pure as possible,同时最大化容器的可读性。
对于你的例子,你正在提取ProductCount,如果这是一个执行非常特定功能的组件,那么它可以被提取。另一个原因可能是重用,如果你反复编写相同的代码行,那么你应该为此创建一个可重用的组件。
在创建可重用组件时,您还应该尝试使它们尽可能模糊和不依赖。
在性能方面,提取组件不太可能提高性能,因为性能完全取决于代码的设计方式。如果代码的编译和构建方式导致设计相同,则提取组件与不提取组件的效果是相同的。
做你提到的事情的主要目的是提高可读性,停止重复代码/创建可重用组件,以及更容易的错误处理和测试,但性能完全取决于代码本身及其设计方式,这可以在你提供的示例中很容易地看到,性能是相同的,但如果在提取的组件中存在问题,则诊断和解决小组件比大组件更容易。

相关问题