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

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

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

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

Q&A

解決済

1回答

4820閲覧

VueでVue外部からデータ・イベントをやり取りする方法

Fushihara

総合スコア52

Vue.js

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

0グッド

0クリップ

投稿2019/02/05 07:44

Vueを使ってデータの一覧を表示するページを作っています。以下のことをしたいのですが、どうすればよろしいでしょうか。

  • 1.Vueの外から初期値を渡したい
  • 2.Vueの外から、Vueコンポーネント内のメソッドを叩きたい。メソッドを直接指定するか、emitする方法かどちらかで。
  • 3.Vueの中で発生したイベントを、Vueの外に投げたい。

これはしたくない というポイントは以下の通りです

  • 1.以下のindex.htmlは書き換えたくない
  • 2.特に、<div id="app"></div>の部分。htmlファイルは、中身が空で決まったidのエレメントを置くだけで、エレメントの中にデータ定義を書いて…という事はしたくないです。

今の自分のコードは以下のような構造です。

index.html

html

1<div id="app"></div> 2<script> 3// サーバが側からデータが出力される。サーバ側はこんな感じ 4// const serverSideData = <?php print(json_encode($data)); ?>; 5const serverSideData = [{id:1,data:xxxx},{id:2,data:yyyy}]; 6</script> 7<script type="text/javascript" src="/index.js"></script></body>
index.ts

ts

1import Vue from 'vue' 2import App from './App.vue' 3const vue = new Vue({ 4 render: h => h(App), 5 el:"#app", 6});
App.vue

vue

1<template> 2 <div id="app"><span>「{{serverSideData}}」</span></div> 3</template> 4<script lang="ts"> 5import Vue from "vue"; 6export default Vue.extend({ 7 name: "app", 8 data: () => ({}), 9 mounted: function() {}, 10 methods: { 11 test_func: function() {}, 12 }, 13}); 14</script> 15<style lang="scss" scoped> 16//略 17</style> 18

こう書きたい

上記の中のindex.ts の中で、データを指定したりイベントを定義したいです。イメージとしてはこんな感じ

ts

1import Vue from 'vue' 2import App from './App.vue' 3const vue = new Vue({ 4 render: h => h(App), 5 el:"#app", 6 data:{serverSideData}//ここでサーバからのデータをVueコンポーネントに渡して、App.vueの中で使いたい 7}); 8vue.$emit("add-new-data",xxxxx);// Vueの外から、App.vueの中のメソッドを叩きたい 9vue.$on("data-registerd",()=>{alert("データが登録できました")});//逆に、Vueの中で発生したイベントをVueの外でキャッチしたい

最後のindex.tsのような書き方を実現する為に、App.vueファイルの中をどう書き換えればよいでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

サーバーサイドのデータを window.serverSideData に格納、 EventBus を使って Vue と外部で連携すると良いと思います。

html

1<!-- index.html --> 2<script> 3window.serverSideData = ... 4</script>

typescript

1// eventbus.ts 2import Vue from 'vue' 3 4export default new Vue()

vue

1<!-- -App.vue -> 2<template> 3 <div id="app"><span>「{{serverSideData}}」</span></div> 4</template> 5<script lang="ts"> 6import Vue from "vue" 7import eventBus from './eventbus' 8 9export default Vue.extend({ 10 name: "app", 11 data: () => ({}), 12 created: function() { 13 eventBus.$on('add-new-data', () => { 14 this.test_func() 15 }) 16 }, 17 mounted: function() {}, 18 methods: { 19 test_func: function(data) { 20 eventBus.$emit('data-registerd') 21 }, 22 }, 23}) 24</script> 25<style lang="scss" scoped> 26//略 27</style>

typescript

1// index.ts 2import Vue from 'vue' 3import App from './App.vue' 4import eventBus from './eventbus' 5 6const vue = new Vue({ 7 render: h => h(App), 8 el:"#app", 9 data:{ ...window.serverSideData } 10}) 11 12eventBus.$on("data-registerd",()=>{alert("データが登録できました")}) 13eventBus.$emit("add-new-data",xxxxx)

投稿2019/02/05 11:15

yhg

総合スコア2161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問