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

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

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

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

Vue.js

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

2918閲覧

vue-cli3.0 typescript electronで作ったデスクトップアプリでvuex storeがエラーを出す

退会済みユーザー

退会済みユーザー

総合スコア0

Electron

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

Vue.js

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2018/06/13 09:51

編集2018/06/14 04:28

https://alligator.io/vuejs/using-new-vue-cli-3/

↑vue-cli3.0 で環境を構築しました

https://github.com/nklayman/vue-cli-plugin-electron-builder

↑エレクトロンビルダーを入れてデスクトップアプリ化しました

ブラウザでは正しく動いていたvuexがデスクトップアプリではうまく動きませんでした

typescript

1 2//store.ts 3 4import Vue from 'vue'; 5import Vuex from 'vuex'; 6 7Vue.use(Vuex); 8 9export default new Vuex.Store({ 10 state: { 11 myName: "二千花" 12 }, 13 mutations: { 14 'CHANGE_NAME'(state, newName) { 15 state.myName = newName 16 }, 17 }, 18 actions: { 19 'CHANGE_NAME'({ commit }, newName) { 20 if(newName != "名前変更"){ 21 commit('CHANGE_NAME', newName) 22 } 23 } 24 }, 25 getters:{ 26 'GET_MY_NAME': state => { return state.myName } 27 } 28}); 29

typescript

1 2//main.ts 3 4import Vue from 'vue'; 5import App from './App.vue'; 6import router from './router'; 7import store from './store'; 8 9Vue.config.productionTip = false; 10 11new Vue({ 12 router, 13 store, 14 render: (h) => h(App), 15}).$mount('#app'); 16

typescript

1 2//単一ファイルコンポーネント(.vue) 3 4<template> 5 <div class="createNew"> 6 <div class="vuexData"> 7 8 <span>vuexで共通しているデータ→</span> 9 10 <span>{{ getName() }}</span> 11 12 <input type="text" v-model="text"/> 13 14 <button @click="changeData">変更</button> 15 16 </div> 17 </div> 18</template> 19 20<script lang="ts"> 21import { Component, Vue } from 'vue-property-decorator'; 22 23@Component({ 24 components: { 25 }, 26}) 27export default class createNew extends Vue { 28 29 private text = "名前変更" 30 31 private getName(){ 32 return this.$store.getters.GET_MY_NAME 33 } 34 35 private changeData(){ 36 this.$store.dispatch("CHANGE_NAME", this.text); 37 } 38} 39</script> 40

最後の単一ファイルコンポーネントはrouter.tsの方に登録してあります

ブラウザでは上記コードでstoreにアクセス・変更などできていたのですが

npm run serve:electron

でデスクトップアプリを見ると

Cannot read property 'getters' of undefined"

などと言われてしまいます

typescript

1//main.ts 2 3global.vo = new Vue({ 4 router, 5 store, 6 render: (h) => h(App), 7}) 8 9vo.$mount('#app'); 10

typescript

1//単一ファイルコンポーネント(.vue) 2 3private getName(){ 4 return vo.$store.getters.GET_MY_NAME 5 //return "あ" 6 } 7 8 private changeData(){ 9 vo.$store.dispatch("CHANGE_NAME", this.text); 10 //alert("あ") 11 }

このようにするとちゃんと動くのですが、ストアにアクセスするたびに

[Vue warn]: $attrs is readonly.

というエラーが吐かれてしまいます
(エラーを吐くのですが動きます)

どのように解決すればいいでしょうか
教えてください(T_T)

--------------------追記--------------------

イメージ説明

npm run serveで見ると、thisは$storeを持っているのに、electronでビルドするとthisはstoreを持っていません

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

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

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

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

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

guest

回答1

0

ベストアンサー

コンポーネントの getName メソッドに get を付けて computed プロパティにしてみてはいかがでしょう?

javascript

1get getName(){ 2 return this.$store.getters.GET_MY_NAME 3}

投稿2018/06/13 14:12

yhg

総合スコア2161

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

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

退会済みユーザー

退会済みユーザー

2018/06/14 02:43 編集

回答ありがとうございます getをつけてやっても、 return this.$store.getters.GET_MY_NAME の場合、 return vo.$store.getters.GET_MY_NAME の場合、 それぞれで前回と同様のエラーが出てしまいます,,,
yhg

2018/06/14 15:09

ローカルに環境構築して調べてみたところ、<script> セクションを書いたコンポーネントだけ Vuex の $store に値を入れる Mixin が正常に適用されず、this.$store が undefined になってしまうようです。<script> セクションを消してみたら $store に値が入りました。 そこで、TypeScript ではなく JavaScript で <script> セクションを記述してみたところ、正常に動きました。ビルダーが最終的に吐く Webpack の設定に TypeScript 関連の不具合がありそうですね…。 大きな変更のあった vue-loader v15 もリリースされて間もないですし、 vue-cli v3.0 も昨日RC版になったところなので、ビルド関連が安定するまでもうしばらくかかりそうな気がします。 <script> export default { data() { return { text: '名前変更' }; }, computed: { getName() { return this.$store.getters.GET_MY_NAME; } }, methods: { changeData(){ this.$store.dispatch('CHANGE_NAME', this.text); } } } </script>
退会済みユーザー

退会済みユーザー

2018/06/15 02:35

環境構築、再現までしてくださり、本当に本当にありがとうございます(T_T) わかりました、javascriptの書き方に一旦変更してみるか、デスクトップアプリ化の方法を他に模索するかもしれません...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問