Front-end/React.js

react-admin : <Show> View

byolee 2020. 3. 4. 16:32

The Show View

read-only 상태로 API에서 fetch한 레코드를 나타내는 데 사용하는 뷰

 

 

<Show> component

페이지 타이틀과 액션을 렌더링하고 REST API로부터 레코드를 fetch함

실제 레코드를 렌더링하는 것은 자식 컴포넌트의 역할 -> prop으로 record를 전달

 

컴포넌트의 props

  • title 
  • actions
  • aside : additional information
  • component 

 

// in src/App.js
import React from 'react';
import { Admin, Resource } from 'react-admin';
import jsonServerProvider from 'ra-data-json-server';

import { PostCreate, PostEdit, PostShow } from './posts';

const App = () => (
    <Admin dataProvider={jsonServerProvider('http://jsonplaceholder.typicode.com')}>
        <Resource name="posts" show={PostShow} create={PostCreate} edit={PostEdit} />
    </Admin>
);

export default App;

// in src/posts.js
import React from 'react';
import { Show, SimpleShowLayout, TextField, DateField, EditButton, RichTextField } from 'react-admin';

export const PostShow = (props) => (
    <Show {...props}>
        <SimpleShowLayout>
            <TextField source="title" />
            <TextField source="teaser" />
            <RichTextField source="body" />
            <DateField label="Publication date" source="created_at" />
        </SimpleShowLayout>
    </Show>
);

 

 

 

 

<ShowGuesser> component

 

커스텀한 Show 대신에 사용할 수 있는 컴포넌트

데이터를 fetch하고 response를 분석함

 

 

 

<SimpleShowLayout> component

부모 컴포넌트로부터 prop으로 레코드를 받아 실제 뷰를 렌더링하는 역할

<CardContent /> 내부에 자식 컴포넌트를 한 줄씩 렌더링함

 

<TabbedShowLayout> component

위의 컴포넌트와 마찬가지로 부모 컴포넌트로부터 prop으로 레코드를 받고 실제 뷰를 렌더링 함

차이점은 탭으로 그루핑하여 렌더링하는 것임. -> <Tab> 컴포넌트에 의해 셋팅, label이 필요하고 icon은 옵셔널

 

 

import { TabbedShowLayout, Tab } from 'react-admin'

export const PostShow = (props) => (
    <Show {...props}>
        <TabbedShowLayout>
            <Tab label="summary">
                <TextField label="Id" source="id" />
                <TextField source="title" />
                <TextField source="teaser" />
            </Tab>
            <Tab label="body" path="body">
                <RichTextField source="body" addLabel={false} />
            </Tab>
            <Tab label="Miscellaneous" path="miscellaneous">
                <TextField label="Password (if protected post)" source="password" type="password" />
                <DateField label="Publication date" source="published_at" />
                <NumberField source="average_note" />
                <BooleanField label="Allow comments?" source="commentable" defaultValue />
                <TextField label="Nb views" source="views" />
            </Tab>
            <Tab label="comments" path="comments">
                <ReferenceManyField reference="comments" target="post_id" addLabel={false}>
                    <Datagrid>
                        <TextField source="body" />
                        <DateField source="created_at" />
                        <EditButton />
                    </Datagrid>
                </ReferenceManyField>
            </Tab>
        </TabbedShowLayout>
    </Show>
);

 

탭 컴포넌트를 스타일링하기 위해 2가지 prop을 사용할 수 있음 : className (탭 헤더), contentClassName (탭 콘텐트)