#react-admin
#react-admin
Вопрос:
Введите json для Person — имеет внешнюю карту {key,value}
В столбце «SubSys» я хочу отобразить «БИБЛИОТЕКА» и «СПОРТ» в качестве тегов.
Объект Person json имеет все требуемые значения, но я не могу понять, как сопоставить его в компоненте DataGrid.
Я использую react-admin 3.10
[{
...
"xrefAccounts": {
"LIBRARY": {
"id": "1",
"xrefSystemId": "LIBRARY"
},
"SPORTS": {
"id": "1",
"xrefSystemId": "SPORTS"
}
}
},
export const PersonList = props => (
<List filters={<PersonFilter />} {...props} >
<Datagrid rowClick="edit">
...
<ReferenceArrayField label="SubSys" reference="id" source="xrefAccounts.value">
{/* Find how to put multiple xref in one column SubSys */}
<SingleFieldList>
<ChipField source="value.xrefSystemId" />
</SingleFieldList>
</ReferenceArrayField>
<EditButton />
</Datagrid>
</List>
);
Я хочу отобразить подраздел [«Библиотека» «Спорт»], аналогичный тегам [«Спорт» «Код»] на этом изображении
Комментарии:
1. Вы пробовали использовать: <arrayField source=»xrefAccounts»><Datagrid> … </Datagrid></arrayField> ?
2. …Неперехваченная ошибка типа: list.reduce не является функцией
Ответ №1:
Это не работает, потому что вы используете ArrayField
данные, которые не являются массивом — это объект!
Поэтому лучше всего было бы на самом деле исправить структуру ответов вашего API.
Но … если вы не можете этого сделать — когда я смотрю на вашу попытку, возможно, я могу предложить следующий обходной путь с помощью компонента пользовательского поля:
<XrefAccountsField source="xrefAccounts" />
внутри
const XrefAccountsField = ({source, record = {}}) => {
const accountsObject = record[source];
// Convert the record to an array
const accounts = {
accountsArr: accountsObject ? Object.keys(accountsObject).map((key) => accountsObject[key]) : []
};
return (
<ArrayField source="accountsArr" record={accounts}>
<SingleFieldList>
<ChipField source="xrefSystemId" />
</SingleFieldList>
</ArrayField>
)
}
Комментарии:
1. Большое спасибо. Этот пользовательский компонент работал
2. Вопрос новичка, существует ли «потоковый / функциональный стиль» возврата пустых учетных записей, если входные данные равны нулю? accountsArr: Object.keys(accountsObject ).map((ключ) => accountsObject[ключ])
3. Конечно: извлеките его перед
const accounts
частью, а затем назначьте его, например:accountsArr: resultArr ? resultArr : []
4. Дополнительный вопрос: как избавиться от этого предупреждения? «Компоненты списка должны использоваться внутри <ListContext . Поставщик>. Полагаясь на реквизит »
5. Откуда вы получаете ошибку — из компонента пользовательского поля выше или где-то еще? Возможно, вам следует опубликовать новый вопрос с примером кода, если он отличается от приведенного выше