【问题标题】:Redux connect optimize mergePropsRedux 连接优化 mergeProps
【发布时间】:2019-11-22 07:05:30
【问题描述】:

我有一个由列表呈现的项目列表,如下所示:

items.map(item => (
  <ListItem
    item={item}
    updates={updates[item.id]}
    {/** other props like deleting loading*/}
  />
));

请注意,这里的 item 不是传递给动作创建者的内容 函数,ListItem 是一个容器,它将改变这一点。

我的项目容器有一个optimized mapStateToProps(它返回一个函数,而不是一个对象):

const mapDispatchToProps = {
  updateItem,
  //others
}
const mapStateToProps = () => {
  //create momoized state creator
  const memoizedStateCreator = createMemoized();
  return (unused, { item, updates }) =>
    //use memoized state creator
    memoizedStateCreator(item, updates);
};

在我点击保存项目时,我有这样的东西:

<button onclick={updateItem(item)}

我想把这个改成

<button onclick={updateItem}

为此,我可以使用mergeProps,但这会导致调用 Item(Item 函数)的渲染,即使没有任何更改,因为我总是返回一个新的引用作为 props。它还会导致 react 对结果进行影子 DOM 比较(而不是会跳过的纯组件)

MergeProps 无法使用 factory function(如 mapStateToProps)进行优化,我可以在其中创建记忆函数。

const mergeProps = (stateProps, dispatchProps) => ({
  ...stateProps,
  ...dispatchProps,
  updateItem: () => 
    stateProps.updateItem(stateProps.item),
});

做到这一点的一种方法是根本不使用mergeProps,而是使用包装函数:

const wrapper = props =>
  ListItem({
    ...props,
    updateItem: () => props.updateItem(props.item),
  });
export default connect(
  mapStateToProps,
  mapDispatchToProps
)(memo(wrapper));

我的问题是;有没有办法用 mergeProps 做到这一点,而不必将我的功能组件变成类?

从 mapDispatchToProps 返回一个函数在我的情况下不起作用,因为 item 不是来自 ownProps,它来自 mapStateToProps

【问题讨论】:

  • requestDelete 是一个 redux 操作吗?如果是这样,它可能应该映射到mapDispatchToProps
  • @trixn 是,requestDelete 第一次出现在我的问题中是在 mapDispatchToProps 对象中。但我发现我在 mergeProps 中使用错误。更新的问题。

标签: reactjs redux react-redux


【解决方案1】:

假设requestDelete 是一个可以调度的动作,您应该将它映射到您连接的ListItem 组件的mapDispatchToProps 中。 mapDispatchToProps 也可以是一个函数,它接收ownProps 作为第二个参数,它具有id

const mapDispatchToProps = (dispatch, {item}}) => ({
    requestDelete: () => dispatch(requestDelete(item.id)),
});

export default connect(mapStateToProps, mapDispatchToProps)(ListItem);

【讨论】:

  • 这可能是一个不错的解决方案,谢谢。没看到documented
  • 这对我不起作用,因为 item 来自 mapStateToProps 并且 ownProps 从 List &lt;ListItem item={item} 传递了 item,这实际上是与 mapStateToProps 给我的不同的项目,因为该项目可以与编辑合并。更新我的问题以明确这一点。
  • @HMR 但是项目不是由不受该合并影响的唯一 id 标识的吗?我对你的减速器逻辑知之甚少。我假设 id 足以让你的 reducer 删除该项目。
  • 在状态下,有一个名为updates 的对象如下所示:{1:{{field:'field value'}} 其中 1 是对象的 ID,“字段值”是用户键入的值。在 mapStateToProps 中,列表传递的项目将与此合并,如果存在用户输入将覆盖的位置(请参阅问题末尾的更新)。例如here
  • @HMR 我明白了,但是您的减速器实际上是否需要合并添加的信息,或者 id 是否足够?
猜你喜欢
  • 2018-09-23
  • 2017-11-22
  • 2011-05-10
  • 2018-02-26
  • 2011-05-22
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多