Пользовательский интерфейс материала: Могу ли я использовать компонент React в ячейке DataGrid вместо предопределенных типов ячеек (‘string’, ‘number’, ‘date’, ‘DateTime’)?

#javascript #reactjs #typescript #material-ui

#javascript #reactjs #машинопись #материал-пользовательский интерфейс

Вопрос:

React, Material UI, TypeScript
Я хочу поместить компонент React в ячейку DataGrid. Я читал здесь о пользовательских типах ячеек, но это мне не помогло: это позволяет управлять только строковым форматом, но мне нужно использовать component вместо string . Например, я хочу использовать компонент Link в ячейке. Мой код:

 { field: 'name', headerName: 'Name', width: 200,
    valueGetter: (params: ValueGetterParams): JSX.Element =>
        (<Link href={this.props.createRecordUrl(params.row.logicalName as EntityNames,
            params.row.id as ID)} target="_blank">{params.row.name}</Link>)
},
 

Но я получаю [object Object] строку вместо Link компонента в ячейке. Как я могу решить проблему?

Ответ №1:

Вы можете вставлять пользовательские компоненты, используя renderCell свойство, которое вы определяете в столбцах. Посмотрите на эту ссылку для получения дополнительной информации: https://material-ui.com/components/data-grid/columns /

Пример взят из документов Material UI:

 const columns: GridColDef[] = [
  {
    field: 'date',
    headerName: 'Year',
    renderCell: (params: GridCellParams) => (
      <strong>
        {(params.value as Date).getFullYear()}
        <Button
          variant="contained"
          color="primary"
          size="small"
          style={{ marginLeft: 16 }}
        >
          Open
        </Button>
      </strong>
    ),
  },
];
 

Комментарии:

1. Вау, это сработало отлично! Парень выше, который сказал, что это платная функция XGrid, неверен (по крайней мере, на данный момент). Это должно быть общепринятым ответом.

2. Какая жалость GridCellParams , что это не универсально.

Ответ №2:

Похоже, что использование компонентов в столбцах является лишь частью платной функции XGrid? В прошлом я использовал material-table, который позволяет использовать пользовательские компоненты для столбцов.

Комментарии:

1. Спасибо! Я постараюсь использовать material-table вместо DataGrid.

2. Документы в порядке, но в последний раз я проверял, что они немного устарели или неполны. Мне очень повезло с поиском проблем github (открытых и закрытых), чтобы увидеть разные подходы к использованию material-table.