0

我正在为我们正在开发的应用程序添加滑动以删除功能。由于我们不使用外部库来处理它的原因,所以我自己编写它。

在我的项目中,我有一个保存状态的容器。我setState用来更新状态,并将状态作为道具传递给这个子组件。在下面的组件中,componentWillReceiveProps当它们发生时使用正确的值更新被调用,但是它的子组件没有接收到它的 props 的更新。如果这还不够有意义,或者您需要查看更多代码,请告诉我。我只包含了我认为相关的代码部分,因为这是一个私人项目。

  constructor(props) {
    super(props);

    this.renderWishlistRow = this.renderWishlistRow.bind(this);
  }

  renderWishlistRow(product) {
    return (
      <WishlistRow
        item={product}
        onItemPress={this.props.onItemPress}
        onRemoveAction={this.props.onRemoveAction}
        shouldCloseRemoveButton={this.props.shouldCloseRemoveButton}
        onScrollAction={this.props.onScrollAction}
        itemPressed={this.props.itemPressed}
        onEndScroll={this.props.onEndScroll}
      />
    );
  }

然后,在渲染函数内部:

return (
  <KeyboardAwareListView
    dataSource={this.props.dataSource}
    renderRow={this.renderWishlistRow}
    renderSeparator={renderCardDividerAsSeparator}
    onScrollBeginDrag={this.props.onScrollAction}
    scrollEventThrottle={16}
    onScrollEndDrag={this.props.onEndScroll}
  />
);

提前感谢您的帮助。

编辑:我正在使用以下代码在父组件中设置状态:

this.setState({
  shouldCloseRemoveButton: true,
});

我最初没有包含它,因为componentWillReceiveProps正在调用来自父组件的正确状态更改。

编辑 2:我的应用程序这部分的应用程序层次结构如下:

WishlistContainer: contains the setState calls and passes as a prop: shouldCloseRemoveButton={this.state.shouldCloseRemoveButton}
    Wishlist: passes props to its child WishlistRow: shouldCloseRemoveButton={this.props.shouldCloseRemoveButton}
        WishlistRow: Continues to pass the props down as above, but componentWillReceiveProps is not called here, props are not updating at this level.
4

1 回答 1

0

我不会将此标记为已回答,因为我想要一个真正的答案,而我为解决这个问题所做的工作对我来说还不够好。

话虽如此,我的解决方法是将我试图传播的状态移动到react-redux. 将 redux 状态设置为包含我需要的内容 using mapDispatchToProps,然后将实际需要该状态的组件连接到 using mapStateToProps,允许组件接收他们需要做的事情的通知。

同样,我没有选择这个作为答案——尽管这是我为解决问题所做的——因为在某个地方发生了其他可疑的事情,我想看看是否有人知道为什么事情没有像以前那样工作。


编辑


自从这最初发生以来,我在其他时候遇到过这个问题。Flatlist 上存在一个道具 - 这不是我在问题中使用的原始组件,但原始组件现在已弃用,Flatlist 具有即将提到的此场景的道具 - 称为extraData. 这个特殊的道具也被监视以帮助 Flatlist 确定它是否应该重新呈现自己。

由于 ListView 已被弃用,我觉得使用 Flatlist 并确保传入一个extraData道具——假设你有一个不同的道具会随着列表数据的变化而改变——是这个问题的一个可接受的答案。

于 2018-02-16T20:13:07.230 回答