プロ野球のドラフト会議をやってみたかったので、Vue.jsとFirebaseを使って爆速で作ってみた

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/5297dc83-3356-4e8e-555a-24e54f2eef16.gif)
# 第一回ドラフト結果
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/49ac5d4e-afdb-d6a5-fe39-db24fa52b3a6.png)
#はじめに
まだまだ拙い部分が多いですが、実際に遊んでみて楽しかったので一旦おっけーってことで記事を書いている次第です。
今後も細々修正＆追加していこうと思っているので生暖かい目で見守って頂けると幸いです。

そして「爆速」はほぼ釣りです。Qiitaに投稿するなら書いてみたっかたので。笑
プロ野球ドラフト会議っぽい？感じの流れ遊べるまでで約３時間ぐらいだったので、独断と偏見により「爆速」認定しました。
実際はその後この記事を書くまで３ヶ月ぐらいかかってます。。。
ほぼ[5.ダサいコードのリファクタリング](https://qiita.com/the1031hiroto/items/0bab67434638d45d761c#5%E3%83%80%E3%82%B5%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)に費やしました。。。
コミットから逆算するトータル３２時間ぐらいで、体感的にはコード書いてた時間は８時間もなさそうかな？もう少し記録を取っておけばよかった

[ドラフト会議をやってみる](https://draft-16125.firebaseapp.com/room)
[遊び方](https://qiita.com/the1031hiroto/items/0bab67434638d45d761c#%E9%81%8A%E3%81%B3%E6%96%B9)
#モチベーション
タイトルにもあるように「プロ野球のドラフト会議がやってみたかった」
やりたい! → ない! → 作ろう！
#遊び方
##1.ドラフト会議ページへGO！
[ドラフト会議ページ](https://draft-16125.firebaseapp.com/room)
##2.Room名入力
<img width="330" alt="スクリーンショット 2019-07-29 13.31.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/ed6a70c1-06fa-39df-7195-35b640b60deb.png">
##3.トップページ※このページはずっと使うので閉じないで下さい
<img width="462" alt="スクリーンショット 2019-07-29 13.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/1b9f1178-1e61-982f-16cd-765a8d868b98.png">
##4.「招待」ボタン押下でQRコードが表示されるのでスマホなどで読み込む
<img width="496" alt="スクリーンショット 2019-07-29 13.34.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/23256f20-e969-eb37-00b3-f7150d8d6488.png">
##5.名前を入力
<img width="272" alt="スクリーンショット 2019-07-29 13.35.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/b49216bf-6c4b-7cee-bf54-4c7cdab719b1.png">
##6.下の表の「選手一覧」の選手をクリック
<img width="1426" alt="スクリーンショット 2019-07-29 13.38.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/ba7fd5b8-b69a-f69d-20f2-3b36ea7b34a5.png">
##7.選んだ選手が上の表の「獲得希望選手」に移動する（ここはあくまでも自分用）
<img width="1429" alt="スクリーンショット 2019-07-29 13.36.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/8617ec42-0265-8537-0fc0-195096feb628.png">
##8.上の表の「獲得希望選手」の選手をクリックすると確認モーダルが表示されるので「確定」ボタンを押下
<img width="436" alt="スクリーンショット 2019-07-29 13.41.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/f9996327-646b-025c-4895-60301358e430.png">
##9.参加者全員が選択するまで待機
<img width="459" alt="スクリーンショット 2019-07-29 13.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/a18a5e72-7fc7-33bf-b6fe-a867238131c2.png">
##10.全員が選択後、「次巡スタート」ボタンが表示されるので押下
<img width="334" alt="スクリーンショット 2019-07-29 13.45.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/589742c3-073f-cc57-5cf0-7a207b7c690e.png">
##11.それっぽい画像が表示されるので、存分に楽しんだら「次へ」ボタンを押下
<img width="903" alt="スクリーンショット 2019-07-29 13.47.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/9bc396e7-119d-8ad9-fda6-c592d18f5934.png">
##12.獲得できると「獲得」表示されるので、存分に楽しんだら「Next」ボタンを押下
<img width="896" alt="スクリーンショット 2019-07-29 13.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/9571b956-b990-f3b1-e61a-2d0b236f249e.png">
##13. ⑦に戻る
##14.存分に楽しむ
#作ったもの（動画）
##トップページ
参加者と未選択ユーザーが表示される。全員が選択すると次に進める。Firebase様様
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/4bccb47d-021a-a4e5-32d7-b90e82630ee5.gif)
##個人ページ
獲得できると「獲得済み選手」に移動して、選択可能選手から消える。Firebase様様再び
![7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268079/af84fd2e-77bf-579e-2472-46d58b430729.gif)
#作ったもの（図）
後日追加予定
#制作の流れ
使ったのは大まかにはこの三つ
Vue.js, Firebase, Bootstrap
##1.まずはvue cli3でプロジェクト立ち上げ
~~ググるとQiitaの記事が何個か出てくるが、割と難しいこと書いてる（独断と偏見）がそんなことより~~コマンド2つたたいて、あとはGUIで流れに沿ってけば何とかなる。[vue cli3](https://cli.vuejs.org/)

```
npm install -g @vue/cli
vue ui
```

##2.Firebase Realtime Databeseと接続
[公式が一番分かりやすい](https://firebase.google.com/docs/database/web/start?hl=ja)
##3.Firebase Hostingでweb表示
[公式が一番分かりやすい再び](https://firebase.google.com/docs/hosting/quickstart?hl=ja)
##4.プロ野球ドラフト会議っぽい？感じの流れのUIをつくる
ここまでで約3時間
bootstrap-vueでガシガシ実装。
1.[table](https://bootstrap-vue.js.org/docs/components/table/)
3.[input-group](https://bootstrap-vue.js.org/docs/components/input-group)
4.[modal](https://bootstrap-vue.js.org/docs/components/modal/)
記憶とコミットを漁りながら後日追加予定
##5.ダサいコードのリファクタリング
ここにだいぶハマってなかなか時間を使ってしまった。約16時間
[computedはリアクティブな依存関係にもとづきキャッシュされる](https://jp.vuejs.org/v2/guide/computed.html#%E7%AE%97%E5%87%BA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-vs-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)ことを知ってまず思い付いたのがこれ。
しかしこれだとundefinedになる。ハマった一番の理由はconsoleに1回目はundefinedが出る ⇦ これは分かる。二回目にちゃんんとデータが取れてるのが出るののに、mainDataはundefinedのまま。ふぁっっっっっっ！？

```javascript
export default {
    name: 'top',
    data () {
        return {
        }
    },
    computed: {
        mainData: function() {
            let data = []
            firebase.database().ref('/data').on('value', function(snapshot) { data = snapshot.val() });
　　　　　　　console.log(data)
            return data
        }
    }
}
```
なるほど、2回目はreturnしてくれないのね。awaitしよう！
で、次に思いついたのがこれ
これだとmainDataはfunctionになる。 ⇦ そりゃそーだ

```javascript
mainData: async function() {
    let data = await firebase.database().ref('/data').on('value', function(snapshot) { return snapshot.val() })
    return data
}
```
awaitの場所を変えてみたりなんやかんやあって、こーなった。Firebaseから取得できるとchashDataに格納される、chashDataに変更があるとmainDataに反映されるって寸法
いまだにこれがベストプラクティスなのか激しく疑問

```javascript
export default {
    name: 'top',
    data () {
        return {
          chashData: []
        }
    },
    created() {
		let _this = this
		firebase.database().ref('/data').once('value').then( snapshot => _this.chashData = snapshot.val() )
    },
    computed: {
        mainData: function() {
            return this.chashData
        },
    }
}

```
###Firebase

```javascript

firebase.database().ref('/data').once('value') //一度だけを取得 ⇦ Roomが作られた時に選手データを取得
firebase.database().ref('/data').on('value') //データに変更があったら取得 ⇦ child_changedとchild_added両方なので使ってない
firebase.database().ref('/orders').on( 'child_changed'） //下層に変更があったら取得 ⇦ 選択希望選手が選択された時
firebase.database().ref('/users').on( 'child_added'） //下層に追加があったら取得 ⇦ ユーザーが参加した時
```

##6.複数組で遊べるようにルーティングとデータ構成の修正
約8時間
記憶とコミットを漁りながら後日追加予定
#TODO
1.~~守備位置表示 ⇦ ヤバいサードがいない！宮崎！既に取られてる。。。サードって誰がいたっけ？うおぉぉぉってなった時にあると嬉しい~~
=>守備位置はデータ取得元がない上に、シーズン中に複数ポジション守ってる選手の扱いなどが難しいので、「投手」「捕手」「内野」「外野」の４つで分類。
2.~~終了後にオーダーを組める ⇦ やっぱりせっかくやったなら、みんなであーだこーだ話した方が楽しい~~
=>打順・守備位置を選択して投票できるように実装
3.~~そのオーダーが（分かりやすく）比較できる ⇦ 横並びとかで見れた方が分かりやすいだろう~~
=>見やすいかは微妙だが一応実装
4.ルールの追加(守備位置縛り、　合計年棒　 etc) ⇦ 全員外野とかになると面白くない、~~巨人みたいなチームになって微妙？~~広島とか西武ってSUGEEEEってなる。笑
5.データを選べる（最新、20○○年、OB etc） ⇦ マー君とかイチローとかも欲しい
6.他の人が選んだ選手が見れる ⇦ 戦略性が上がる？見れない方が面白い説もあるので選べるようにしたい
#さいごに
[ドラフト会議](https://draft-16125.firebaseapp.com/room)で遊んでもらえれば幸いです。
出来れば、もっとこうして！とか、ここおかしくね？とか教えてもらえるもっと嬉しいです。