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

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

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

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Vue.js

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

847閲覧

electron+vueで自動作成したアプリのstore参照

menshan

総合スコア54

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Vue.js

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

2クリップ

投稿2018/01/07 10:49

node.js、electron、vue、vue-cli をインストール後以下のコマンドでプロジェクトを自動作成します。
vue init simulatedgreg/electron-vue my-project
出来上がったプロジェクトは store がデフォルトで作成されていますが、この内容(Counter.jsのmainの値)をmain.jsで参照す るにはどのようにしたら良いのでしょうか?
以下の★のところでエラーが発生してしまいます。
main.js 以外はデフォルトのコードのままです。
最終的にはmain.js以外からも参照したいのですがとりあえずmain.jsからと思い色々試しています。

src/renderer/main.js

js

1import store from './store' 2// ・・・中略・・・ 3// 元は無かったコード(begin) 4var ap = 5// 元は無かったコード(end) 6new Vue({ 7 components: { App }, 8 router, 9 store, 10 template: '<App/>' 11}).$mount('#app') 12 13// 元は無かったコード(begin) 14console.log('ap=' + ap.$store) 15for (var item in ap.$store.modules) { console.log(item) } 16console.log('ap=' + ap.$store.modules.Counter.state) // ★ 17// ここでエラー: 18// Uncaught TypeError: Cannot read property 'Counter' of undefined 19// 元は無かったコード(end) 20

src/renderer/store/index.jp

js

1import Vue from 'vue' 2import Vuex from 'vuex' 3 4import modules from './modules' 5 6Vue.use(Vuex) 7 8export default new Vuex.Store({ 9 modules, 10 strict: process.env.NODE_ENV !== 'production' 11})

src/renderer/store/modules/index.js

js

1const files = require.context('.', false, /.js$/) 2const modules = {} 3 4files.keys().forEach(key => { 5 if (key === './index.js') return 6 modules[key.replace(/(./|.js)/g, '')] = files(key).default 7}) 8 9export default modules

src/renderer/store/modules/Counter.js

js

1const state = { 2 main: 0 3} 4 5const mutations = { 6 DECREMENT_MAIN_COUNTER (state) { 7 state.main-- 8 }, 9 INCREMENT_MAIN_COUNTER (state) { 10 state.main++ 11 } 12} 13 14const actions = { 15 someAsyncTask ({ commit }) { 16 // do something async 17 commit('INCREMENT_MAIN_COUNTER') 18 } 19} 20 21export default { 22 state, 23 mutations, 24 actions 25}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vuexのstoreのmoduleを使った場合、
モジュール内のstateには、store.state.モジュール名.アクセスしたいプロパティ名でアクセス出来ます。
今回の場合では、ap.$store.state.Counter.mainとなるかと思います。
https://vuex.vuejs.org/ja/modules.html

モジュール名は、Storeの初期化を行う時に渡されるmodulesオブジェクトによって決まります。
今回は、src/renderer/store/modules/index.jsが、
src/renderer/store/modulesディレクトリ配下の全てのスクリプト(.jsファイル)を読み込み、
各スクリプトのファイル名から.jsだけ取り除いてモジュール名として設定しているので、
上記のように、Counterというモジュール名でアクセス出来るようになっています。

投稿2018/01/08 02:12

編集2018/01/08 02:12
syumai

総合スコア83

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

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

menshan

2018/01/08 05:01

ご回答ありがとうございます。教えて頂いた「store.state.モジュール名.アクセスしたいプロパティ名」でアクセスできました。 一歩進んで main.js 以外の別ソースから console.log('store=' + this.$store) と参照していますが undefined で参照できません。 どのサイトを見ても this.$store で参照可能とあるのですが、何か不足しているコードがあるのでしょうか?
syumai

2018/01/08 05:34

Vuexでthis.$storeが呼べるようになるのは、storeの注入されたVueインスタンスの中からだけです。 例えば、子コンポーネントの`computed`や、`methods`の中からは呼ぶことが出来ます。 コンポーネントの宣言の外で使いたい場合は、先ほどのようにVueインスタンスを変数に代入して、`ap.$store.state ...`と言った形で呼ぶ必要があります。 https://vuex.vuejs.org/ja/state.html Vuexに関しては、素晴らしい日本語の公式ドキュメントがありますので、他のサイトをご覧になる前にぜひ読んでみてください。 https://vuex.vuejs.org/ja/
menshan

2018/01/08 10:09

ご丁寧な回答ありがとうございます。 確かにおっしゃるとおり xxx.vue の先頭とかで console.log('store=' + this.$store) と参照しても this.$store がまだ出来ていないらしく参照できませんでした。 いろいろ調べると router で画面遷移するタイプのアプリだとこの this.$store がまだ出来ていない現象が起こる様です。 回避策として vuex-router-sync というモジュールがありこれを使うと vue ファイル内で カウンタ={{this.$store.state.Counter.main}} の様に参照しても大丈夫でした。 具体的な方法としては、コンソール上で npm install vuex-router-sync でモジュールをインストール後 main.js に以下の3行を追加するだけです。 −−−−−−−−−−−−−−−−−−−− import Vue from 'vue' import axios from 'axios' import App from './App' import router from './router' import store from './store' // 追加(begin) import { sync } from 'vuex-router-sync' const unsync = sync(store, router) unsync() // 追加(end) if (!process.env.IS_WEB) Vue.use(require('vue-electron')) ・・・以下省略・・・
syumai

2018/01/08 14:12

なるほど、vue-routerに起因する問題だったのですね!補足いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問