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

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

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

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

Vuex

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

Vue CLI

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

Q&A

解決済

1回答

5643閲覧

vuexで[Computed property "editA" was assigned to but it has no setter.] というエラーが出ます。

ueda_kesuke

総合スコア34

Vue.js

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

Vuex

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

Vue CLI

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

0グッド

0クリップ

投稿2020/04/10 10:03

現在todoアプリをvuexを用いてで作っております。
その過程で上記エラーがでてしました。

##やりたいことと
inputFormA という部分に値が入ったらその場編集のinputフォームを出したい。
v-if="!editA!という部分でtrue/falseで出現させるボタンを切り替えたい

##コード

Blogs.vue↓

vue

1<template> 2 <div class="blogs-area column is-three-fifths"> 3 <div> 4 <div v-for="blog in allBlogs" :key="blog.id"> 5 <div class="blog-box"> 6 <input v-if="inputFormA === blog" v-model="blog.title" v-focus> 7 <h3 v-else>{{ blog.title }}</h3> 8 <textarea class="textarea" v-if="inputFormA === blog" v-model="blog.description"></textarea> 9 <p v-else>{{ blog.description }}</p> 10 <div class="field is-grouped"> 11 <p class="control" v-if="!editA"> 12 <button class="button is-warning" @click="editBlog(blog)"> 13 Edit 14 </button> 15 <button class="button is-danger" @click="deleteBlog(blog.id)"> 16 Delete 17 </button> 18 </p> 19 <p class="control" v-else> 20 <button class="button is-success" @click="saveEditBlog(blog)"> 21 Save 22 </button> 23 </p> 24 </div> 25 </div> 26 <hr> 27 </div> 28 </div> 29 </div> 30</template> 31 32<script> 33import { mapActions, mapGetters } from 'vuex' 34 35export default { 36 directives: { 37 focus: { 38 inserted(el) { 39 el.focus(); 40 } 41 } 42 }, 43 computed: mapGetters(['allBlogs', 'inputFormA', 'editA']), 44 methods: { 45 ...mapActions(['fetchBlogs', 'deleteBlog', 'saveEditBlog']), 46 editBlog(blog) { 47 this.editA = true; 48 this.inputFormA = blog; 49 } 50 }, 51 created() { 52 this.fetchBlogs() 53 } 54} 55</script>

store.js↓

js

1 2~~ 3 4const state = { 5 blogs: [], 6 inputForm: null, 7 edit: false 8}; 9 10const getters = { 11 allBlogs: state => state.blogs, 12 inputFormA: state => state.inputForm, 13 editA: state => state.edit 14}; 15 16const mutations = { 17 18 ~~ 19 const index = state.blogs.findIndex(i => i.id === blog.id); 20 state.blogs.splice(index, 1, blog); 21 }, 22}; 23 24const actions = { 25 26 ~~ 27 28 async saveEditBlog({ commit }, blog) { 29 await axios.patch(`${baseURL}/${blog.id}`, blog) 30 .then(res => { 31 commit('saveBlog', res) 32 this.inputFormA = null, 33 this.editA = false 34 }) 35 .catch(e => console.log(e)) 36 } 37}; 38 39export default { 40 state, 41 getters, 42 mutations, 43 actions 44};

##問題点
getterの使い方がよくわかっておらず引数を渡せていないのかなと思いました。しかし解決方法がわからず質問させていただく運びとなりました。

足りない情報などありましたら言ってくださるとありがたいです。
ご教授お願いいたします????‍♂️

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

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

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

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

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

guest

回答1

0

ベストアンサー

VuexのGettersは、stateの値を変換して取得するための機能です。
名前の通り、get(取得)する機能だけが提供されます。

javascript

1// Get => OK 2const value = this.editA 3 4// Set => NG 5this.editA = true

ueda_kesukeさんのコードでは、このgetterに対して、set(代入)を行っているため、エラーになっています。

javascript

1this.inputFormA = null, 2this.editA = false

コードを見る限り、ueda_kesukeさんが更新したいデータはinputFormeditでありませんか?


Vuexでの基本的な利用方法は、公式ドキュメントにある通り、stateを更新して、そのstateを利用している(複数の)Vueコンポーネント(Vue components)を更新することです。

このとき、各々のコンポーネントがそれぞれ同じ方法でstateの値を変換するComputed Propertyを持っていると、それは非効率です。この場合に、VuexのGettersを利用してstateを変換して利用するロジックを一箇所で定義できるのです。


ちなみに、VuexのGettersに限らず、Vue.js本体のComputed Propertyも、SetterとGetterを別々に定義することができます(公式ドキュメント該当箇所)。普段はSetterを省略して書いていることが多いと思うので、あまり意識していないかもしれません。

重要なことは、VuexのGettersも、Computed PropertyのGetterも、値を取得するための「関数」を定義しているということです(Setterは内部で別のdata/stateに値を代入するための関数)。


GetterやSetterは、Vue.jsに特有の概念ではなく、JavaScriptの言語仕様の一部です。
よりさかのぼって情報を得たい場合は、MDNのGetterの説明Setterの説明をご覧ください。

投稿2020/04/12 07:55

NozomuIkuta

総合スコア1260

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

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

ueda_kesuke

2020/04/13 08:09

参考資料も掲載いただきありがとうございます!おっしゃる通り代入という部分で意味がわかっていなかったです。NozomuIkutaさんの解説でふに落ちました。違うアプローチで実装することができました。本当にありがとうございました!
NozomuIkuta

2020/04/14 08:46

解決したようでよかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問