Как мне сопоставить массив key.value.значение для чипа? У меня есть список карты {k, v}

#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. Откуда вы получаете ошибку — из компонента пользовательского поля выше или где-то еще? Возможно, вам следует опубликовать новый вопрос с примером кода, если он отличается от приведенного выше