Closed9

React初心者がFirebaseを使ってブログを作るのでメモ

ツクモンツクモン

UdemyでReactを勉強中。
3つのアプリを動画見ながら作成中で、一通り終わった。
次は自分で1から作り、わからないところは動画で確認するつもり。
いったん、ReactとFirebaseでブログを作る上でどんな機能が必要か、書き出すことで考えを整理したい。

ツクモンツクモン

画面を整理

  • ホーム画面
  • 記事作成画面
  • ログイン
  • ログアウト

ホーム

投稿した記事が表示される。
記事には本文、タイトル、編集ボタン(自分が投稿したもののみ)が表示される。

記事作成

タイトル、本文の入力欄、投稿ボタンが表示される。
入力されたテキストはuseStateで管理、onChangeイベント発火時に更新。
投稿ボタンが押されることでFirebaseのデータベース(FireStore)に登録される。

ログイン

Firebaseの認証機能(Authentication)を使ってGoogleアカウントでログインできるようにする。
ログイン済みの場合は表示されないようにする。
ログインされているかはStateで管理?

ログアウト

ログアウトボタンが表示される。
ログアウト時は表示されない。

ナビゲーション

画面ではないが。
各画面へのリンクを表示。
ログイン画面・ログアウト画面へのリンクがログイン状態によって表示・非表示される。

ツクモンツクモン

ログイン

ログイン状態を管理するStateをApp.jsに追加。
Login.jsに渡す。
Login.jsではFirebaseの認証機能(signInWithPopup)を使って、成功時にStateをtrueに更新。
ローカルストレージにもログイン状態を保存。
ログイン成功時にはホーム画面に遷移させるため、react-router-domのuseNavigateを使用。

ツクモンツクモン

ログアウト

ログイン画面のLogin.jsを丸コピ。
ログイン部分をログアウトの処理に書き換える(FirebaseのsignOut)
ログアウトボタン押下時に、ログイン状態とローカルストレージをfalseにして、useNavigateでログインページに遷移。
また、ナビゲーションのログイン・ログアウトのリンクの出し分けを、ログイン状態を見て三項演算子で実装。

ツクモンツクモン

記事作成

入力されたテキストをStateで管理。
FirestoreのaddDocでコレクションに追加。
https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja

途中、エラーが出ないのに投稿がfirestoreに入らないことがあったが、単純に前に作ったFirebaseプロジェクトの方に入っていただけだった。
try~catch文を何気に初めて使うなどしたが、凡ミスでした☺️

ツクモンツクモン

ホーム画面

Firestoreから投稿データを読み取り、map関数で表示。
Firestoreのデータのネストが深く、読み取るのが大変そう。
https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja#get_all_documents_in_a_collection
記事の削除ボタンは、現在ログイン中のユーザーIDと記事の著者IDが一致する場合のみ表示させる。
https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja#delete_documents
記事の削除時、ホーム画面の投稿一覧が更新されないので、window.location.hrefでホームに遷移するようにした。
(記事リストの更新をuseEffectで監視し、その際に表示を更新するとかができそうか?)

ツクモンツクモン

その他

未ログイン時に記事投稿ができないように、未ログイン時に記事投稿へのリンクを表示させないように変更。
また、記事作成画面のURLを叩いたときも、未ログインであればログイン画面に遷移するように。

ツクモンツクモン

追加でできそうなこと

  • tailwind css
  • Redux
  • Typescript
  • 記事の編集
  • 記事リストが変更されたときにホーム画面を更新(useEffect)
  • Markdownエディター
ツクモンツクモン

全部自分で作った後に気付いたこと

  • Googleログインはリロード後にもログイン状態が維持されているのか
このスクラップは2024/04/30にクローズされました