SlideShare a Scribd company logo
1 of 112
1
・今日やることの説明(15分)
・ハンズオンを始める前の準備(20分)
・アプリケーション作成(100分)
・アプリケーションのデプロイ(15分)
・クロージング(15分)
2
3
ReactとFirebaseとGitLabを使って
調整さんのコピーアプリケーションを作る
(ハンズオン形式で)
4
イベントの出欠表を
簡単に作成できるWebサービス
https://chouseisan.com/
5
Facebookによって生み出されたUI用のJavaScriptライブラリ
アプリケーション内のデータの変更を検知し
関連する部分のみ効率的に更新、描画できる。
6
Googleが管理するウェブアプリやモバイルアプリの
開発プラットフォーム。
世界中で150万ものアプリから利用されている。
アプリケーション作成に必要な機能を提供するサービス。
開発者自身が0から構築・管理する手間を省き
素早くアイデアを形にすることができる。
7
8
9
RealtimeDatabase
クラウドホスト型データベースです。
データは JSON として保存され、接続されているすべてのクライアントと
リアルタイムで同期される。
Hosting
本番環境レベルのウェブ コンテンツ ホスティングです。
1 つのコマンドですばやくウェブアプリをデプロイすることができ
静的コンテンツを配信できる。
10
GitLab 社が開発したウェブ型のGitリポジトリ
Gitリポジトリの機能に加えて、CI/CD機能も備えている
11
Firebase Hosting
Firebase Realtime Database
12
開発PC
デプロイ push
Reactアプリ配信
DBへ値格納・取得
ハンズオン手順書に沿って進めます
作る前に簡単に解説
↓
手順書を見て実際に手を動かす
★手順書内にコード例として
完成済のコードを記載しています
13
14
15
・GitLabで自分用のプロジェクト作成
・ハンズオンで使う用のソースコード入手
・アプリ内で利用するFirebaseへの接続設定を書く
・デプロイ先を設定する
・プロジェクトとアプリを紐付ける
・Realtime Databaseの読み書き制限を設定する
・Reactアプリの起動
ハンズオン用のアプリが
Firebaseのプロジェクトへ接続済の状態で
起動するまで。
16
GitLabで自分用のプロジェクトを作成します
手順書に書かれているリンクを押してください
17
$git clone でForkしたプロジェクトから
ソースコードを入手します
18
FirebaseのSDKで利用する
プロジェクトへ接続設定をfirebase.jsに追記する
👀『Firebaseのコンソール画面』
19
デプロイ先を指定するため
プロジェクトIDを.firebasercに記載する
$firebase use --add
20
FirebaseのプロジェクトとReactのアプリを紐付ける
What alias do you want to use for this project?
エイリアスを聞かれた場合は以下の通り入力
handson
$firebase deploy --only database
21
Realtime Databaseのデータ構造やデータへのアクセス制限を
設定する。今回は読み書きすべて許可する設定のみ
$npm install
$npm start
👀http://localhost:3000/
22
Reactのアプリケーションを起動して、動作を確認する
23
主催者が開催するイベントを「イベント登録画面」で作成
参加者は「イベント詳細画面」で出欠を入力する
参加者の出欠状況は「イベント詳細画面」で確認できる
24
・イベント登録画面
◦イベント名や開催予定日等を登録する画面を作成します。
・イベント詳細画面
◦ イベント参加者の出欠予定一覧や出欠入力画面を作成します。
25
26
27
開催するイベントについての情報を
登録する画面。
・画面作成
・ DBへ値を書き込む処理作成
・画面遷移処理作成
★・画面作成は既に作成済です
28
フォームやボタンなど
画面の要素を組み立てていく
フォームに入力された値を
React内の処理で扱えるようにする
29
「出欠表を作る」ボタンを押すと
フォームに入力された値がDBへ
登録される処理を作る
Firebase Realtime Database
入力値を
DBへ書き込む
30
DBへ値を書き込む処理の後
次画面へ遷移する処理を作る
https://〇〇〇.web.app/event/- Lxxxxxxxxxxxxxxx
https://〇〇〇.web.app/event
31
32
・『1-1.入力フォームを作ろう』←まずココ
・『1-2.入力フォームの内容をstateに反映しよう』
・『1-3.入力フォームの内容をstateから取得して表示しよう』
33
👀手順書『1-1入力フォームを作ろう』
画面で見たいものをReactに伝えて画面を描画する
render()関数
34
render() {
return (JSXの記法で書く);
}
【手順書『 1-1.入力フォームを作ろう』】
React用のUIライブラリ
入力フォームやボタンなど
Reactで作成済の
画面構成部品(コンポーネント)が提供され
ている
Ant Designのコンポーネントを組み合わ
せて画面を作成する
35
入力フォームのコンポーネント
ボタンのコンポーネント
【手順書『入力フォームを作ろう』】
36
・『1-1.入力フォームを作ろう』
・『1-2.入力フォームの内容をstateに反映しよう』 ←次ココと
・『1-3.入力フォームの内容をstateから取得して表示しよう』 ←ココ
37
【手順書『1-2入力フォームの内容をstateに反映しよう』】
フォームの入力値を
Reactコンポーネント内で利用できるようにする
👀手順書『1-2入力フォームの内容をstateに反映しよう』
38
Reactのコンポーネントはstateという状態管理用のプロパティを持っている
stateに値を保持させたり、stateを参照することで
フォームの入力値をReactコンポーネント内で利用できるようになる
React コンポーネント
state
入力値
【手順書『1-2入力フォームの内容をstateに反映しよう』】
39
stateに保持された値を参照して
DBに登録するための値や画面に表示するために利用する
React コンポーネント
state
保持している値
【手順書『1-2入力フォームの内容をstateに反映しよう』】
setState()によってstateの値が更新されたら
render()関数が呼ばれるため
最新のstateの値を画面に出すことができる
40
【手順書『1-3入力フォームの内容をstateから取得して表示しよう』】
41
ここでstateから表示したい値は3種
・eventName:イベント名フォームの値
・description:説明フォームの値
・candidateText:候補日程フォームの値
【手順書『1-3.入力フォームの内容をstateから取得して表示しよう』】
42
43
・『 1-4.入力した値をRealtime Databaseに書き込もう』
-『1-4-1.入力した値を整形しよう』
-『1-4-2.Realtime Databaseに整形した値を書き込もう』
ボタンを押すと
フォームに入力した値が
Realtime Databaseに書き込む処理
44
Firebase Realtime Database
入力値を
DBへ書き込む
45
・stateの値を整形する
(ハンズオン『1-4-1.JSONを整形しよう』)
・DBに値を追加する
(ハンズオン『1-4-2.Realtime Databaseにデータを書き込もう』)
46
stateのcandidateText(候補日程)の値は
一続きの文字列になっている
文字列を日付ごとに分解して配列に格納する
candidateDates: [ "12/29", "12/30" ]
candidateText: "12/29n12/30"
47
【手順書『 1-4-1.JSONを整形しよう』】
👀手順書『1-4.入力した値をRealtime Databaseに書き込もう』
firebase.database.Referenceのインスタンスを作成
48
【手順書『 1-4-2.Realtime Databaseに整形した値を書き込もう』】
👀『 EventEntry.jsの6行目』
firebase.database.Referenceのインスタンスを作成
作成したインスタンス.ref(‘パス’).push(書き込み対象のオブジェクト)
パス(書き込み先)はeventsの中
49
firebaseDb.ref(‘パス’).push(書き込み対象のオブジェクト)
【手順書『 1-4-2.Realtime Databaseに整形した値を書き込もう』】
firebase.database.Referenceのインスタンスを作成
書き込み対象のオブジェクトに
整形したstateの値を指定する
DBに値が登録されると
キーの値は自動生成される
{
candidateDates:
[ “8/7(月)20:00-“, “8/8(火)20:00-“ ],
description: “送別会やります!”,
eventName: “送別会"
}
50
firebaseDb.ref(‘パス’).push(書き込み対象のオブジェクト)
【手順書『 1-4-2.Realtime Databaseに整形した値を書き込もう』】
51
【手順書『 1-4.入力した値をRealtime Databaseに書き込もう』】
👀Firebaseの管理コンソールでDBに値が書き込まれていることを確認する
👀『Firebaseのコンソール画面』
52
53
・『1-5.イベントIDを取得して画面遷移しよう』
ボタンを押すと
DBへの登録結果をもとに次画面へ遷移する処理
54
https://〇〇〇.web.app/event/- Lxxxxxxhttps://〇〇〇.web.app/event
55
・URLを一意にする
・DB登録時のIDを取得する方法
・React Routerとは?
(ハンズオン『1-5.イベントIDを取得して画面遷移しよう』)
イベント詳細画面へ遷移する際のURLはイベント毎に一意な値にしたい。
イベント毎に一意な値として
DBへ登録した際に自動で採番されたキー値を利用する
56
【手順書『1-5.イベントIDを取得して画面遷移しよう』】
DBに値を登録する際に利用したpush()関数の戻り値に
自動生成されたIDが含まれる
自動生成されたIDのプロパティ名称はkey
57
firebaseDb.ref(‘パス’).push(オブジェクト).key
【手順書『1-5.イベントIDを取得して画面遷移しよう』】
React用ルーティングライブラリ
URLをアプリの画面状態と紐付けるために使う
ブラウザの戻るボタンが使えるようになったり
特定のURLを打ち込むことで特定のページに直接アクセスできるようになる
★ React Routerの設定(どのURLでどの画面を表示するか)は用意しています。
58
【手順書『1-5.イベントIDを取得して画面遷移しよう』】
App.js
this.props.history.push(`/event/イベントID`);
<BrowserRouter>
(略)
<Route exact path='/' component={Home} />
<Route exact path='/event/'
component={EventEntry} />
<Route exact path='/event/:id'
component={Event} />
(略)
</BrowserRouter>
59
【手順書『1-5.イベントIDを取得して画面遷移しよう』】
60
【手順書『1-5.イベントIDを取得して画面遷移しよう』】
👀画面遷移して、URL欄のID部分が
自動で採番されたIDと一致していることを管理コンソール画面で確認
👀『Firebaseのコンソール画面』
61
62
・参加者がイベントの出欠を登録できる
・参加者の出欠情報を一覧で見られる
★作るのはDBの値を取得し
画面に表示するまで
登録ボタンを押すとDBに値を書き込む
処理は前画面と同様の作業になるので
作成済です
【表示項目】
イベントタイトル
イベント説明
出欠情報一覧
イベント開催候補日程(初期選択値は△)
63
・DBから値を取得する処理作成
・データ表示する処理作成
64
65
・『2-1.ダミーデータを確認しよう』
・『2-2.Realtime Databaseからイベント情報を取得しよう』
イベント登録画面で登録されたイベントを
イベント詳細画面で表示する
66
登録したイベン
トの情報を表示
イベント登録画面で
DBに書き込まれたデータを
イベント詳細画面で表示する
67
Realtime Database
DBの値を表示書き込み
68
・ダミーデータについて
(手順書『2-1.ダミーデータを確認しよう』)
・DBの値を取得する
(手順書『2-2.Realtime Databaseからイベント情報を取得しよう』)
- DBの参照先を決める
- URLからイベントIDを取得する
-コールバック関数を追加する
-値の変更を検知する条件を指定する
69
手元のコードは初期表示時に
ダミーのデータを表示するようになっている
ダミーデータからDBの値を見るよう修正する
👀『ダミーデータ』
【手順書『2-1.ダミーデータを確認しよう』】
👀『ダミーデータ利用箇所』
ダミーデータ state
画面に表示
DBの状態をリアルタイムに
画面に反映するために
値の変更を監視する
70
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
DBの参照先を決める
↓
DBの値に変更があった際に呼ばれるコールバック関数を追加する
71
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
firebase.database.Referenceのインスタンスを作成
参照先のパスを指定する
72
firebaseDb.ref(‘パス’)
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
取り出したいのはイベントID(-Lxxxxxxxxxxxxxxx)以下のオブジェクト
パスは
‘events/-Lxxxxxxxxxxxxxxx’
{
candidateDates:
[ "12/29", "12/30" ],
description: “忘年会やります!”
eventName: "忘年会",
}
73
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
ReactRouterの機能によってURLの一部分を取得できる
74
this.props.match.params.id
firebaseDb.ref(`events/${this.props.match.params.id}’)
<BrowserRouter>
(略)
<Route exact path='/event/:id' component={Event} />
(略)
</BrowserRouter>
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
参照しているDBの値を検知するイベントを指定します
on()メソッド
ここで指定するのはvalue
参照先の値の変更をすべて検知して
コールバック関数が呼ばれます
75
firebaseDb.ref(`パス`).on(‘イベント’, コールバック関数)
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
DBの値に変化があると呼び出される
コールバック関数を登録します
登録するコールバック関数
76
firebaseDb.ref(`パス`).on(‘イベント名’, コールバック関数)
snapshot => { const json = snapshot.val(); }
【手順書『2-2.Realtime Databaseからイベント情報を取得しよう』】
77
【手順書『 2-2.Realtime Databaseからイベント情報を取得しよう』】
👀ブラウザの開発者ツールから、コンソールログを確認
DBの値がコンソールに出ていることを確認
78
79
・『2-3.取得したデータをstateに格納しよう』
・『2-4.イベント名と説明文を表示させよう』
・『2-5.候補日程を表示用に編集しよう』
・『2-6.出欠表を表示させよう』
ダミーデータ表示しているイベント詳細画面を
DBから取得したデータを表示するよう修正する
80
Realtime Database
DBの値を
取得
state
画面に表示
画面に合わせて
編集
81
・stateの構造を確認
(『2-3.取得したデータをstateに格納しよう』)
・DBから取得した値をstateに入れ、画面に表示する
(『2-4.イベント名と説明文を表示させよう』)
・entries関数とmap関数で候補日程を編集する
(『2-5.候補日程を表示用に編集しよう』)
82
・『2-3.取得したデータをstateに格納しよう(確認のみ)』 ←まずここ
・『2-4.イベント名と説明文を表示させよう』
・『2-5.候補日程を表示用に編集しよう』
・『2-6.出欠表を表示させよう』
・イベント名:eventDetail.eventName
・説明文:eventDetail.description
・出欠表(テーブルの列):eventDetail.columns
・出欠表(データ):eventDetail.dataSource
・候補日程:participant.candidates
this.state = {
participant: {
name: '',
candidates: []
},
eventDetail: {
eventId: this.props.match.params.id,
eventName: '',
description: '',
dataSource: [],
columns: []
}
}
83
【手順書『2-3.取得したデータをstateに格納しよう(確認のみ)』】
84
・『2-3.取得したデータをstateに格納しよう(確認のみ)』
・『2-4.イベント名と説明文を表示させよう』←次ここ
・『2-5.候補日程を表示用に編集しよう』
・『2-6.出欠表を表示させよう』
85
【手順書『2-4.イベント名と説明文を表示させよう』】
イベント名
説明文
・イベント名:eventDetail.eventName
・説明文:eventDetail.description
・出欠表(テーブルの列):eventDetail.columns
・出欠表(データ):eventDetail.dataSource
・候補日程:participant.candidates
this.state = {
participant: {
name: '',
candidates: []
},
eventDetail: {
eventId: this.props.match.params.id,
eventName: '',
description: '',
dataSource: [],
columns: []
}
}
86
【手順書『2-3.取得したデータをstateに格納しよう(確認のみ)』】
eventDetail.eventName
eventDetail.description
87
【手順書『2-4.イベント名と説明文を表示させよう』】
DBから取得した値を
setState()を利用してeventDetailに格納
stateの値を
TitleタグとParagraphタグ部分に表示させる
88
【手順書『2-4.イベント名と説明文を表示させよう』】
👀『イベント名と説明文stateに格納する』
89
【手順書『2-4.イベント名と説明文を表示させよう』】
👀DBに書き込まれている値と
画面に表示されている値が一致していることを確認
90
・『2-3.取得したデータをstateに格納しよう(確認のみ)』
・『2-4.イベント名と説明文を表示させよう』
・『2-5.候補日程を表示用に編集しよう』←次ここ
・『2-6.出欠表を表示させよう』
91
【手順書『2-5.候補日程を表示用に編集しよう』】
・イベント名:eventDetail.eventName
・説明文:eventDetail.description
・出欠表(テーブルの列):eventDetail.columns
・出欠表(データ):eventDetail.dataSource
・候補日程:participant.candidates
this.state = {
participant: {
name: '',
candidates: []
},
eventDetail: {
eventId: this.props.match.params.id,
eventName: '',
description: '',
dataSource: [],
columns: []
}
}
92
【手順書『2-5.候補日程を表示用に編集しよう』】
候補日程:participant.candidates
participant.candidates:[
{
id: 0,
dateTime: "8/7(月) 20:00~",
answer: '△'
},
{
id: 1,
dateTime: "8/8(火) 20:00~",
answer: '△'
}
]
candidateDates:[ "8/7(月) 20:00~", "8/8(火) 20:00~"]
93
【手順書『2-5.候補日程を表示用に編集しよう』】
Object.entries()
配列の添字と値のペアを作る
[ "8/7(月) 20:00~", "8/8(火) 20:00~”]
[
[ 0, " 8/7(月) 20:00~ " ],
[ 1, " 8/8(火) 20:00~ “ ]
]
94
【手順書『2-5.候補日程を表示用に編集しよう』】
Object.entries(candidateDates)
.map(candidateDate => ({
id:candidateDate[0],
dateTime:candidateDate[1],
answer:'△'
}))
[
[ 0," 8/7(月) 20:00~ " ],
[ 1, " 8/8(火) 20:00~ “]
]
95
【手順書『2-5.候補日程を表示用に編集しよう』】
候補日程:participant.candidates
participant.candidates:[
{
id: 0,
dateTime: "8/7(月) 20:00~",
answer: '△'
},
{
id: 1,
dateTime: "8/8(火) 20:00~",
answer: '△'
}
]
candidateDates:[ "8/7(月) 20:00~", "8/8(火) 20:00~"]
96
【手順書『2-5.候補日程を表示用に編集しよう』】
97
【手順書『 2-5.候補日程を表示用に編集しよう』】
👀登録画面で入力した日程が一覧に表示されていて
◯△✕が行ごとに表示されていることを確認
98
・『2-3.取得したデータをstateに格納しよう(確認のみ)』
・『2-4.イベント名と説明文を表示させよう』
・『2-5.候補日程を表示用に編集しよう』
・『2-6.出欠表を表示させよう』←次ここ
99
【手順書『2-6.出欠表を表示させよう』】
AntDesignのテーブルを使うた
めに値を編集する箇所です
本日のハンズオンの趣旨からは
それるので、ここはコピー&ペ
ーストで済ませてください。
👀『 2-6.出欠表を表示させよう』
100
【手順書『 2-6.出欠表を表示させよう』】
👀候補日程欄で名前と出欠予定(〇△✕)を入力
出欠表に入力した値が表示されることを確認
・イベント登録画面から改めてイベントを登録
・Firebaseの管理コンソールで
登録されたイベントのデータを確認
・画面遷移した際のURLに自動生成されたIDが
入っていることを確認
・イベント詳細画面で参加者を追加、〇×△の予定を入力
・Firebaseの管理コンソールで
登録されたイベントのデータを確認
101
102
Firebase CLIのコマンドを打って
アプリをデプロイする。
↓
GitLabにコードをgit pushすると
GitLabが自動的にデプロイするよう設定する
103
104
・Firebase Hostingを利用してデプロイする
(手順書『3-1.アプリケーションのビルドとデプロイ』)
・Firebase認証トークンの取得
(手順書『4-1.Firebaseトークンを取得する』)
(手順書『4-2.FirebaseトークンをGitLab CI/CDに登録する』)
・GitLab CI/CDの設定ファイル
(手順書『4-3. .gitlab-ci.ymlを作成する』)
Firebase Hosting
コマンド1つで静的コンテンツを配信できるようになる。
デフォルトで以下2つのドメインにデプロイされる。
<プロジェクトID>.firebaseapp.com
<プロジェクトID>.web.app
👀『3-1.アプリケーションのビルドとデプロイ』
105
【手順書『3-1.アプリケーションのビルドとデプロイ』】
106
【手順書『3-1.アプリケーションのビルドとデプロイ』】
Firebase CLIのコマンドを利用するには
firebase loginコマンドでブラウザからGoogleアカウント
へのログインを済ませないといけない。
GitLabでコマンド自動実行させるために
認証済であることを示すトークンを発行する。
107
$firebase login:ci
【手順書『 4-1.Firebaseトークンを取得する』】
👀『 4-2.FirebaseトークンをGitLab CI/CDに登録する』
GitLab CI/CDでは1つの作業(ジョブ)を定義する
deploy-prodジョブ
・masterブランチにpushされた場合に自動実行する
・ビルド後、Firebase CLIでFirebase Hostingへデプロイ
108
【手順書『 4-3. .gitlab-ci.ymlを作成する』】
👀『4-3. .gitlab-ci.ymlを作成する』
image
- CIのジョブを実行する環境の土台を指定している。
今回利用するのはFirebase CLIが使えるLinux環境。
only
- ジョブを実行するブランチ名を指定する
script
- 実行するコマンド
109
【手順書『 4-3. .gitlab-ci.ymlを作成する』】
110
firebase use <プロジェクトID> --token $FIREBASE_TOKEN
$FIREBASE_TOKEN
手順4-2にてGitLabのコンソール画面で設定した
環境変数(取得したトークン)を参照している
<プロジェクトID>の部分は
自分のFirebaseプロジェクトIDに置き換えて書く
管理コンソール→プロジェクトの設定で確認
【手順書『 4-3. .gitlab-ci.ymlを作成する』】
111
【手順書『4-3. .gitlab-ci.ymlを作成する』】
【手順書『4-4.pushする』】
Firebase Hosting
Firebase Realtime Database
112
開発PC
デプロイ push
Reactアプリ配信
DBへ値格納・取得

More Related Content

Similar to 【React×firebase】サービス開発入門ハンズオン

スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向Tsutomu Ogasawara
 
NET MAUI for .NET 7 for iOS, Android app development
 NET MAUI for .NET 7 for iOS, Android app development  NET MAUI for .NET 7 for iOS, Android app development
NET MAUI for .NET 7 for iOS, Android app development Shotaro Suzuki
 
Solution semniar vs2013_multi_device-1209-new
Solution semniar vs2013_multi_device-1209-newSolution semniar vs2013_multi_device-1209-new
Solution semniar vs2013_multi_device-1209-newShotaro Suzuki
 
20180616 業務システムをAppServiceで運用しよう #きたあず #jazug
20180616 業務システムをAppServiceで運用しよう #きたあず #jazug20180616 業務システムをAppServiceで運用しよう #きたあず #jazug
20180616 業務システムをAppServiceで運用しよう #きたあず #jazugKatsuya Shimizu
 
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンスHTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンスアシアル株式会社
 
20120413 nestakabaneworkshop
20120413 nestakabaneworkshop20120413 nestakabaneworkshop
20120413 nestakabaneworkshopYoichiro Sakurai
 
デブサミ2011 LT大会【17-E-7】appengine ja night
デブサミ2011 LT大会【17-E-7】appengine ja nightデブサミ2011 LT大会【17-E-7】appengine ja night
デブサミ2011 LT大会【17-E-7】appengine ja nightbluerabbit777jp
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化Takashi Okamoto
 
HTML5 クロスプラットフォームアプリ開発の現実解
HTML5 クロスプラットフォームアプリ開発の現実解HTML5 クロスプラットフォームアプリ開発の現実解
HTML5 クロスプラットフォームアプリ開発の現実解Monaca
 
Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣アシアル株式会社
 
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法Akira Hatsune
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみたTakeo Noda
 
小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変えるHiroto Igarashi
 
5分で分かるmonaca pressproject(草案)
5分で分かるmonaca pressproject(草案)5分で分かるmonaca pressproject(草案)
5分で分かるmonaca pressproject(草案)Yuki Okamoto
 
WordPressサイトをスマホアプリにしちゃおう!
WordPressサイトをスマホアプリにしちゃおう!WordPressサイトをスマホアプリにしちゃおう!
WordPressサイトをスマホアプリにしちゃおう!Ryu Shindo
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublishedYoichiro Sakurai
 

Similar to 【React×firebase】サービス開発入門ハンズオン (20)

Bambooによる継続的デリバリー
Bambooによる継続的デリバリーBambooによる継続的デリバリー
Bambooによる継続的デリバリー
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
[GrapeCity Web TECH FORUM 2018]グレープシティJavaScript製品のご紹介 活用のコツと開発のポイント
 
NET MAUI for .NET 7 for iOS, Android app development
 NET MAUI for .NET 7 for iOS, Android app development  NET MAUI for .NET 7 for iOS, Android app development
NET MAUI for .NET 7 for iOS, Android app development
 
Solution semniar vs2013_multi_device-1209-new
Solution semniar vs2013_multi_device-1209-newSolution semniar vs2013_multi_device-1209-new
Solution semniar vs2013_multi_device-1209-new
 
20180616 業務システムをAppServiceで運用しよう #きたあず #jazug
20180616 業務システムをAppServiceで運用しよう #きたあず #jazug20180616 業務システムをAppServiceで運用しよう #きたあず #jazug
20180616 業務システムをAppServiceで運用しよう #きたあず #jazug
 
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンスHTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
HTML5によるモバイルアプリ開発 が拓拓くビジネスチャンス
 
20120413 nestakabaneworkshop
20120413 nestakabaneworkshop20120413 nestakabaneworkshop
20120413 nestakabaneworkshop
 
デブサミ2011 LT大会【17-E-7】appengine ja night
デブサミ2011 LT大会【17-E-7】appengine ja nightデブサミ2011 LT大会【17-E-7】appengine ja night
デブサミ2011 LT大会【17-E-7】appengine ja night
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化
 
Force.com開発基礎
Force.com開発基礎Force.com開発基礎
Force.com開発基礎
 
HTML5 クロスプラットフォームアプリ開発の現実解
HTML5 クロスプラットフォームアプリ開発の現実解HTML5 クロスプラットフォームアプリ開発の現実解
HTML5 クロスプラットフォームアプリ開発の現実解
 
Onsen UIが目指すもの
Onsen UIが目指すものOnsen UIが目指すもの
Onsen UIが目指すもの
 
Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣Cordova×業務システム:失敗しないモバイル開発の秘訣
Cordova×業務システム:失敗しないモバイル開発の秘訣
 
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法
ネイティブアプリ開発を加速する、モダンバックエンドとのタイアップ手法
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
 
小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える
 
5分で分かるmonaca pressproject(草案)
5分で分かるmonaca pressproject(草案)5分で分かるmonaca pressproject(草案)
5分で分かるmonaca pressproject(草案)
 
WordPressサイトをスマホアプリにしちゃおう!
WordPressサイトをスマホアプリにしちゃおう!WordPressサイトをスマホアプリにしちゃおう!
WordPressサイトをスマホアプリにしちゃおう!
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
 

【React×firebase】サービス開発入門ハンズオン

Editor's Notes

  1. デプロイした際のドメインや格納されているデータ等より詳細な情報も管理コンソールから一目で見ることができる
  2. これで最初に見てもらったこの構成が完成しました。 これで本日ハンズオンで作成するアプリは完成です。 お疲れ様でした
  3. 各章毎に書く必要があるコードは、手順書内に既に書いてあります。 次の解説が始まるまでに間に合わない場合は、コードをコピーして次にすすんでください。
  4. この前準備でできることはハンズオン用のアプリがFirebase接続済の状態で起動するまで一緒に進めます
  5. 手順書に書いてあるリンを押してもらうとプロジェクトをforkする画面が出ます。 すでにフォーク済の人はここでやり直して
  6. forkしたプロジェクトからクローン
  7. ここ変数名を合わせておきたい
  8. まず実際のコードを見て render関数の部分 通常のhtmlでは見慣れないタグを使っている部分の話をします
  9. https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L20-27 https://ja.reactjs.org/docs/react-component.html#render https://preact.gitbooks.io/react-book/content/jsx/index.html 個人的にqiita https://qiita.com/Julia0709/items/3c3fc8d29fd2e56ed7a9
  10. ochageでwindow.alartを書いて発火することを確認 value属性にstateを参照する記述を追記する setStateの記述をする render()とHTMLには存在しないタグについて確認
  11. さきほど伝えたようにrender関数が呼ばれないと、Reactに画面に描画したい情報を伝えることができません。 stateに値を保持するsetStateすると、自動的にrender関数が呼ばれて最新のstateの情報を画面に反映することができます
  12. Reactはstateの変更要求に従い値を変更し、 再度renderメソッドを呼び出して画面で見たいものを再生成する。 https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L156-158 https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L23 https://ja.reactjs.org/docs/react-component.html#setstate https://ja.reactjs.org/docs/faq-state.html#what-does-setstate-do
  13. https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L20-27 https://ja.reactjs.org/docs/react-component.html#render https://preact.gitbooks.io/react-book/content/jsx/index.html
  14. https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L20-27 https://ja.reactjs.org/docs/react-component.html#render https://preact.gitbooks.io/react-book/content/jsx/index.html
  15. https://gitlab.com/tis-tiw/chousei-firebase/blob/feature/replace-to-firebase/docs/hands-on/01_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B.md#L20-27 https://ja.reactjs.org/docs/react-component.html#render https://preact.gitbooks.io/react-book/content/jsx/index.html
  16. 候補日の区切りは改行で判断する仕様になっている
  17. ここではコード例を確認する
  18. ★できたかどうかの確認はしたくない? ★key削除!!! ★RealTime Database管理コンソールを表示(手順書修正)
  19. ボタンを押すとURLが変わって、次の画面に遷移する処理をつくります
  20. イベント登録画面で様々なイベントが登録されても、遷移先のURLが被らず、一意になるようにしたい そのために自動で採番されたIDを使う
  21. 出欠を入力すると一覧に反映する処理は 前の画面を作成する際に触れたsetState ,firebase DBに値を登録する処理の組み合わせるだけなので 省略します
  22. 登録画面でDBに書き込まれたデータをイベント詳細画面で表示するよう修正する
  23. みなさんのアプリはイベント詳細画面が表示された時に既に イベントの情報が表示されているかと思いますが それは、こちらで事前に用意したダミーデータです。 このダミー部分をDBから取って来た値に置き換えます
  24. 早速置き換えるために DBの値の取得方法を説明していきます ・RealTimeDBから値を取るにあたって、2つの手順で勧めます
  25. ここまではDBにデータを登録する際と同じです DBのインスタンスを作成してパスを指定することでDBのどこに書き込まれている値を扱うかを指定します
  26. ここでは、直前のイベント登録画面で自動生成されて 画面遷移時のURLにも利用したイベントのイベントIDを利用することで 前画面で登録されたイベント情報を取得します。
  27. そのキーの値の取得方法を説明します 今回は、ReactRouter つまりURLに利用した情報からキーの値を取得します。 前画面で見てもらったように、ReactRouterの設定はevent/ のあとに何か値を入れたら遷移するようにしてました この何かの値を取得するにはthis.props.match.params.に続けて、今回だとid を指定することで取れるようになります ここで取ったキー値をパス部分にわたします
  28. DBの値の変化を検知するイベントはいくつかあります 今回は一番シンプルな参照先の値全体の変更を検知するvalueイベントを利用します
  29. 最後にここで呼び出すコールバック関数を指定します。 関数の引数に、呼び出された時点のDBの値が渡されるので そこから値の取得、操作を行いましょう
  30. AntDesignのコンポーネントは受け取る値って表示する値の形式が決まっており その形式に合わせるため DBから取って来た値を編集してからstateに格納、stateからコンポーネントに値を渡すことで 画面に表示します
  31. ここでは手を動かさずに、stateの値を確認するだけで大丈夫です DBの値を編集して、これらのstateに入れるんだなーってことだけおさえておいてください
  32. まずはイベント名と説明文を表示させます
  33. ここでは手を動かさずに、stateの値を確認するだけで大丈夫です DBの値を編集して、これらのstateに入れるんだなーってことだけおさえておいてください
  34. stateの値と、画面を対応づけるとこんな感じです
  35. イベント名と、説明文は値の編集は不要でDBの値を そのまま保存するだけでOKです stateの値を、TitleタグとParagraphタグ部分に表示させます
  36. イベント参加者がイベントの参加可否を答える場所です。 ここもコンポーネントを利用するためにDBから取った値を偏執する必要が有りますが シンプルなのでここは実際に書いてみてください。
  37. ここでは手を動かさずに、stateの値を確認するだけで大丈夫です DBの値を編集して、これらのstateに入れるんだなーってことだけおさえておいてください
  38. 最終的に↑のデータベースの値を↓の形にしてstateに格納します
  39. ↑の値をObject.entries()の引数に与えてあげると 下の状態の値が返ってきます
  40. map関数は配列の中の1要素ごとに処理を繰り返す関数です 今回は配列の 0番目をid 1番目をdateTime というキー名にしたObjectに組み替えていきます answerは初期値の△固定にしています 配列のすべての要素に対して 新しい配列を生成します。
  41. 最終的に↑のデータベースの値を↓の形にしてstateに格納します
  42. 候補日程を表示用に編集しようの部分が、participantsのみstateに保存して前のeventDetailを保存しなくなっている 一連で書いておかないと、コピペしたら消えちゃう 登録画面から正しく動作することを確認する RealtimeDatabaseに値が入っていることを確認する イベント詳細の確認
  43. 出欠表は AntDesignのテーブルを使うために値の操作をするのがとてもややこしい部分です Reactの知識もFirebaseの知識も関係ない部分になりますので 今回ここは、コピー&ペーストで次に進みましょう ★ここで一言、AntDesignのテーブルに合わせて値を編集する関数はこちらで独自に作成していて、ここのコピー箇所ではそれを利用しています 順序は候補日を先に作る
  44. 候補日程を表示用に編集しようの部分が、participantsのみstateに保存して前のeventDetailを保存しなくなっている 一連で書いておかないと、コピペしたら消えちゃう 登録画面から正しく動作することを確認する RealtimeDatabaseに値が入っていることを確認する イベント詳細の確認
  45. ここの作業は一緒に進めていきましょう
  46. これで最初に見てもらったこの構成が完成しました。 これで本日ハンズオンで作成するアプリは完成です。 お疲れ様でした