【React-Rails】React-RailsでMaterial-UIの部品を実装する手順

React-RailsでMaterial-UIの部品を実装する手順について紹介します。

<h2>1.Material-UIのページで実装したい部品を選択する</h2>
https://material-ui.com/ja/getting-start

今回は、SimpleTabを実装することにします。
ちなみに、codeの上にある「Edit in CodeSandbox」でいろいろいじることができます。
https://material-ui.com/components/tabs/#simple-tabs
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/5b8d1ef4-3bc0-cec8-7cfa-de120a477cea.png)

<h2>2.実装したい部品のコードを表示し、コピーする</h2>
コードの上の「show the full source」を押下して、ソースコードを表示して、コピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/9819abb8-0bf3-cf7b-5376-cc01f8b93976.png)

なお、JSとTSの2種類があるので、使用しているほうを選んでください。
筆者はJSを今回は選択しました。

<h2>3.Railsに新規ファイルを作成し、コードを張り付ける</h2>
javascript>components直下にファイルを作り、ソースコードをそのまま貼り付けます。
ファイル名はわかりやすく「SimpleTab.js」という名前にしました。

ファイルの置き場所ですが恐らく、packsに張り付けるのが正解な気がしていますが、今回はcomponents直下に置いておきます。(部品なので。。。。。)

```react:SimpleTab.js
import React from 'react';
import PropTypes from 'prop-types';
import { makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Tabs from '@material-ui/core/Tabs';
import Tab from '@material-ui/core/Tab';
import Typography from '@material-ui/core/Typography';
import Box from '@material-ui/core/Box';

function TabPanel(props) {
  const { children, value, index, ...other } = props;

  return (
    <div
      role="tabpanel"
      hidden={value !== index}
      id={`simple-tabpanel-${index}`}
      aria-labelledby={`simple-tab-${index}`}
      {...other}
    >
      {value === index && (
        <Box p={3}>
          <Typography>{children}</Typography>
        </Box>
      )}
    </div>
  );
}

TabPanel.propTypes = {
  children: PropTypes.node,
  index: PropTypes.any.isRequired,
  value: PropTypes.any.isRequired,
};

function a11yProps(index) {
  return {
    id: `simple-tab-${index}`,
    'aria-controls': `simple-tabpanel-${index}`,
  };
}

const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
    backgroundColor: theme.palette.background.paper,
  },
}));

export default function SimpleTabs() {
  const classes = useStyles();
  const [value, setValue] = React.useState(0);

  const handleChange = (event, newValue) => {
    setValue(newValue);
  };

  return (
    <div className={classes.root}>
      <AppBar position="static">
        <Tabs value={value} onChange={handleChange} aria-label="simple tabs example">
          <Tab label="Item One" {...a11yProps(0)} />
          <Tab label="Item Two" {...a11yProps(1)} />
          <Tab label="Item Three" {...a11yProps(2)} />
        </Tabs>
      </AppBar>
      <TabPanel value={value} index={0}>
        Item One
      </TabPanel>
      <TabPanel value={value} index={1}>
        Item Two
      </TabPanel>
      <TabPanel value={value} index={2}>
        Item Three
      </TabPanel>
    </div>
  );
}

```

<h2>4.表示したいファイルにimportして、タグを書き込む</h2>
表示したい対象のファイルにimport文を書きます。
importで指定した文字がタグの名前として使えるようになるので、それを書きこみます。

筆者はjsファイルから表示させたかったので、index.jsに書き込みました。(index.jsもcomponents直下に配置しております)

```react:index.js
import React from "react"
import PropTypes from "prop-types"
import SimpleTabs from "./SimpleTabs"

class Index extends React.Component {
  render () {
    return (
      <React.Fragment>
        <SimpleTabs />
      </React.Fragment>
    );
  }
}
Index.propTypes = {
  greeting: PropTypes.string
};
export default Index
```

書いたら保存して、Railsサーバーを起動しブラウザに表示させてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/3cd3153a-8e3f-a16f-3344-f534f932bfd0.png)


実装方法等で、意見等あればコメントいただけると幸いです！

<h2>参考</h2>
Material-UI
https://material-ui.com/ja/