# 沒有 webpack 打造 vue loader 環境
引入
vue和axios的 cdn<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>1
2在
index.html實作 vue 的入口點<div id="app"> <h1>{{ msg }}</h1> <my-component></my-component> </div>1
2
3
4new Vue({ data() { return { msg: 'Hello World', }; }, }).$mount('#app');1
2
3
4
5
6
7新增
component.js,用於註冊全局的組件// 使用 axios 將 template 引入 axios({ method: 'get', url: '/src/templates/component.html', responseType: 'text', }).then((res) => { Vue.component('MyComponent', { template: res.data, data() { return { msg: 'Hello My Component', }; }, }); });1
2
3
4
5
6
7
8
9
10
11
12
13
14
15新增
component.html為MyComponent組件的template<div class="component"> <p>{{ msg }}</p> </div>1
2
3透過 XHR 將
component.js引入index.html中<script src="./scripts/component.js"></script>1
這時會發現畫面只有 Hello World 的字串,但 <my-component> 沒有顯示。
原因在於 component.js 當中,因為是使用 XHR 的方式來讀取樣版檔案。所以,當 App 在啟動的時候,XHR 可能還在讀取,所以這個時候,my-component 其實並沒有在 Vue 的全域組件當中。
我們必須要先確保樣版檔案已經讀取進來了,才能將 App 啟動。這個時候,我們可以利用 Vue 自身,製作一個 EventBus 來當作監聽工具。
打開一個監聽接口,叫做
componentLoaded,代表組件被讀取進來了window.EventBus = new Vue(); window.EventBus.$on('componentLoaded', () => { new Vue({ data() { return { msg: 'Hello World', }; }, }).$mount('#app'); });1
2
3
4
5
6
7
8
9
10在
component.js中,等組件都載入成功後,才觸發監聽接口,這個時候才將 Vue App 做初始化啟動axios({ ... }).then(function (res) { // 註冊組件 window.EventBus.$emit('componentLoaded'); });1
2
3
4
5
6
提醒
如果有很多組件或巢狀組件的時候該怎麼辦?
Promise.all 是你的好伙伴。