首页 > 解决方案 > react + redux 应用程序中的 agGrid 正在修改底层数据

问题描述

我在 react + redux 应用程序中使用最新的 agGrid 企业。

问题是我正在使用 agGrid 的内置编辑,这是直接修改底层数据,即从 redux 存储返回的数组。这打破了不变性原则。有没有办法使用/配置 agGrid 来修改数据,但是:

谢谢

标签: reactjsreduxag-gridag-grid-react

解决方案


编辑:更详细地扩展我的答案。

您必须设置一个“valueSetter”函数,并将其设置在每一列上。最简单的方法是使用 defaultColDef。快速注意,我表中的每一行都是一个“交易”,因此您会看到对交易的引用,而不是其他形式的标识。

例如:

<AgGridReact
      // OPTIONS REQUIRED FOR OPTIMIZATION WITH REACT
      reactNext
      deltaRowDataMode
      getRowNodeId={data => data.transaction_id}

      // OTHER OPTIONS
      rowSelection="multiple"
      editType="fullRow"

      // TABLE DATA
      defaultColDef={{ ...defaultColDef, valueSetter }}
      columnDefs={columns}
      rowData={transactions}

      // DISPLAY
      rowClassRules={rowClassRules}

       // EVENTS
      onGridReady={onGridReady}
      onRowEditingStarted={onRowEditingStarted}
      onRowEditingStopped={onRowEditingStopped}

    />

不要忘记react和redux所需的优化项。(reactNext、deltaRowDataMode、getRowNodeId)。

我定义的 defaultColDef 很简单:

defaultColDef: {
  resizable: true,
  sortable: true,
  filter: true,
  editable: true,
},

valueSetter 是一个非常简单地定义为的函数:

const valueSetter = (params) => {
  allActions.columnEdit(params.data, params.oldValue, params.newValue, params.colDef);
  return false;
};

allActions.columnEdit 只是调用我在导入中定义的 Redux 操作,然后与 connect() 和 mapDispatchToProps 绑定。return false 是防止状态突变所必需的。确保您的 redux 操作处理您需要做的任何事情。这是我的例子:

  case actionTypes.COLUMN_EDIT: {
  // FOR EACH COLUMN EDITED, CHECK IF ANYTHING CHANGED
  // POST CHANGES TO NEW STATE
  if (payload.oldValue !== payload.newValue) {
    const account = 'acct01';
    const column = payload.colDef.field;
    const index = state[account].transactions.findIndex(
      t => t.transaction_id === payload.t.transaction_id,
    );
    return produce(state, (draft) => {
      const transaction = draft[account].transactions[index];
      transaction[column] = payload.newValue;
    });
  }
  return state;
}

希望这可以帮助。对于应该由 Ag-Grid 直接处理的内容,似乎有很多额外的解决方法,但也许他们会将一些未来的开发投入其中。

https://www.ag-grid.com/javascript-grid-value-setters/


推荐阅读