created: 2021-11-12T08:22:03.000Z

react-admin で、react-admin の機能を使わないページを作りたいときの方法

react-admin で、完全にカスタマイズされたページを作りたいときの方法。

けっこういろいろ実装が必要になる方法しかなくて、マジかよとなるが、これは公式のドキュメントに書いてある方式で、GitHubのissueなどもこのやり方に沿ってやりとりされている。

ルーティング

まず、ルーティングを定義する

  • customRoutes を定義して、Admin タグの引数に渡す
  • リクエストできるパスと、そのパスで表示されるコンポーネントを追加
import * as React from "react";
import { Route } from 'react-router-dom';
import {SampleQueryInput} from './Sample'

export default [
  <Route exact path="/sample" component={SampleQueryInput} />,
];
const App = () => (
-   <Admin dataProvider={dataProvider}>
+   <Admin customRoutes={customRoutes} dataProvider={dataProvider}>

つくったルーティングへのリンク(Menu)

これだけだと、できたページへのリンクがないので、つぎに、そのルーティングへのリンクを、サイドバー( Menu と呼ばれる)に追加する。

import * as React from 'react';
import { useSelector } from 'react-redux';
import { Menu, MenuItemLink, getResources } from 'react-admin';
import DefaultIcon from '@material-ui/icons/ViewList';

export const CustomMenu = (props: any) => {
    const resources = useSelector(getResources);
    return (
        <Menu {...props}>
            {resources.map(resource => (
                <ItemLinkFromResource key={resource.name} resource={resource} />
            ))}
            <MenuItemLink
                key='sample'
                to="/sample"
                primaryText="sample"
                leftIcon={<DefaultIcon />}
            />
        </Menu>
    );
};

const ItemLinkFromResource = ({ resource }: any) => (
    <MenuItemLink
        to={`/${resource.name}`}
        primaryText={
            (resource.options && resource.options.label) ||
            resource.name
        }
        leftIcon={
            resource.icon ? <resource.icon /> : <DefaultIcon />
        }
    />
);

つくった Menu を Admin コンポーネントに渡す

  • できた CustomMenu コンポーネントを、
  • CustomLayout コンポーネントに渡し、
  • Layout コンポーネントを Admin に渡す。
import { Layout } from 'react-admin';
import { CustomMenu } from './Menu';

const CustomLayout = (props: any) => <Layout {...props} menu={CustomMenu} />;
export default CustomLayout;

- <Admin customRoutes={customRoutes} dataProvider={dataProvider}>
+ <Admin customRoutes={customRoutes} layout={layout} dataProvider={dataProvider}>

参考

エッセンシャル思考 最少の時間で成果を最大にする
[ad] エッセンシャル思考 最少の時間で成果を最大にする
グレッグ・マキューン, 高橋璃子 (Kindle版)