質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

831閲覧

Nuxt.js storeからgettersで取得したデータがHTMLに反映できない

intron0113

総合スコア14

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/04/11 08:05

前提

プログラミング初学者です。
Nuxt.js +firebaseで記事投稿システムを作っています。
記事投稿後の編集機能を実装中に行き詰まった箇所の質問になります。

実現したいこと

・storeからgettersで取得したオブジェクトデータをinputタグで初期値として表示し、文字編集後store側にdispatchしていきたい。

発生している問題・エラーメッセージ

 computedで取得したデータが上手くHTML側で表示ができない。

該当のソースコード

edit.vue

1<template> 2 <section class="container posts-page"> 3 <el-card style="flex: 1"> 4 <div class="clearfix"> 5 <el-input 6 value="post.title" 7 placeholder="タイトルを入力" 8 v-model="formData.title" 9 /> 10 </div> 11 <div> 12 <el-input 13 placeholder="本文を入力……" 14 type="textarea" 15 rows="15" 16 v-model="formData.body" 17 /> 18 </div> 19 <div class="text-right" style="margin-top: 16px"> 20 <el-button type="primary" @click="publishPost" round> 21 <span class="el-icon-upload2" /> 22 <span>Publish</span> 23 </el-button> 24 </div> 25 </el-card> 26 </section> 27</template> 28<script> 29export default { 30 layout: "after-login", 31 async asyncData({ store, route, error }) { 32 const id = route.params; 33 console.log(id); 34 try { 35 await store.dispatch("posts/getPost", { 36 postId: id.postId, 37 uid: id.uid, 38 }); 39 } catch (e) { 40 error({ statusCode: 404 }); 41 } 42 }, 43 computed: { 44 formData() { 45 return this.$store.getters["posts/selectPost"]; 46 }, 47 48 49 uid() { 50 return this.$store.getters.user.uid; 51 }, 52 name() { 53 return this.$store.getters.user.name; 54 }, 55 photoURL() { 56 return this.$store.getters.user.photoURL; 57 }, 58 }, 59 methods: { 60 61 publishPost() { 62 this.$store.dispatch("posts/publishPost", { 63 photoURL: this.photoURL, 64 name: this.name, 65 uid: this.uid, 66 title: this.formData.title, 67 body: this.formData.body, 68 }); 69 this.title = ""; 70 this.body = ""; 71 }, 72 }, 73}; 74</script>

posts/index.js

1export const state = () => ({ 2 3 selectPost: [], 4}); 5 6export const getters = { 7 8 selectPost: (state) => { 9 return state.selectPost; 10 }, 11}; 12 13export const mutations = { 14 setPost(state, data) { 15 state.selectPost = data; 16 }, 17}; 18 19export const actions = { 20 21 async getPost({ commit }, payload) { 22 try { 23 console.log(payload.postId); 24 const querySnapshot = await this.$fire.firestore 25 .collection("posts") 26 .where("postId", "==", payload.postId) 27 .get(); 28 29 const selectPost = []; 30 querySnapshot.forEach((doc) => { 31 const data = doc.data(); 32 console.log(data); 33 selectPost.push(data); 34 }); 35 console.log(selectPost); 36 commit("setPost", selectPost); 37 } catch (error) { 38 console.log(error); 39 } 40 }, 41 42 async publishPost({ dispatch }, payload) { 43 const collection = this.$fire.firestore.collection("posts"); 44 const newId = collection.doc().id; 45 46 try { 47 await collection.doc(newId).set({ 48 postId: newId, 49 photoURL: payload.photoURL, 50 name: payload.name, 51 uid: payload.uid, 52 title: payload.title, 53 body: payload.body, 54 time: this.$fireModule.firestore.FieldValue.serverTimestamp(), 55 }); 56 // console.log(uid); 57 // console.log(title); 58 // console.log(body); 59 dispatch("getPosts"); 60 } catch (error) { 61 // console.log(title); 62 console.log(error); //eslint-disable-line 63 console.log(payload); //eslint-disable-line 64 } 65 }, 66

試したこと

getとsetを使用して取得と送信を行うと考えているのですが、実装が上手くいきませんでした。
titleとbodyをstore側でまとめてデータ取得していますが、1項目ずつ取得した方が上手くいくのか、現在の方法でも実装が可能か教えていただけると幸いです。
よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

posts/index.vueのstateへの格納方法を変更し、
edit.vue側で呼び出す際にv-modelを使用してinputで入力しようとすると、「do not mutate vuex store state outside mutation handlers」のエラーが発生したため、get()set()を使用し、actionからstateの値を変更する事で対応できました。
参考記事
https://designsupply-web.com/media/programming/6812/

edit.vue

1//computed 2selectPost: { 3 get() { 4 return Object.assign({}, this.$store.getters["posts/selectPost"]); 5 }, 6 set(value) { 7 this.$store.dispatch("posts/fetchPost", value); 8 }, 9 }, 10

posts/index.vue

1export const state = () => ({ 2 posts: [], 3 selectPost: { 4 body: "", 5 name: "", 6 photoURL: "", 7 postId: "", 8 time: "", 9 title: "", 10 uid: "", 11 }, 12}); 13 14//getters 15 async getPost({ commit }, payload) { 16 try { 17 console.log(payload.postId); 18 const querySnapshot = await this.$fire.firestore 19 .collection("posts") 20 .where("postId", "==", payload.postId) 21 .get(); 22 23 const selectPost = []; 24 querySnapshot.forEach((doc) => { 25 const data = doc.data(); 26 console.log(data); 27 commit("setPost", { 28 body: data.body, 29 name: data.name, 30 photoURL: data.photoURL, 31 postId: data.postId, 32 time: data.time, 33 title: data.title, 34 uid: data.uid, 35 }); 36 }); 37 } catch (error) { 38 console.log(error); 39 } 40 }, 41//action 42 async fetchMembers({ commit }, payload) { 43 return commit("setPost", payload); 44 },

投稿2022/04/14 05:56

intron0113

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問