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

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

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

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

0回答

1189閲覧

Vue.js storeにデータを保存していないのに表示されてしまう

taiju_sugahara

総合スコア0

Vue.js

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

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2021/10/01 09:29

前提・実現したいこと

Vue.jsでアプリケーションを作っていています。
問題としてはEditページにて、フォームに入力したデータをstoreに保存しなくてもデータが反映されてしまいます。(ページ遷移をして再び同じリンクに行った時)
リロードすれば保存していないデータは消えます。
実現したいことはページ遷移をするとstoreに保存していないデータは表示されないようにしたいです。(保存した時のみデータを表示されるようにしたい)

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

エラー原因はmounted()の場所だと思います。
他の場所やコンポーネントをコメントアウトして試しました。
mountedでstoreにあるデータをとってきています。
storeからデータを持ってきてv-modelをstoreに直結させないやり方でやっている(udemy書いていたコードをそのまま使っている)が、現状storeと直結してしまっている。udemyの方では直結していないです。
stateではなくgettersでデータを持ってくるやり方も試しましたが変わりませんでした。

エラーメッセージ

該当のソースコード

Editvue

1<template> 2 <div> 3 <h1>編集ページ</h1> 4 <!-- リロードしないと入力したデータが保存しなくても消えない --> 5 <div class="flex"> 6 <p class="input input__title">項目</p> 7 <p class="input input__title">料金</p> 8 <p class="input input__title">メモ</p> 9 </div> 10 11 <Add v-for="(list, index) in itemBody.item" :key="index" :n="list" :items="itemBody" @emit="toggle"></Add> 12 13 <p v-if="showChild">合計{{sum()}}</p> 14 <button @click="add">項目を追加</button> 15 16 <button class="btn" @click="save">保存する</button> 17 18 </div> 19 20 21</template> 22 23<script> 24import Add from '../components//Add.vue' 25export default{ 26 name: "edit", 27 components:{ 28 Add 29 }, 30 data(){ 31 return{ 32 number:0, 33 itemBody:{ 34 total:0, 35 item:[] 36 }, 37 showChild: true, 38 preItem:{ 39 total:0, 40 item:[] 41 } 42 } 43 }, 44 mounted: function() { 45 let id = this.$route.params["id"]; 46 let item = this.$store.state.items.slice().find(item => item.id == id); 47 48 this.itemBody = item.body; 49 50 console.log(item.body) 51 }, 52 53 54 methods:{ 55 save:function(){ 56 // this.itemBody.item = this.preItem.item 57 this.itemBody.total = this.sum() 58 this.$store.commit("update", { 59 id:this.$route.params["id"], 60 body:this.itemBody 61 }) 62 this.$router.back() 63 }, 64 add(){ 65 let item = this.itemBody["item"] 66 // let item = this.preItem["item"] 67 item.push({title:"",price:"",memo:""}) 68 }, 69 toggle() { 70 this.showChild = false; 71 this.$nextTick(() => (this.showChild = true)); 72 }, 73 sum(){ 74 let total = 0; 75 76 let last =this.itemBody.item.length; 77 for (let n = 0; n < last; n++) { 78 let price = this.itemBody.item[n].price 79 if(price){ 80 total +=price 81 } 82 } 83 console.log(this.$store.state.items) 84 return total 85 86 87 } 88 89 }, 90} 91</script> 92 93<style scoped> 94.flex{ 95 display: flex; 96} 97.input{ 98 width: 200px; 99 100} 101.input__title{ 102 text-align: center; 103} 104.input__content{ 105 height: 40px; 106} 107 108.btn{ 109 margin-top: 30px; 110} 111</style>

Addvue

1<template> 2 <div class="flex"> 3 4 <input type="text" class="input input__content" v-model="n.title"> 5 <input type="number" class="input input__content" v-model.number="n.price"> 6 <textarea class="input input__content" v-model="n.memo"></textarea> 7 <button @click="sum_emit(); delete_item(n)">項目を削除</button> 8 9 </div> 10</template> 11 12<script> 13 export default{ 14 data(){ 15 return{ 16 } 17 }, 18 props:[ 19 "items", 20 "n", 21 ], 22 methods:{ 23 delete_item(n){ 24 let num = this.items.item.indexOf(n) 25 this.items.item.splice(num, 1); 26 this.delete; 27 }, 28 sum_emit(){ 29 this.$emit('emit') 30 } 31 32 33 } 34 35 } 36</script>

store

1import Vue from 'vue'; 2import Vuex from 'vuex'; 3import createdPersistedState from 'vuex-persistedstate' 4 5Vue.use(Vuex); 6 7export default new Vuex.Store({ 8 plugins:[createdPersistedState()], 9 state:{ 10 items:[ 11 { id:0, body:{total:0,}} 12 ], 13 month:[ 14 {id:1, body:{ item:[ 15 {title:"",price:"",memo:""} 16 ], total:0 }}, 17 {id:2, body:{item:[ 18 {title:"",price:"",memo:""} 19 ], total:0 }}, 20 {id:3, body:{item:[ 21 {title:"",price:"",memo:""} 22 ], total:0 }}, 23 {id:4, body:{item:[ 24 {title:"",price:"",memo:""} 25 ], total:0 }}, 26 {id:5, body:{item:[ 27 {title:"",price:"",memo:""} 28 ], total:0 }}, 29 {id:6, body:{item:[ 30 {title:"",price:"",memo:""} 31 ], total:0 }}, 32 {id:7, body:{item:[ 33 {title:"",price:"",memo:""} 34 ], total:0 }}, 35 {id:8, body:{item:[ 36 {title:"",price:"",memo:""} 37 ], total:0 }}, 38 {id:9, body:{item:[ 39 {title:"",price:"",memo:""} 40 ], total:0 }}, 41 {id:10, body:{item:[ 42 {title:"",price:"",memo:""} 43 ], total:0}}, 44 {id:11, body:{item:[ 45 {title:"",price:"",memo:""} 46 ], total:0 }}, 47 {id:12, body:{item:[ 48 {title:"",price:"",memo:""} 49 ], total:0 }} 50 ] 51 }, 52 getters:{ 53 items(state){ 54 return state.items 55 } 56 }, 57 mutations:{ 58 save(state,item){ 59 state.items.push(item); 60 }, 61 update(state,data){ 62 let x = state.items.find(item=> item.id == data.id); 63 x.body = data.body 64 }, 65 month_save(state,m){ 66 state.month[0].body = m.body 67 }, 68 month_save2(state,m){ 69 state.month[1].body = m.body 70 }, 71 month_save3(state,m){ 72 state.month[2].body = m.body 73 }, 74 month_save4(state,m){ 75 state.month[3].body = m.body 76 }, 77 month_save5(state,m){ 78 state.month[4].body = m.body 79 }, 80 month_save6(state,m){ 81 state.month[5].body = m.body 82 }, 83 month_save7(state,m){ 84 state.month[6].body = m.body 85 }, 86 month_save8(state,m){ 87 state.month[7].body = m.body 88 }, 89 month_save9(state,m){ 90 state.month[8].body = m.body 91 }, 92 month_save10(state,m){ 93 state.month[9].body = m.body 94 }, 95 month_save11(state,m){ 96 state.month[10].body = m.body 97 }, 98 month_save12(state,m){ 99 state.month[11].body = m.body 100 }, 101 } 102 103})

試したこと

console.logでstoreの状態をその都度確認した。すると保存していないデータがstoreの中に追加されています。リロードしたら消えます。

補足情報

Vue.jsのvertionは2です。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問