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

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

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

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

Nuxt.js

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

Vuex

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Q&A

解決済

1回答

1899閲覧

Nuxt.jsで編集画面実装の際、Vuex storeのstateから、ID検索で値を取得→ input要素にv-modelするとエラーになってしまう問題について。

Takashi8787

総合スコア43

Vue.js

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

Nuxt.js

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

Vuex

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

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

0グッド

0クリップ

投稿2021/07/01 08:38

【質問内容】
Nuxtでの開発で、編集画面機能の元データを、store.stateから引っ張ってくる際、
そのデータを<input v-model>すると、フォームの値を変更するときに

[vuex] do not mutate vuex store state outside mutation handlers.

というエラーがでてしまいます。
元データは、id検索で、store.getters内のメソッドで取得しております。
一度、const hoge に格納しているので、バインディングはされていないと思ったのですが、うまくいきません。

そして、なぜか、
store/index.jsのコードの先頭に、

js

1export const strict = false

と追記すると、このエラーは消えます。
そもそも、編集画面でv-modelするデータを、store.stateから検索して取得するというロジックが間違っているのでしょうか??
これをfirestore側から1件取得・・・というのは、非同期処理で実現できると思いますが、
なんだか不自然な気がしております。

この問題の解決策がわかる方おりましたら、ご教示頂けたら助かります。
よろしくお願いいたします。

---
◆開発環境(機能:事故データ管理システムのCRUD機能)

  • Vue(Nuxt.js、Vuetify)
  • Vuex
  • CloudFireStore

以下のような構成で、編集ページの機能を持たせようとしております。

【機能構成】
index.vue (事故データ一覧表示)

↓ どれか1つの「編集ボタン」クリック

_id.vue (idに紐づくデータをstoreよりひっぱり、フォームに復元、編集できるようにする)


コードのロジックとしては、以下に記載の通りです。

vuex

1/* store/accidents.js */ 2 3export const state = () => ({ 4 accidents: [], //事故一覧のデータ、idや日時、ユーザー名など格納 5}) 6 7export const getters = { 8 // 編集用のデータをstate.accidentsからID検索取得 9 getAccidentById: (state) => (id) => { 10 return state.accidents.find(accident => accident.id === id) 11 }, 12} 13

vue

1// vue単一コンポーネント( データ編集画面機能 ) 2// edit/_id.vue 3<template> 4 <div> 5 <input v-model='accident_data.user_name' type="text"> 6 <input v-model='accident_data.accident_place' type="text"> 7 <button @click='registFunction'>登録</button> 8 </div> 9</template> 10 11 12export default { 13 created() { 14 const accident = this.$store.getters['accidents/getAccidentById'](this.$route.params.id) 15 // IDに紐づくデータが取得できた場合、this.accident_data(v-model用変数)に代入 16 if(accident) { 17 this.accident_data = accident 18 } else { 19 this.$router.push({ name: 'index' }) 20 } 21 }, 22 data: function() { 23 return { 24 accident_data: {}, 25 } 26 } 27} 28

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

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

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

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

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

guest

回答1

0

自己解決

こちら、一応、自己解決できました。

stateのオブジェクトを参照で渡してしまっていたので、

vue

1(edit/_id.vueの中) 2 3const temp_obj = this.$store.getters['accidents/getAccidentById'](this.$route.params.id) 4this.accident_data = Object.assign({}, temp_obj)

とすることで、store.stateとのバインディングからは話されたオブジェクトになり、inputでv-modelしても問題なく動くようになりました。

このロジックが良いのかは分かりませんが、、もっと良いやり方ありましたら、ご指摘お願いいたします。

投稿2021/07/01 09:13

Takashi8787

総合スコア43

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問