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があるのでアクセスできます。