useDispatch 渲染未更改的子级

Posted

技术标签:

【中文标题】useDispatch 渲染未更改的子级【英文标题】:useDispatch render unchanged childern 【发布时间】:2020-04-24 14:54:46 【问题描述】:

这是一个带有挂钩到 Redux 商店以获取产品的功能组件。另外,我定义了removeFromCart 钩子来从产品列表中删除一个项目。

const ProductListHooks = () => 
  const products = useSelector( state => state.productsModule.products);
  const removeFromCart = useDispatch( type:actions.REMOVE_FROM_CART);
  return (
    <>
      products.map(product => 
        return (
          <ProductItem
            product=product
            key=product.id
            removeFromCart=removeFromCart
          />
        );
      )
    </>
  );
;

问题: 当我调用 removeFromCart 时,它会删除该项目,但会重新呈现列表中的所有其他项目。我该如何解决?

【问题讨论】:

您可以记住ProductItem 组件或为其实现shouldComponentUpdate(),如果道具没有更改,则停止重新渲染。您也可以将 ProductItem 设为纯组件,但请注意其含义(每次都检查浅 props) @Jayce444 它是记忆和纯粹的,但它不起作用。 【参考方案1】:

可能不漂亮,但你可以记住每个项目:

const ProductItem = function memo( product, removeFromCart ) 
 return useMemo(() => 
       <Item product=product removeFromCart=removeFromCart />
    , [product]);


【讨论】:

以上是关于useDispatch 渲染未更改的子级的主要内容,如果未能解决你的问题,请参考以下文章

NestedScrollView 内的子级未覆盖整个屏幕高度

setState 不会更新 React 中的子级

为啥 useDispatch 重新渲染父组件?

使用 React-Virtualized AutoSizer 时,未在测试中渲染子级

Unity Editor 脚本用指定 GameObject 的子级填充序列化数组 [关闭]

在 useEffect() 钩子中从父级传递的子级调用函数,React