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

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

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

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

Nuxt.js

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

Q&A

解決済

1回答

5071閲覧

Nuxt.jsでVuexのStateを参照できない

w2-yamaguchi

総合スコア167

Vue.js

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

Nuxt.js

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

0グッド

0クリップ

投稿2018/07/31 04:44

前提・実現したいこと

Nuxt.js + Vuexを利用したWebページを作成しています。
ドロワーメニューの表示/非表示をVuexのStateで状態を管理したいです。
pages/index.vueでStateを参照しようとすると、定義されていないとエラーが出てしまいました。

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

Cannot read property 'state' of undefined

該当のソースコード

pages/index.vue

Javascript

1<template> 2 <div class="page-container md-layout-column"> 3 <md-toolbar class="md-primary"> 4 <md-button class="md-icon-button" @click="toggleMenu"> 5 <md-icon>menu</md-icon> 6 </md-button> 7 <span class="md-title">Test</span> 8 </md-toolbar> 9 10 <md-drawer :md-active.sync="showNavigation"> 11 <md-toolbar class="md-transparent" md-elevation="0"> 12 Test 13 </md-toolbar> 14 15 <md-list> 16 <md-list-item> 17 <md-icon>info</md-icon> 18 <span class="md-list-item-text">Info</span> 19 </md-list-item> 20 </md-list> 21 </md-drawer> 22 </div> 23</template> 24 25<script> 26import { mapMutations, mapState } from 'vuex' 27 28export default { 29 methods: { 30 ...mapMutations({ 31 toggleMenu: 'toggleMenu' 32 }) 33 }, 34 computed: { 35 ...mapState({ 36 showNavigation: 'showNavigation' 37 }) 38 } 39} 40</script>

store/index.js

javascript

1const store = () => new Vuex.Store({ 2 3 state: { 4 showNavigation: false, 5 loading: false 6 }, 7 mutations: { 8 toggleMenu (state) { 9 state.showNavigation = !state.showNavigation 10 } 11 } 12 13})

試したこと

Nuxt.jsのガイド「Vuex ストア」を確認し、<template>内でStateを参照するようにしましたが、状況は変わりませんでした。
https://ja.nuxtjs.org/guide/vuex-store/

<md-button class="md-icon-button" @click="$store.commit('toggleMenu')"> <md-drawer :md-active.sync="$store.state.showNavigation">

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

node: 8.9.1

package.json

json

1 "dependencies": { 2 "nuxt": "^1.0.0", 3 "nuxt-vue-material": "^1.1.0" 4 }, 5 "devDependencies": { 6 "babel-eslint": "^8.2.1", 7 "eslint": "^4.15.0", 8 "eslint-friendly-formatter": "^3.0.0", 9 "eslint-loader": "^1.7.1", 10 "eslint-plugin-vue": "^4.0.0", 11 "node-sass": "^4.9.2", 12 "sass-loader": "^7.0.3" 13 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

vue

1<md-drawer :md-active.sync="showNavigation">

この部分が不味いです。.sync 修飾子は v-model のようなもので、update メッセージが子コンポーネントから送られてくると、自動で親が該当プロパティの値を更新するというものです。

一方 showNavigation は computed なプロパティとして定義されてますので、直接値を入れることはできません。
なので、親側に data としてプロパティを持たせて、それを :md-active.sync に渡さなければなりません。Vuex との連携は、ウォッチャを上手く使いましょう。

投稿2018/07/31 05:35

yhg

総合スコア2161

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

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

w2-yamaguchi

2018/07/31 06:15

回答ありがとうございます! 以下について、詳しく教えていただけないでしょうか。 > Vuex との連携は、ウォッチャを上手く使いましょう。 また、以下の通り実装してみると、想定通りの挙動をしました。 あまりよろしくない実装なのでしょうか? ``` methods: { ...mapMutations({ toggleMenu: 'toggleMenu' }) }, computed: { showNavigation: { get () { return this.$store.state.showNavigation }, set () { this.toggleMenu() } } } ```
yhg

2018/07/31 06:19

あ、その方法ならバッチリですね! set/get あまり使わないので思いつきませんでした。
w2-yamaguchi

2018/07/31 07:32

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問