ag-стиль ячейки сетки на основе динамического условия

#ag-grid #ag-grid-react

#reactjs #ag-сетка #ag-grid-реагировать

Вопрос:

Я ищу динамический рендеринг ячеек в ag-grid на основе устанавливаемого порогового значения, выше которого ячейка отображается зеленым или красным цветом.

Я попробовал следующее:

 <AgGridReact
  onGridReady={onGridReady}
  pagination={true}
  columnDefs={[
    { headerName: "SYMBOL", field: "symbol" },
    {
      headerName: "PRICE",
      field: "price",
      volatile: true,
      cellStyle: function (params) {
        if (params.value < threshold) {
          return { backgroundColor: "red" };
        } else {
          return { backgroundColor: "green" };
        }
      }
    }
  ]}
/>
  

и принимайте входные данные для порога (который задает состояние). Однако, несмотря на то, что состояние изменяется, никаких изменений в columnDefs .

Я использую .applyTransactionAsync() для высокочастотных обновлений. Следовательно, при использовании .setColumnDefs() таблицы не отображаются какие-либо данные.

Есть ли какой-либо способ, которым этот стиль ячейки выполняется на основе динамического условия для динамических данных вместо фиксированного?

Ответ №1:

Вы можете использовать AgGrid context для обновления динамического значения, которое затем можно использовать для передачи по сетке. Вот как вы можете ссылаться на context объект в своем cellStyle обратном вызове.

 {
  headerName: "PRICE",
  field: "price",
  cellStyle: (params) => {
    if (params.value < params.context.threshold) {
      return { backgroundColor: "lightCoral" };
    } else {
      return { backgroundColor: "deepSkyBlue" };
    }
  }
}
  

Настройка context проста

 <AgGridReact
  columnDefs={columnDefs}
  rowData={rowData}
  context={{
    threshold
  }}
  ...
/>
  

Где threshold это динамическое значение, которое вы можете получить, например, из хранилища redux или ответа API. В приведенном ниже демонстрационном коде вы можете обновлять threshold локально, используя значение из input .

 const [threshold, setThreshold] = React.useState(20);
const updateThreshold = () => {
  const inputEl = document.getElementById("thresholdInput");
  const newValue = parseFloat((inputEl as HTMLInputElement).value);
  setThreshold(newValue);
};

return (
  <>
    <input id="thresholdInput" defaultValue={threshold} />
    <button onClick={updateThreshold}>Update threshold</button>
    ...
  </>
);
  

Живая демонстрация

Редактировать 63975972/ag-grid-cell-style-based-on-dynamic-condition