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

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

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

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

JavaScript

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

Q&A

解決済

2回答

8868閲覧

Vue3でグローバル変数を使う方法を教えてください。

KOTTON

総合スコア47

Vue.js

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

JavaScript

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

0グッド

1クリップ

投稿2021/08/15 20:17

前提

Vue初心者です。
Vue3 のcomposition APIを使っています。

質問

Vue3で、とあるbool値をいろんなコンポーネントから参照したり変更したいため、グローバル変数を作ってそこにboolを保存しておきたいです。

調べた結果

調べた結果、globalPropertiesというのを使うと書いてありました。

なので、main.jsに以下のように書きました。

js

1import { ref } from 'vue 2 3const app = createApp(App) 4// 諸々省略 5app.config.globalProperties.globalBool = ref(false) 6app.use(router).mount('#app'

ただ、これはOption APIで使うことを想定されているらしく、composition APIからこの変数に触れることはできないようでした。

なので、仕方なく以下のようにしてみましたが、setup関数内からmethodsの関数を叩くのは不可能らしいです。

js

1setup(){ 2 const handleClick() { //クリックハンドラ 3 CheckGlobalBool() //エラー: 定義されてません 4 } 5}, 6method: { 7 CheckGlobalBool() { 8 console.log(this.globalBool) 9 } 10}

行き詰った

こういう経緯で行き詰りました。
グローバル変数を使いたい場合どのようにするのがいいのか、わかりやすく教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

なので、仕方なく以下のようにしてみましたが、setup関数内からmethodsの関数を叩くのは不可能らしいです。

クロージャーに関して自分で調べてみてください。
ReactやVueなどを始めとしたフレームワーク?はクロージャーって機能が根幹を成しています。

■ 本題
Vueの中でのグローバルという意味なのか、ブラウザの中でのグローバルという意味中存じ上げませんが…

  1. Vueの中のグローバル関数であれば、mixinを使いましょう
  2. ブラウザ全体(consoleで直接値を参照したいなど…)であれば、window.変数名 = 値と代入すればブラウザ全体での参照が可能です。

とあるbool値をいろんなコンポーネントから参照したり変更したいため、グローバル変数を作ってそこにboolを保存しておきたいです。

これを行いたいなら、状態管理(Vuexなど)しましょう。
mixinを使うとどこに書かれた変数なのかが分からなくなるので、後のメンテナンスを考慮し、状態管理した方がいいです。

投稿2021/08/16 03:03

Nero1129

総合スコア130

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

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

KOTTON

2021/08/16 06:33

ありがとうございます。 ブラウザを更新しても変数の値が保持されるのが望ましかったのですが、localStorageというのを使えばそれを実現できました。(Vuexは更新すると消えるらしいので) またもう一つ質問なのですが、例えばjsファイルにグローバルスコープで変数を作って、それをエクスポートしてVueコンポーネントから参照するのは、Vuexの状態管理と得られる効果は似たようなものですかね?もちろん管理の面などでVuexが優れているのであろうことは分かるので、必要な場合はVuexを使おうと思いますが、これは単純に興味です!
Nero1129

2021/08/16 12:15

Vuexを永続化したいのであれば、こちらを参照してみてください。 今よりは楽に状態管理できると思います。 https://qiita.com/chenglin/items/0fd9baf386227a5ca614 http://codesandbox.io/ codesandboxで気軽にVueの環境構築をして、検証が出来るので行ってみるといいと思います。検証がめんどくさいは同感ですが、百聞は一見に如かずなので、自分でいろいろ触って、壊してみましょう。理解が深まります。 exportは単に変数宣言しているだけだと認識してもあながち間違いではないと思います。 状態管理はAをBに変更したときに、Bの状態を保持することなので、exportはいくら参照してもAでしかありません。それ故に、状態管理とは意味合いが違います。 P.S. 厳密にはニュアンスが違うので鵜の意味にはせず、理解するための助言程度の留めておいてください。
guest

0

投稿2021/08/16 02:46

shiketa

総合スコア3990

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

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

KOTTON

2021/08/16 06:33

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問