【问题标题】:How to avoid sibling component rerender如何避免兄弟组件重新渲染
【发布时间】:2018-04-05 21:32:56
【问题描述】:

我想知道在数据未更改时是否可以避免兄弟组件重新渲染。 我想这可能是因为我的结构方式所以让我澄清一下我今天拥有的东西。 我有一个 Smart 组件,它可以访问类似于此的状态:

showcaseState = {
    products: {
        1: {
            name: "Ball"
        },
        2: {
            name: "Puzzle"
        }
    },
    cart: [2]
}

而这个 Smart 组件会渲染两个 Dumb 组件。第一个(ProductsList 组件)接收产品列表,第二个(Cart 组件)获取一个列表,该列表仅包含与购物车属性内的索引匹配的产品。 每当我在 ProductsList 组件中单击一个产品时,它都会触发一个将该产品索引添加到购物车的操作,因此购物车组件会被重新呈现。

问题是,ProductsList 也在重新渲染,尽管它的数据根本没有改变。我的猜测是它的发生是因为主组件重新渲染。我该如何避免这种情况?我应该让 ProductList 组件智能,让它访问产品状态并从主组件中删除产品吗?

对于实现这一目标的最佳方法,我有点迷茫。

编辑

Smart 组件的渲染是这样的

let { products, cart } = this.props.app
let cartProds = cart.map(prodId => { return products[prodId] })

<div>
    <ProductsList prods={products} />
</div>
<div>
    <Cart prods={cartProds} />
</div>

【问题讨论】:

  • 如果您可以发布一些关于您渲染 Cart 和 ProductList 组件的位置的 sn-ps 以及您传递给它们的属性,将会很有帮助。
  • 看看React.PureComponent(一般是shouldComponentUpdate())。
  • 如何更改产品列表?这可能是因为对列表的引用已更改。要克服这个问题,您将需要实现 shouldComponentUpdate 或维护对列表的引用(如果未更改)。

标签: javascript reactjs


【解决方案1】:

对于任何对此感兴趣的人,我最终使用 redux 来管理应用程序状态,并分离每个组件所需的东西。

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 2020-12-13
    • 1970-01-01
    • 2018-12-24
    • 2023-01-28
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多