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

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

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

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

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Vuex

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

JavaScript

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

Q&A

解決済

2回答

1875閲覧

Vue Vuex storeで定義した関数が未定義となってしまう

_Victorique__

総合スコア1392

Vue.js

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

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Vuex

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

JavaScript

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

0グッド

0クリップ

投稿2019/01/22 09:06

counterというstoreモジュールで定義したcountUp()という関数が定義されていないと出てしまい、
上手くカウントアップできません。原因はどこでしょうか?
storeを別ファイルに分割するのは初めてなのでそこで上手くいっていないのだと思うのですが。。。
作っているのは単純なカウントアップのアプリです。

エラー詳細(ブラウザコンソール)

shell

1[Vue warn]: Property or method "countUp" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. 2 3found in 4 5---> <Btn> at src/components/Btn.vue 6 <Counter> at src/components/Counter.vue 7 <VApp> 8 <App> at src/App.vue 9 <Root>

shell

1./src/ 2├── App.vue 3├── assets 4│   └── logo.png 5├── components 6│   ├── Btn.vue 7│   ├── Counter.vue 8│   └── Lbl.vue 9├── main.js 10├── router 11│   └── index.js 12└── store 13 ├── index.js 14 └── modules 15 └── counter.js

store/index.js

js

1// store/index.js 2import Vue from 'vue' 3import Vuex from 'vuex' 4import {counter} from './modules/counter' 5 6Vue.use(Vuex) 7 8export default new Vuex.Store({ 9 modules: { 10 counter 11 } 12})

store/modules/counter.js

js

1export const counter = { 2 namespaced: true, 3 state: { 4 count: 0 5 }, 6 mutations: { 7 countUp (state) { 8 state.count += 1 9 } 10 }, 11 actions: { 12 countUp () { 13 this.commit('countUp') 14 } 15 } 16}

components/Btn.vue

vue

1<template> 2 <input 3 type="button" 4 value="+1" 5 @click="countUp()" 6 /> 7</template> 8 9<script> 10import {mapActions} from 'vuex' 11 12export default { 13 name: 'Btn', 14 data () { 15 return { 16 } 17 }, 18 computed: { 19 counter: function () { 20 return this.$store.state.counter 21 } 22 }, 23 methods: { 24 ...mapActions([ 25 'counter/countUp' 26 ]) 27 } 28} 29</script> 30 31<style> 32 33</style>

components/Lbl.vue

vue

1<template> 2 <p>{{count}}</p> 3</template> 4 5<script> 6 7import {mapState} from 'vuex' 8 9export default { 10 name: 'Lbl', 11 computed: { 12 ...mapState({ 13 count: state => state.counter.count 14 }) 15 } 16} 17</script> 18 19<style> 20 21</style>

components/Counter.vue

vue

1<template> 2 <div> 3 <p>counter</p> 4 <btn /> 5 <lbl /> 6 </div> 7</template> 8 9<script> 10import Btn from './Btn' 11import Lbl from './Lbl' 12export default { 13 name: 'Counter', 14 components: { 15 Btn, 16 Lbl 17 } 18} 19</script> 20 21<style> 22</style>

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

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

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

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

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

guest

回答2

0

ベストアンサー

moduleのnamespaceをtrueにしているので、もちろんアクションにもnamespaceがつきます。
なので、mapActionsでアクションをそのまま展開した際には、インラインで記述すると長ったらしくなります

vue

1<input @click="()=>this['counter/countUp']()" />

mapActionsを呼ぶ時に、第一引数にnamespaceを入れてあげると、素直な関数名で定義されます
第二引数をオブジェクトで渡すと関数名を変更することもできます

vue

1<input @click="countUp" /> 2 3methods: { 4 ...mapActions('counter', ['countUp']), 5},

vue

1<input @click="counterCountUp" /> 2 3methods: { 4 ...mapActions('counter', { 5 counterCountUp: 'countUp', 6 }), 7},

ここら辺を見つけられるとよかったですね
頑張ってください
https://vuex.vuejs.org/ja/guide/modules.html

投稿2019/01/22 10:19

teng

総合スコア127

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

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

_Victorique__

2019/01/23 01:40

回答有難うございます。名前空間の指定は知っていました! もし複数のstoreから呼び出したい時はどのような記述をすれば良いのでしょうか? mapActionsを2回書くことは可能でしょうか?そもそもそういう状況になることはないのでしょうか?
_Victorique__

2019/01/23 01:50

ここで作成したボタンを別々の目的(別のAPIを叩く)に使うとなった時に使い回す方法はないのでしょうか?それとも目的に合わせて別々のボタンとして実装するのが普通でしょうか? 使い回しができるというのはこの場合には当てはまりませんか?
guest

0

Btn.vueのコードを少し弄ったら解決しました。
ですが、mapActionsを使う方法はないのでしょうか?
この書き方はなんだかスマートじゃなく感じてしまいます。これが普通でしょうか?

vue

1<template> 2 <input 3 type="button" 4 value="+1" 5 @click="countUp()" 6 /> 7</template> 8 9<script> 10import {mapActions} from 'vuex' 11 12export default { 13 name: 'Btn', 14 data () { 15 return { 16 } 17 }, 18 computed: { 19 counter: function () { 20 return this.$store.state.counter 21 } 22 }, 23 methods: { 24 // mapActionsを使わない 25 // ...mapActions([ 26 // 'counter/countUp' 27 // ]) 28 29 // 代わりにこっち 30 countUp () { 31 this.$store.dispatch('counter/countUp') 32 } 33 } 34} 35</script> 36 37<style> 38 39</style>

投稿2019/01/22 09:47

_Victorique__

総合スコア1392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問