作成するアプリについて
railsとreactを用いたtodoアプリになります。
https://todo-app-rails-react.herokuapp.com/todoes
(part1)
(part3)
(part4)
(part5)
開発環境
- ruby3.0
- rails6.1(rails6以上必須)
- react17.0.2
- vscode
アプリの作成手順
- サーバーサイドの実装
- アプリの作成
- turbolinksの無効化
- モデル&テーブルの作成
- 初期データの作成
- top#indexの作成
- todoes_controllerの作成
- ルーティングの設定
- application_controllerの設定
- application.html.erbに追記(part1でここまで完了済み)
- フロントサイドの実装
- componentsフォルダの作成
- リセットcssと共通cssの設定
- index.jsxの記述
- フロントの実装準備
- App.jsの記述
- TodoList.jsの記述
- NewTodo.jsの記述
- EditTodo.jsの記述
早速ですが進めていきましょう!
アプリ作成
2. フロントサイドの実装
2.1 componentsフォルダの作成
この章では必要なcomponentsフォルダを作成していきます。
componentsフォルダの作成場所はapp/javascript
内で作成するcomponentsフォルダは以下の通りです。
2.2 リセットcssと共通cssの設定
リセットcssに関しては超簡易版です。必要に応じて変更してください。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
min-height: 100vh;
color: rgb(1, 1, 1);
}
h1 {
text-align: center;
margin-top: 30px;
margin-bottom: 15px;
}
h2 {
text-align: center;
margin-top: 30px;
margin-bottom: 15px;
}
a {
text-decoration: none;
color: rgb(1, 1, 1);
}
input:focus {
outline: 0;
}
2.3 index.jsxの記述
以下のように記述していきます。
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom';
import { App } from '../components/App'
document.addEventListener('DOMContentLoaded', () => {
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>, // <App />を<BrowserRouter>で囲むことで、<App />とその子要素でBrowserRouterを使えるようにしている
document.querySelector('#root'),
// app/views/top/index.html.erbからid="root"を選択肢そこに<App />を描画している。
);
});
2.4 フロントの実装準備
まずですが、以下の準備作業をしていきます。
import React from 'react'
export const App = () => {
return (
<div>
App
</div>
)
}
import React from 'react'
export const EditTodo = () => {
return (
<div>
EditTodo
</div>
)
}
import React from 'react'
export const NewTodo = () => {
return (
<div>
NewTodo
</div>
)
}
import React from 'react'
export const TodoList = () => {
return (
<div>
TodoList
</div>
)
}
http://localhost:3000/todoes
を確認してみましょう。
これまた隠れてますけどApp
と出力されてますね!
App
と出力される流れを確認します。
<%= javascript_pack_tag 'index' %>
ここで以下が呼び出され
document.addEventListener('DOMContentLoaded', () => {
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.querySelector('#root'),
);
});,
この記述で、<App />
をdocument.querySelector('#root')
で取得した以下のファイルに描画し
<div id="root"></div>
出力されます。
2.5 App.jsの記述
App.jsxでは全てのページに共通するヘッダー部分とルーティングの記述をしていきます。完成形は以下の通りです。
では実装していきましょう!
import React from 'react'
import { Link } from 'react-router-dom'
import styled from 'styled-components'
import './App.css'
export const App = () => {
return (
<div>
<div>
TODO
</div>
<ul>
<li>
<Link to="/todoes">
Todoes
</Link>
</li>
<li>
<Link to="/todoes/new">
NewTodo
</Link>
</li>
</ul>
</div>
)
}
以下のインポートを忘れずに...
・ import { Link } from 'react-router-dom'
・ import styled from 'styled-components'
・ import './App.css'
ここにstyleをあてていきます。
import React from 'react'
import { Link } from 'react-router-dom'
import styled from 'styled-components'
import './App.css'
export const App = () => {
return (
<Header>
<Title>
TODO
</Title>
<Actions>
<Action>
<Link to="/todoes">
Todoes
</Link>
</Action>
<Action>
<Link to="/todoes/new">
NewTodo
</Link>
</Action>
</Actions>
</Header>
)
}
const Header = styled.div`
background: #ccffcc;
min-height: 8vh;
display: flex;
justify-content: space-around;
align-items: center;
`
const Title = styled.div`
font-weight: bold;
font-size: 24px;
letter-spacing: 4px;
`
const Actions = styled.ul`
display: flex;
width: 400px;
max-width: 40%;
justify-content: space-around;
list-style: none;
`
const Action = styled.li`
font-size: 20px;
font-weight: bold;
opacity: 0.7;
&:hover {
opacity: 1;
}
`
デザインはお好みでどうぞ!この通りならば以下のようになっていると思います!
続いてルーティングの実装です。
import React from 'react'
import { Link, Route, Switch } from 'react-router-dom'
import styled from 'styled-components'
import './App.css'
import { EditTodo } from './EditTodo'
import { NewTodo } from './NewTodo'
import { TodoList } from './TodoList'
export const App = () => {
return (
<>
<Header>
<Title>
TODO
</Title>
<Actions>
<Action>
<Link to="/todoes">
Todoes
</Link>
</Action>
<Action>
<Link to="/todoes/new">
NewTodo
</Link>
</Action>
</Actions>
</Header>
<Body>
<Switch>
<Route exact path="/todoes" component={TodoList} />
<Route exact path="/todoes/new" component={NewTodo} />
<Route path="/todoes/:id/edit" component={EditTodo} />
</Switch>
</Body>
</>
)
}
const Header = styled.div`
background: #ccffcc;
min-height: 8vh;
display: flex;
justify-content: space-around;
align-items: center;
`
const Title = styled.div`
font-weight: bold;
font-size: 24px;
letter-spacing: 4px;
`
const Actions = styled.ul`
display: flex;
width: 400px;
max-width: 40%;
justify-content: space-around;
list-style: none;
`
const Action = styled.li`
font-size: 20px;
font-weight: bold;
opacity: 0.7;
&:hover {
opacity: 1;
}
`
const Body = styled.div`
width: 700px;
max-width: 85%;
margin: 20px auto;
`
import { Link } from 'react-router-dom'が以下のように編集されてます。
import { Link, Route, Switch } from 'react-router-dom'
・ import { EditTodo } from './EditTodo'
・ import { NewTodo } from './NewTodo'
・ import { TodoList } from './TodoList'
の追記を忘れないようにしてください。
<>
< />
でHeaderタグとBodyタグがかこまれています。
以上でルーティング処理ができているのでTodoes、NewTodoをクリックすると表示が変わるはずです。
このパートはここまでとしましょう!