カスタムクエリでDatagridコンポーネントを使用する-react-admin
Aug 24 2020
カスタムクエリでDatagridコンポーネントを使用すると、以下のエラーが発生します。以下のコードはreact- adminver 3.3.1で機能しますが、ver3.8.1では機能しません
TypeError:未定義のプロパティ 'includes'を読み取ることができません
ブラウザのコンソール情報:リストコンポーネントは、<ListContext.Provider>内で使用する必要があります。リストデータとコールバックを取得するためにコンテキストではなく小道具に依存することは非推奨であり、react-adminの次のメジャーバージョンではサポートされません。
参照: https://marmelab.com/react-admin/List.html #Tip:カスタムクエリでDatagridコンポーネントを使用できます。
import keyBy from 'lodash/keyBy'
import { useQuery, Datagrid, TextField, Pagination, Loading } from 'react-admin'
const CustomList = () => {
const [page, setPage] = useState(1);
const perPage = 50;
const { data, total, loading, error } = useQuery({
type: 'GET_LIST',
resource: 'posts',
payload: {
pagination: { page, perPage },
sort: { field: 'id', order: 'ASC' },
filter: {},
}
});
if (loading) {
return <Loading />
}
if (error) {
return <p>ERROR: {error}</p>
}
return (
<>
<Datagrid
data={keyBy(data, 'id')}
ids={data.map(({ id }) => id)}
currentSort={{ field: 'id', order: 'ASC' }}
basePath="/posts" // required only if you set use "rowClick"
rowClick="edit"
>
<TextField source="id" />
<TextField source="name" />
</Datagrid>
<Pagination
page={page}
perPage={perPage}
setPage={setPage}
total={total}
/>
</>
)
} ```
Please help!
回答
4 FrançoisZaninotto Sep 08 2020 at 00:43
react-admin 3.7以降、データが小道具によって注入されることを期待する代わりに、からデータ<Datagrid>
を<Pagination>
読み取りますListContext
。たとえば、次の更新された<Datagrid>
ドキュメントを参照してください。https://marmelab.com/react-admin/List.html#the-datagrid-component。
コードを<ListContextProvider>
:でラップすると、コードは機能します。
import React, { useState } from 'react';
import keyBy from 'lodash/keyBy'
import { useQuery, Datagrid, TextField, Pagination, Loading, ListContextProvider } from 'react-admin'
export const CustomList = () => {
const [page, setPage] = useState(1);
const perPage = 50;
const { data, total, loading, error } = useQuery({
type: 'GET_LIST',
resource: 'posts',
payload: {
pagination: { page, perPage },
sort: { field: 'id', order: 'ASC' },
filter: {},
}
});
if (loading) {
return <Loading />
}
if (error) {
return <p>ERROR: {error}</p>
}
return (
<ListContextProvider value={{
data: keyBy(data, 'id'),
ids: data.map(({ id }) => id),
total,
page,
perPage,
setPage,
currentSort: { field: 'id', order: 'ASC' },
basePath: "/posts",
resource: 'posts',
selectedIds: []
}}>
<Datagrid rowClick="edit">
<TextField source="id" />
<TextField source="name" />
</Datagrid>
<Pagination />
</ListContextProvider >
)
}