Nuxt.jsでFirebaseのRealtime Databaseにデータを編集して保存する方法
Nuxt.jsでFirebaseのRealtime Databaseにデータを編集して保存する方法を紹介します。
目次から読む
Nuxt.jsでFirebaseのRealtime Databaseにデータを編集して保存する手順
- pagesのコンポーネントでasyncDataにデータのIDを追加
- pagesのコンポーネントにstoreのactionsにアクセスするメソッドを作成
- storeのmutationsにstateにedit/updateするためのmutationを作成
- storeのactionsにデータへ更新するためのactionを作成
pagesのコンポーネントでasyncDataにデータのIDを追加
  asyncData(context) {
    return axios.get(`https://[firebaseのurl].app/posts/${context.params.postId}.json`)
    .then(res => {
      // console.log('admin', res.data);
      // データベースにアクセスするときにidが必要なので下のように追記
      return {loadedPost: {...res.data, id: context.params.postId}}
    })
    .catch(e => context.error(e))
  },編集する場合、もともとのデータのIDが必要になります。
そのIDを取得するために、asyncDataで、データを取得する段階で、IDを追加しておきます。
上のケースでは、axiosでgetリクエストしたあと、then()メソッドのレスポンスのdataをスプレッド構文で分解してから、idを組み込んでオブジェクトにしています。
pagesのコンポーネントにstoreのactionsにアクセスするメソッドを作成
  methods: {
    // editedPostはAdminPostFormからくる
    onSubmitted(editedPost) {
      this.$store.dispatch('editPost', editedPost)
      .then(() => {
        this.$router.push('/admin')
      })
    }dispatchでactionsのeditPostにアクセスしています。
そのとき、editedPostというデータを渡しますが、上のasyncDataでidを格納しているので、データベースにアクセスする際にそのIDを使うことができます。
storeのmutationsにstateにedit/updateするためのmutationを作成
    mutations: {
      // データを更新
      editPost(state, editedPost) {
        const postIndex = state.loadedPosts.findIndex(post => post.id === editedPost.id)
        state.loadedPosts[postIndex] = editedPost
      },
    },データの更新をするために、findIndex()メソッドを使って、idと一致するもののインデックス番号を取得します。
findIndex()メソッドについては、find()とfindIndex()メソッドの使い方を参考にしてみてください。
それを変数に格納して、配列のそのインデックス番号のものを更新します。
storeのactionsにデータへ更新するためのactionを作成
    actions: {
      // データの更新
      editPost(vuexContext, editedPost) {
        // データの更新をしたいのでPUTリクエストを使用
        // idにはeditedPostのidでアクセスできる
        return axios.put(`https://[firebaseのurl].app/posts/${editedPost.id}.json`, editedPost)
        .then(res => {
          console.log('id',editedPost.id);
          vuexContext.commit('editPost', editedPost)
        })
        .catch(e => console.log(e))
      }
    },ここで、asyncData()で格納したidがあるのでアクセスできます。