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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3978閲覧

1つのインスタンスを複数のコンポーネント間で共有したい

workr

総合スコア158

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/04/10 10:49

Vue.js を利用したウェブサイトで Ajax 処理を行うための独自のクラスを使い、複数の vue コンポーネントから利用しようと思っています。認証処理を1度だけ行い、API から情報を取得したり書き込んだりするたびに認証を受けなくても済むようにするためです。

javascript

1var url = "api.example.com"; 2var api = new ApiClient(url, "user", "secret"); 3var post = api.fetch('/post/1234');

親コンポーネントの<script>部分で上記のように var で宣言しただけでは子コンポーネントからはエラーとなります。(api is not defined)

グローバル変数にするなら window.api = new ApiClient(url) とすればとりあえず共有できました。簡単ですが綺麗ではないような感じがします。

Vue.js のコンポーネントには data, props などの格納できる領域があるので <component :api="api"> のような形で一つ一つ渡したりもできそうですが手間がかかりすぎるように思えます。

親コンポーネントに getApiInstance() などのメソッドを用意して、方法は知りませんが子からそのメソッドを通して受け取ることもできるのかもしれません。

Vuex という状態管理のためのライブラリがあるようなのでこちらも利用できそうです。

Vue.js を経験が浅いため常識をよく知らないのですが、こういったクラスオブジェクトを複数の子コンポーネントで利用するにはどういった手段を取るのが最も適切なのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

stack overflowの回答をもとに2つのアプローチがありそうです。
stack overflow

1つ目はprototype継承を使うもので、コチラのほうがどちらかといえば目にする機会が多いです。

var url = "api.example.com"; var api = new ApiClient(url, "user", "secret"); Vue.prototype.$api = api; var app = new Vue({ el: "#app" })

そうすればVue内では、どこでもthis.$apiで使えます。

export default { ... methods: { fetchSomething() { this.$api.fetch("/hoge") } } ... }

もう一つの方法はGlobal Mixinとする方法だそうです。
コチラで書かれているコードはあまり見かけませんが、絶対に変更できなくすることができます。

// This is a global mixin, it is applied to every vue instance Vue.mixin({ data: function() { return { get api() { var url = "api.example.com"; return new ApiClient(url, "user", "secret"); } } } }) new Vue({ el: '#app', created: function() { this.api = "代入しようとしても入りません。"; } });

投稿2018/04/10 13:19

sakapun

総合スコア888

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問