【问题标题】:How to update props dependent state如何更新道具依赖状态
【发布时间】:2020-01-16 16:16:36
【问题描述】:

我有组件连接到从 props 获取数据的 redux 存储:

const mapStateToProps = state => ({rowData: dataSelector(state)})

组件有自己的状态:

this.state = {
  rowsPerPage: 23,
  pageCount: 0,
}

props.rowData 发生变化时,我需要计算新的state.pageCount。我该怎么做?

【问题讨论】:

  • '...当props.rowData 改变' 你能更详细地解释一下究竟是什么改变了你的组件的道具吗?如果它以某种方式导致重新渲染,您可以使用mapStateToProps() 的第二个(可选)参数,这是您组件的ownProps
  • @YevgenGorbunkov,props.rowData 我用选择器得到。每次我更改过滤器选项时,我都会提取新的 props.rowData,当我获得新值时,我需要更新 state.pageCount
  • 我猜你来回传递数据的方式有点混乱。您是否会分享包含此功能的组件的更广泛的代码上下文?
  • 不幸的是我无法显示代码,此外,我没有看到任何混淆,从 redux-storage 到组件的数据流是直接的:组件获取道具并计算新状态就可以了。
  • 仍然非常感谢您的支持!

标签: reactjs ag-grid react-lifecycle-hooks


【解决方案1】:

您可以使用 getSnapshotBeforeUpdate 通过 if 条件确定 props.rowData 何时更改。根据值的更改时间,您可以按照您想要的方式更新您的state.pageCount

【讨论】:

  • 如何在 getDerivedStateFromProps 中使用 prevProps?
  • this.props 会给出之前的 props,但 getDerivedStateFromProps 方法的第一个参数会给出新的更新 props。
  • 我无法使用 'this.props',出现错误:“无法读取未定义的属性 'props'”
  • 尝试使用getSnapshotBeforeUpdate
【解决方案2】:

请创建组件WillReceiveProps

componentWillReceiveProps(newProps) {
if(newProps.rowData.length !== this.state.pageCount) {this.setState({pageCount: newProps.rowData.length})}
}

【讨论】:

  • componentWillReceivePropsdeprecated
  • 你使用 React 钩子吗? (反应 v > 16.8?)
  • 钩子的使用有点无关紧要。除非问题指定,否则您应该假设他们使用的是最新版本。我并不是说您的答案行不通,我只是指出并建议建议的解决方案不应使用已弃用的方法。
  • 你可以使用 UNSAFE_componentWillReceiveProps
  • 可以,但不应该。直接来自有关此方法的反应文档:“这些方法被认为是遗留的,您应该在新代码中避免使用它们”。关键不是它不起作用,而是你不应该使用它。
猜你喜欢
  • 1970-01-01
  • 2019-08-24
  • 2021-02-11
  • 1970-01-01
  • 2021-12-20
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多