如何在编辑后更新 react-bootstrap-table2 单元格值,以便不同列中的按钮组件具有它?

How do I update a react-bootstrap-table2 cell value after it's edited so a button component in a different column has it?

我已经像这样设置了一个 react-bootstrap-table2(又名 react-bootstrap-table-next)table:

function buttonFormatter(cell, row) {
  return (
    <NominateButton
      row={ row }
      auctionId={ auctionId }
      teamId={ teamId }
    />
  );
}

const queue_columns = [{
  dataField: 'player.num',
  text: 'Player Num',
  editable: false
}, {
  dataField: 'player.name',
  text: 'Player',
  editable: false
}, {
  dataField: 'player.position',
  text: 'Position',
  editable: false
}, {
  dataField: 'initialBid',
  text: 'Initial Bid',
}, {
  text: 'Nominate',
  formatter: buttonFormatter,
  editable: false
}];

return (
  <BootstrapTable
    bootstrap4={ true }
    keyField='player.num'
    data={ this.state.data }
    columns={ queue_columns }
    cellEdit={ cellEditFactory({ mode: 'click',
                                 blurToSave: true }) }
    striped
    hover />
);

这是 table 的样子:

问题是在创建 table 时将行对象传递到 NominateButton 组件,因此当更新 initialBid 列时,更新值不会在行 属性 中更新为该行的 NominateButton。 NominateButton 在 GraphQL 变更中使用该 initialBid 值。

在一行中的 Initial Bid 单元格被编辑和更改后,我如何以某种方式使用更改后的值更新 NominateButton 的状态?

有没有什么方法可以在调用 cellEditFactory 时指定函数名称(使用 afterSaveCell 键)并将该函数名称作为 属性 传递给 NominateButton?

我通过创建一个函数来解决这个问题,该函数 return 在该行和列中编辑值并将该函数向下传递到按钮组件中:

  getInitialBid = (row) => {
    return this.state.data.find(r => r.rank === row.rank).initialBid;
  }

  render() {
    const { auctionId } = this.props;
    const { teamId } = this.props;

    const buttonFormatter = (cell, row) => {
      return (
        <NominateButton
          row={ row }
          auctionId={ auctionId }
          teamId={ teamId }
          getInitialBid={ this.getInitialBid }
        />
      );
    }

getInitialBid 函数在 table 的数据(在组件状态)和 returns 中找到来自 editable 的数据行(initialBid) 列。

NominateButton 组件将其传递给 NominateButtonMutator 组件:

class NominateButton extends Component {
  render() {
    const { row } = this.props;
    const { auctionId } = this.props;
    const { teamId } = this.props;
    const playerId = parseInt(this.props.row.player.id, 10);

    return (
      <NominateButtonMutator
        auctionId={ auctionId }
        teamId={ teamId }
        playerId={ playerId }
        row={ row }
        nominationsOpen={ data.team.nominationsOpen }
        subscribeToNominationsOpenChanges={ subscribeToMore }
        getInitialBid={ this.props.getInitialBid }
      />
    );
  }
}

并且 NominateButtonMutator 组件调用 getInitialBid 函数并将 return 值作为变量传递给 Apollo 突变:

const NominateButtonMutator = (props) => {
  const [submitBid] = useMutation(SUBMIT_BID_MUTATION);

  return (
    <div>
      <Button
        disabled={ !props.nominationsOpen }
        onClick={ () => {
          let initialBid = props.getInitialBid(props.row);
          submitBid({ variables: { auction_id: props.auctionId,
                                   team_id: props.teamId,
                                   player_id: props.playerId,
                                   bid_amount: parseInt(initialBid, 10) } });
        }}
        variant="outline-success">
        Nominate
      </Button>
    </div>
  );
};