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

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

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

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

Nuxt.js

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

Q&A

解決済

1回答

2685閲覧

モジュールモードでstoreのactionsに引数の渡し方

laravel5

総合スコア32

Vue.js

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

Nuxt.js

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

0グッド

0クリップ

投稿2019/08/30 06:29

nuxt.js(SSR) モジュールモードでstoreのactionsの引数の渡し方

/store/test.js

export const state = () => { return { test: "" }; }; export const getters = { getTest(state) { return state.test; } } export const mutations = { setTest(state, data) { state.test = data; } } export const actions = namespace => { return { async getTest({commit, dispatch, rootState, state}, payload) { const {data} = await this.$axios.get( `test/${namespace}/tests` ); commit("setTest", data); } } } export default namespace => { return { namespaced: true, state, getters, mutations, actions: actions(namespace) }; };

/store/index.js

import testModule from './test.js'; export const actions = { async nuxtServerInit({ state, commit, dispatch }){ await Promise.all([ dispatch("auth/check") ]); }, nuxtClientInit({ dispatch }) { testModule("default") } };

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

Nuxt.jsの3系から、classicモードが廃止されるため、
現在、nuxt.jsのstore内部をclassic modeから
module modeに書き換える作業を行なっております。
上記の形式でclassicモードでは動いていたのですが、
moduleモードに書き換えると
他のコンポーネントやvueファイル等からgetterを呼び出したりすると
下記のエラーが発生します。
actions、mutations、も同様に他から呼び出そうとするとエラーが発生します。

良い書き換え方法をご存知の方おられたら、ご教授して頂けませんでしょうか?

エラーメッセージ ERROR [vuex] unknown getter: test/getTest

補足情報(FW/ツールのバージョンなど)

Nuxt.js 2.9.1

Vue.js 3.8.4

SSRモード

storeはclassicモードからmoduleモード書き換え最中

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

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

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

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

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

guest

回答1

0

ベストアンサー

モジュールモードで使われない手法がいくつかあるようですので、それらを解消することで問題は解決するかと思われます。

モジュールモードではstoreディレクトリ内のすべての*.jsファイルが名前空間付きモジュールに自動変換されますので「store/index.js」にインポートで名前空間付きモジュールをインポートして何か処理をする必要はありません。

/store/index.js

diff

1 2-import testModule from './test.js'; 3- 4export const actions = { 5 async nuxtServerInit({ state, commit, dispatch }){ 6 await Promise.all([ 7 dispatch("auth/check") 8 ]); 9 }, 10 nuxtClientInit({ dispatch }) { 11- testModule("default") 12+ dispatch('test/getTest', 'default') 13 } 14};

名前空間付きモジュール側ですが、デフォルトエクスポートは不要です。
ミューテーション、アクションはオブジェクトとする必要があるため、アクション部分は以下のように書き換えたほうがよろしいかと思います。

/store/test.js

diff

1-export const actions = namespace => { 2- return { 3- async getTest({commit, dispatch, rootState, state}, payload) { 4- const {data} = await this.$axios.get( 5- `test/${namespace}/tests` 6- ); 7- commit("setTest", data); 8- } 9- } 10-} 11+export const actions = { 12+ async getTest({commit}, payload) { 13+ const {data} = await this.$axios.get( 14+ `test/${payload}/tests` 15+ ); 16+ commit("setTest", data); 17+ } 18+} 19-export default namespace => { 20- return { 21- namespaced: true, 22- state, 23- getters, 24- mutations, 25- actions: actions(namespace) 26- }; 27-};

投稿2019/08/30 09:36

nt4c

総合スコア768

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

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

laravel5

2019/09/02 00:20

やはり、上記の形式にしか記述できないのですね! ありがとう御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問