数学以Redux形式。一起添加字段

时间:2018-03-26 03:55:15

标签: reactjs redux redux-form

我正在尝试使用选择器以redux形式将几组字段组合在一起。

目前我这样做......

componentDidUpdate(prevProps) {
    let total = (Number(this.props.tradeInTotal) + Number(this.props.thirdPartyEquipmentTotal));
    if(
      this.props.equipmentTotal != prevProps.equipmentTotal || 
      this.props.softwareTotal != prevProps.softwareTotal ||
      this.props.thirdPartyEquipmentTotal != prevProps.thirdPartyEquipmentTotal ||
      this.props.miscTotal != prevProps.miscTotal ||
      this.props.tradeInTotal != prevProps.tradeInTotal
    ){
      this.props.dispatch(change('mainForm', 'totalPurchase', total));
    }
  }

这不是特别可重复的,并且从样板的角度来看是非常可怕的。

我还有一个奇怪的问题,即直到多个小计中有一个数字才能开始计算(这可能通过设置初始值为0来解决,但这会增加更多的样板)有一个更好的解决方案,以redux形式添加字段?

1 个答案:

答案 0 :(得分:1)

如果所有props都与计算total有关,则可以使用Array.reduce。例如:

componentDidUpdate () {
  const total = Object.values(this.props)
    .reduce((total, value) => total + value, 0)

  if (/* new total differs from total in the store */) {
    this.props.dispatch(change('mainForm', 'totalPurchase', total));
  }
}

如果需要省略其他道具,请在总结之前使用Object.entriesArray.filter

componentDidUpdate () {
  const totalKeys = ['equipmentTotal', 'softwareTotal', ...]
  const total = Object.entries(this.props)
    .filter(([key, value]) => totalKeys.includes(key)) // filter out non-relevant props
    .reduce((total, [key, value]) => total + value, 0)

  if (/* new total differs from total in the store */) {
    this.props.dispatch(change('mainForm', 'totalPurchase', total));
  }
}