成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Vue.js學(xué)習(xí)

TIGERB / 2412人閱讀

摘要:一基礎(chǔ)學(xué)習(xí)模式下圖不僅概括了模式,還描述了在中是如何和以及進(jìn)行交互的。關(guān)于這一點(diǎn)我們將在后續(xù)反應(yīng)系統(tǒng)中討論。父組件通過(guò)向下傳遞數(shù)據(jù)給子組件,子組件通過(guò)給父組件發(fā)送消息。這個(gè)對(duì)象必須是普通對(duì)象原生對(duì)象,及原型屬性會(huì)被忽略。

Vue.js 是用于構(gòu)建交互式的 Web 界面的庫(kù)。
Vue.js 提供了 MVVM 數(shù)據(jù)綁定和一個(gè)可組合的組件系統(tǒng),具有簡(jiǎn)單、靈活的 API。

其實(shí)和Jquery一樣,VueJs就是一個(gè)Js庫(kù),但是是面向前端的庫(kù),具體來(lái)講叫做MVVM(Model-View-ViewModel)庫(kù).
也就是說(shuō),有部分功能和Jquery是差不多的,Vuejs能做的,Jquery也能做。這下我們就放心了,Jquery多簡(jiǎn)單啊,令人發(fā)指的是Vuejs在實(shí)現(xiàn)相同功能的時(shí)候更簡(jiǎn)單(不然用你干嘛啊);

理解Vuejs最關(guān)鍵的一句話(huà)叫做“數(shù)據(jù)驅(qū)動(dòng)視圖”,比如用Jquery來(lái)做一個(gè)列表,這個(gè)列表的數(shù)據(jù)是從Laravel來(lái)的,那么我們要遍歷這個(gè)數(shù)據(jù),然后把列表的html元素加到dom里面去, 要?jiǎng)h除一個(gè)列表項(xiàng)的時(shí)候,先要在找到列表項(xiàng)在dom的位置,然后去除這個(gè)節(jié)點(diǎn)。Vuejs不用,數(shù)據(jù)在的時(shí)候,列表就在,數(shù)據(jù)減一,列表項(xiàng)就自動(dòng)實(shí)時(shí)相應(yīng)減一。也就是說(shuō),你只要操作數(shù)據(jù)就夠了,不用管dom。這基本就是Vuejs的中心思想。

一、基礎(chǔ)學(xué)習(xí) 1.MVVM模式

下圖不僅概括了MVVM模式(Model-View-ViewModel),還描述了在Vue.js中ViewModel是如何和View以及Model進(jìn)行交互的。

ViewModel是Vue.js的核心,它是一個(gè)Vue實(shí)例。Vue實(shí)例是作用于某一個(gè)HTML元素上的,這個(gè)元素可以是HTML的body元素,也可以是指定了id的某個(gè)元素。

當(dāng)創(chuàng)建了ViewModel后,雙向綁定是如何達(dá)成的呢?

首先,我們將上圖中的DOM Listeners和Data Bindings看作兩個(gè)工具,它們是實(shí)現(xiàn)雙向綁定的關(guān)鍵。
從View側(cè)看,ViewModel中的DOM Listeners工具會(huì)幫我們監(jiān)測(cè)頁(yè)面上DOM元素的變化,如果有變化,則更改Model中的數(shù)據(jù);
從Model側(cè)看,當(dāng)我們更新Model中的數(shù)據(jù)時(shí),Data Bindings工具會(huì)幫我們更新頁(yè)面中的DOM元素。

1.2 Vue基本語(yǔ)法

先來(lái)看一個(gè)簡(jiǎn)單的示例,Hello,World!





Vue學(xué)習(xí)



{{ message }}

示例詳解:

1.2.1 data屬性和方法

每個(gè)Vue實(shí)例都會(huì)代理其data對(duì)象中的所有屬性:

var data = { a: 1 }
var vm = new Vue({
    data: data
})

vm.a === data.a // -> true

// setting the property also affects original data
vm.a = 2
data.a // -> 2

// ... and vice-versa
data.a = 3
vm.a // -> 3

需要注意的是只有代理屬性是反應(yīng)式的,如果在實(shí)例創(chuàng)建之后添加一個(gè)新的屬性到實(shí)例上,將不會(huì)觸發(fā)任何視圖更新。關(guān)于這一點(diǎn)我們將在后續(xù)反應(yīng)系統(tǒng)中討論。

除了數(shù)據(jù)屬性之外,Vue實(shí)例還提供了許多有用的實(shí)例屬性和方法,這些屬性和方法都以$開(kāi)頭以便和代理數(shù)據(jù)屬性進(jìn)行區(qū)分。例如:

var data = { a: 1 }
var vm = new Vue({
    el: "#example",
    data: data
})

vm.$data === data // -> true
vm.$el === document.getElementById("example") // -> true

// $watch is an instance method
vm.$watch("a", function (newVal, oldVal) {
    // this callback will be called when `vm.a` changes
})
1.2.2 實(shí)例生命周期

每個(gè)Vue實(shí)例在創(chuàng)建時(shí)都會(huì)經(jīng)歷一系列實(shí)例化步驟,例如,需要設(shè)置數(shù)據(jù)觀察、編譯模板、以及創(chuàng)建必要的數(shù)據(jù)綁定。在這個(gè)過(guò)程中,還會(huì)調(diào)用生命周期鉤子,從而方便我們執(zhí)行自定義邏輯,例如,created鉤子會(huì)在實(shí)例創(chuàng)建后調(diào)用:

var vm = new Vue({
    data: {
        a: 1
    },
    created: function () {
        // `this` points to the vm instance
        console.log("a is: " + this.a)
    }
})
// -> "a is: 1"

還有一些鉤子會(huì)在實(shí)例生命周期的不同階段調(diào)用,例如compiled、readydestroyed,所有被調(diào)用的生命周期鉤子通過(guò)this指向調(diào)用它的Vue實(shí)例,一些用戶(hù)可能會(huì)疑惑在Vue.js的世界中有沒(méi)有“控制器”的概念,答案是沒(méi)有。組件的自定義邏輯會(huì)被分割到這些生命周期鉤子中。

1.2.3 props 用法

props將數(shù)據(jù)從父作用域傳到子組件。在 Vue.js 中,父子組件的關(guān)系可以總結(jié)為 props down, events up 。父組件通過(guò) props 向下傳遞數(shù)據(jù)給子組件,子組件通過(guò) events 給父組件發(fā)送消息。

Vue.component("todo-item", { props: ["todo"], template: "
  • {{ todo.text }}
  • " }) var app7 = new Vue({ el: "#app-7", data: { groceryList: [ { text: "蔬菜" }, { text: "奶酪" }, { text: "隨便其他什么人吃的東西" } ] } })


    這只是一個(gè)假設(shè)的例子,但是我們已經(jīng)設(shè)法將應(yīng)用分割成了兩個(gè)更小的單元,子單元通過(guò) props 接口實(shí)現(xiàn)了與父單元很好的解耦。我們現(xiàn)在可以進(jìn)一步為我們的 todo-item 組件實(shí)現(xiàn)更復(fù)雜的模板和邏輯的改進(jìn),而不會(huì)影響到父單元。

    組件實(shí)例的作用域是孤立的。這意味著不能(也不應(yīng)該)在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)。要讓子組件使用父組件的數(shù)據(jù),我們需要通過(guò)子組件的props選項(xiàng)。

    子組件要顯式地用props 選項(xiàng)聲明它期待獲得的數(shù)據(jù):

    Vue.component("child", {
      // 聲明 props
      props: ["message"],
      // 就像 data 一樣,prop 可以用在模板內(nèi)
      // 同樣也可以在 vm 實(shí)例中像 “this.message” 這樣使用
      template: "{{ message }}"
    })

    然后我們可以這樣向它傳入一個(gè)普通字符串:

    結(jié)果:

    hello!
    1.2.4 data屬性對(duì)象和函數(shù)返回對(duì)象的區(qū)別

    我們先來(lái)看一下這個(gè)比較經(jīng)典的問(wèn)題,當(dāng)初在學(xué)Vue的時(shí)候也犯過(guò)這樣的迷惑,不知道何時(shí)傳遞data對(duì)象,何時(shí)傳遞data函數(shù) 。Vue.js的data是要一個(gè)對(duì)象還是一個(gè)function?

    Vue 實(shí)例的數(shù)據(jù)對(duì)象。Vue.js 會(huì)遞歸地將它全部屬性轉(zhuǎn)為 getter/setter,從而讓它能響應(yīng)數(shù)據(jù)變化。這個(gè)對(duì)象必須是普通對(duì)象:原生對(duì)象,getter/setter 及原型屬性會(huì)被忽略。不推薦觀察復(fù)雜對(duì)象。

    在實(shí)例創(chuàng)建之后,可以用 vm.$data 訪(fǎng)問(wèn)原始數(shù)據(jù)對(duì)象。Vue 實(shí)例也代理了數(shù)據(jù)對(duì)象所有的屬性。

    在定義組件時(shí),同一定義將創(chuàng)建多個(gè)實(shí)例,此時(shí) data 必須是一個(gè)函數(shù),返回原始數(shù)據(jù)對(duì)象。如果 data 仍然是一個(gè)普通對(duì)象,則所有的實(shí)例將指向同一個(gè)對(duì)象!換成函數(shù)后,每當(dāng)創(chuàng)建一個(gè)實(shí)例時(shí),會(huì)調(diào)用這個(gè)函數(shù),返回一個(gè)新的原始數(shù)據(jù)對(duì)象的副本。

    簡(jiǎn)單說(shuō), 在實(shí)例中data是對(duì)象, 在組件中data就得是函數(shù)返回對(duì)象。

    組件中的data寫(xiě)法示例:

    var data = { counter: 0 } Vue.component("simple-counter", { template: "", // 技術(shù)上 data 的確是一個(gè)函數(shù)了,因此 Vue 不會(huì)警告, // 但是我們返回給每個(gè)組件的實(shí)例的卻引用了同一個(gè)data對(duì)象 data: function () { return data } }) new Vue({ el: "#example-2" })

    由于這三個(gè)組件共享了同一個(gè) data , 因此增加一個(gè) counter 會(huì)影響所有組件!這不對(duì)。我們可以通過(guò)為每個(gè)組件返回全新的 data 對(duì)象來(lái)解決這個(gè)問(wèn)題:

    data: function () {
      return {
        counter: 0
      }
    }

    更多詳情請(qǐng)參考:官網(wǎng)組件數(shù)據(jù)data傳遞說(shuō)明(Component)

    1.2.5 組件寫(xiě)法需注意的幾個(gè)問(wèn)題

    一個(gè)組件下只能有一個(gè)并列的 div,可以這么寫(xiě),所以復(fù)制官網(wǎng)示例的時(shí)候只要復(fù)制 div 里面的內(nèi)容就好。

    但是不能這樣寫(xiě):

    第二。數(shù)據(jù)要寫(xiě)在 return 里面而不是像文檔那樣子寫(xiě)

    錯(cuò)誤的寫(xiě)法:

    組件使用 :
    firstComponent.vue

    
    
    
    
    

    其他Vue問(wèn)題,可以參考該博文:Vue2.0 新手完全填坑攻略——從環(huán)境搭建到發(fā)布

    2.Vue.js的常用指令請(qǐng)參考官方文檔

    Vue官方文檔

    1.v-model,v-for,v-on

    在了解了vue的基本用法(數(shù)據(jù)綁定、指令、縮寫(xiě)、條件渲染等)后,來(lái)看一個(gè)完整示例,動(dòng)態(tài)添加/刪除元素:

    
    
    
        
            
            
            
        
    
        
            
    Create New Person
    Name Age Sex Delete
    {{ person.name }} {{ person.age }} {{ person.sex }}

    Demo
    Github示例源碼

    實(shí)戰(zhàn)示例:

    添加、刪除表單數(shù)據(jù)

    
    
    
    Vue js
    
    
    
      
    
    
    welcome to Vue.js

    {{ message }}

    • {{ todo.id }} {{ todo.title }}

    注意:在輸入框輸入數(shù)據(jù)添加到列表時(shí),需要使用v-on:submit.prevent="addTodo(newTodo)方法對(duì)表單提交進(jìn)行阻止,并使用v-model進(jìn)行數(shù)據(jù)雙向綁定,當(dāng)輸入框里的數(shù)據(jù)變化時(shí),Vue實(shí)例中的newTodo:{id:null,title:""}屬性數(shù)據(jù)也跟著變化,這樣就可以將數(shù)據(jù)塞入到todos數(shù)組中。

    2.計(jì)算屬性computed,v-bind
      
              

    My todos {{todosCount}}

    JS中的用法:

     computed:{
          todosCount(){
            return this.todos.length;
          }

    完整代碼:

    
    
    
    Vue js
    
    
    
    
    
    
      
    
    
    welcome to Vue.js

    My todos {{todosCount}}

    • {{ todo.id }} {{ todo.title }}
    二、組件

    組件(Component)是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素, Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴(kuò)展。

    組件化的好處:
    增加了代碼的可讀性,更重要的是增加了代碼的可重用性。

    1)、全局組件

    先注冊(cè),然后再使用

    // 注冊(cè) Vue.component("my-component", { template: "
    A custom component!
    " }) // 創(chuàng)建根實(shí)例 new Vue({ el: "#example" })

    渲染:

    A custom component!

    注意事項(xiàng):組件在注冊(cè)之后,便可以在父實(shí)例的模塊中以自定義元素 的形式使用。要確保在初始化根實(shí)例 之前 注冊(cè)了組件。

    2)、局部注冊(cè)

    不必在全局注冊(cè)每個(gè)組件。通過(guò)使用組件實(shí)例選項(xiàng)注冊(cè),可以使組件僅在另一個(gè)實(shí)例/組件的作用域中可用:

    var Child = {
      template: "
    A custom component!
    " } new Vue({ // ... components: { // 將只在父模板可用 "my-component": Child } })

    對(duì)上邊的實(shí)戰(zhàn)示例進(jìn)行組件化封裝處理:
    本案例,完成兩個(gè)組件化工作:
    1:對(duì)列表進(jìn)行組件封裝,注意在組件模板屬性參數(shù)的v-bind:todos="todos"傳遞
    2:對(duì)表單進(jìn)行了組裝,注意data為function返回

    注意在 JavaScript對(duì)象和數(shù)組是引用類(lèi)型,指向同一個(gè)內(nèi)存空間,如果 prop 是一個(gè)對(duì)象或數(shù)組,在子組件內(nèi)部改變它會(huì)影響父組件的狀態(tài)。

    
    
    
    
    
    Vue js
    
    
    
    
    
    
      
    
    
    welcome to Vue.js

    My todos {{todosCount}}

    三、vue-cli腳手架

    vue-cli腳手架Github地址:https://github.com/vuejs/vue-cli

    1、node安裝vue-cli腳手架
    // 這里使用淘寶的鏡像cnpm
    $ cnpm install -g vue-cli  

    安裝好之后,可以通過(guò)vue命令查看:

    2、命令安裝webpack項(xiàng)目
    ?  Code vue init webpack vuejs-cli

    然后再執(zhí)行上邊給出的提示命令:

    cd vuejs-2.0-cli
    npm install
    npm run dev

    執(zhí)行完上邊的命令后,會(huì)打開(kāi)瀏覽器的http://localhost:8080/#/頁(yè)面

    我們看一下這個(gè)目錄下邊的文件:

    3.vue-router

    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構(gòu)建單頁(yè)面應(yīng)用。vue的單頁(yè)面應(yīng)用是基于路由和組件的,路由用于設(shè)定訪(fǎng)問(wèn)路徑,并將路徑和組件映射起來(lái)。傳統(tǒng)的頁(yè)面應(yīng)用,是用一些超鏈接來(lái)實(shí)現(xiàn)頁(yè)面切換和跳轉(zhuǎn)的。在vue-router單頁(yè)面應(yīng)用中,則是路徑之間的切換,也就是組件的切換。

    vue-router 快速入門(mén)
    Vue路由的使用

    4.JavaScript ES6中export及export default的區(qū)別

    相信很多人都使用過(guò)export、export default、import,然而它們到底有什么區(qū)別呢? 在JavaScript ES6中,export與export default均可用于導(dǎo)出常量、函數(shù)、文件、模塊等,你可以在其它文件或模塊中通過(guò)import+(常量 | 函數(shù) | 文件 | 模塊)名的方式,將其導(dǎo)入,以便能夠?qū)ζ溥M(jìn)行使用,但在一個(gè)文件或模塊中,export、import可以有多個(gè),export default僅有一個(gè)。

    具體事例,請(qǐng)看下邊的原文章:
    JavaScript ES6中export及export default的區(qū)別

    四、Vue請(qǐng)求api之vue-axios使用

    axios github官方地址
    vue-axios 擴(kuò)展包GitHub地址

    我們?cè)趯W(xué)習(xí)vue的API請(qǐng)求,所以,我們用第二個(gè)特定的包vue-axios來(lái)安裝https://github.com/imcvampire...。

    1.安裝
    npm install --save axios vue-axios
    2.使用

    安裝好之后,引入到使用的文件中

    import Vue from "vue"
    import axios from "axios"
    import VueAxios from "vue-axios"
    
    Vue.use(VueAxios, axios)

    示例:

    Vue.axios.get(api).then((response) => {
      console.log(response.data)
    })
    
    this.axios.get(api).then((response) => {
      console.log(response.data)
    })
    五、laravel做后端API提供數(shù)據(jù)

    這里使用axios請(qǐng)求接口,會(huì)出現(xiàn)跨域的問(wèn)題,不過(guò),我們可以通過(guò)安裝https://github.com/barryvdh/laravel-cors庫(kù)來(lái)解決這個(gè)問(wèn)題。

    六、Vuex學(xué)習(xí) 1、什么是Vuex?

    Vuex 是一個(gè)專(zhuān)為 Vue.js 應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。---官方文檔

    2、state理解

    state 這樣概念初次接觸的時(shí)候可能會(huì)感覺(jué)到有點(diǎn)模糊,簡(jiǎn)單來(lái)說(shuō)就是將 state 看成我們項(xiàng)目中使用的數(shù)據(jù)的集合。然后,Vuex 使得 組件本地狀態(tài)(component local state)應(yīng)用層級(jí)狀態(tài)(application state) 有了一定的差異。

    component local state:該狀態(tài)表示僅僅在組件內(nèi)部使用的狀態(tài),有點(diǎn)類(lèi)似通過(guò)配置選項(xiàng)傳入 Vue 組件內(nèi)部的意思。

    application level state:應(yīng)用層級(jí)狀態(tài),表示同時(shí)被多個(gè)組件共享的狀態(tài)層級(jí)。

    假設(shè)有這樣一個(gè)場(chǎng)景:我們有一個(gè)父組件,同時(shí)包含兩個(gè)子組件。父組件可以很容易的通過(guò)使用 props 屬性來(lái)向子組件傳遞數(shù)據(jù)。

    但是問(wèn)題來(lái)了,當(dāng)我們的兩個(gè)子組件如何和對(duì)方互相通信的? 或者子組件如何傳遞數(shù)據(jù)給他父組件的?在我們的項(xiàng)目很小的時(shí)候,這個(gè)兩個(gè)問(wèn)題都不會(huì)太難,因?yàn)槲覀兛梢酝ㄟ^(guò)事件派發(fā)和監(jiān)聽(tīng)來(lái)完成父組件和子組件的通信。

    然而,隨著我們項(xiàng)目的增長(zhǎng):

    保持對(duì)所有的事件追蹤將變得很困難。到底哪個(gè)事件是哪個(gè)組件派發(fā)的,哪個(gè)組件該監(jiān)聽(tīng)哪個(gè)事件?

    項(xiàng)目邏輯分散在各個(gè)組件當(dāng)中,很容易導(dǎo)致邏輯的混亂,不利于我們項(xiàng)目的維護(hù)。

    父組件將變得和子組件耦合越來(lái)越嚴(yán)重,因?yàn)樗枰鞔_的派發(fā)和監(jiān)聽(tīng)子組件的某些事件。

    這就是 Vuex 用來(lái)解決的問(wèn)題。 Vuex 的四個(gè)核心概念分別是:

    The state tree:Vuex 使用單一狀態(tài)樹(shù),用一個(gè)對(duì)象就包含了全部的應(yīng)用層級(jí)狀態(tài)。至此它便作為一個(gè)『唯一數(shù)據(jù)源(SSOT)』而存在。這也意味著,每個(gè)應(yīng)用將僅僅包含一個(gè) store 實(shí)例。單狀態(tài)樹(shù)讓我們能夠直接地定位任一特定的狀態(tài)片段,在調(diào)試的過(guò)程中也能輕易地取得整個(gè)當(dāng)前應(yīng)用狀態(tài)的快照。

    Getters:用來(lái)從 store 獲取 Vue 組件數(shù)據(jù)。

    Mutators:事件處理器用來(lái)驅(qū)動(dòng)狀態(tài)的變化。

    Actions:可以給組件使用的函數(shù),以此用來(lái)驅(qū)動(dòng)事件處理器 mutations

    如何你暫時(shí)還不太理解這個(gè)四個(gè)概念,不用著急,我們將在后面的項(xiàng)目實(shí)戰(zhàn)中詳細(xì)的解釋。

    Vuex 應(yīng)用中數(shù)據(jù)的流向(Vuex 官方圖)

    上邊的流程圖簡(jiǎn)單解釋下:

    Vuex 規(guī)定,屬于應(yīng)用層級(jí)的狀態(tài)只能通過(guò) Mutation 中的方法來(lái)修改,而派發(fā) Mutation 中的事件只能通過(guò) action。

    從左到又,從組件出發(fā),組件中調(diào)用 action,在 action 這一層級(jí)我們可以和后臺(tái)數(shù)據(jù)交互,比如獲取初始化的數(shù)據(jù)源,或者中間數(shù)據(jù)的過(guò)濾等。然后在 action 中去派發(fā) Mutation。Mutation 去觸發(fā)狀態(tài)的改變,狀態(tài)的改變,將觸發(fā)視圖的更新。

    注意事項(xiàng)

    數(shù)據(jù)流都是單向的

    組件能夠調(diào)用 action

    action 用來(lái)派發(fā) Mutation

    只有 mutation 可以改變狀態(tài)

    store 是響應(yīng)式的,無(wú)論 state 什么時(shí)候更新,組件都將同步更新

    3、Vuex目錄結(jié)構(gòu)

    我們來(lái)看一下創(chuàng)建的Vuex項(xiàng)目的目錄結(jié)構(gòu):

    components/ 文件夾用來(lái)存放我們的 Vue 組件

    vuex/ 文件夾存放的是和 Vuex store 相關(guān)的東西(state object,actions,mutators)

    build/ 文件是 webpack 的打包編譯配置文件

    config/ 文件夾存放的是一些配置項(xiàng),比如我們服務(wù)器訪(fǎng)問(wèn)的端口配置等

    dist/ 該文件夾一開(kāi)始是不存在,在我們的項(xiàng)目經(jīng)過(guò) build 之后才會(huì)產(chǎn)出

    App.vue 根組件,所有的子組件都將在這里被引用

    index.html 整個(gè)項(xiàng)目的入口文件,將會(huì)引用我們的根組件 App.vue

    main.js 入口文件的 js 邏輯,在 webpack 打包之后將被注入到 index.html 中

    注:本博客Vuex部分內(nèi)容轉(zhuǎn)自該博文:使用 Vuex + Vue.js 構(gòu)建單頁(yè)應(yīng)用,博文作者對(duì)Vuex理解的比較透徹,所以轉(zhuǎn)過(guò)來(lái)學(xué)習(xí)下。

    4、將上邊實(shí)戰(zhàn)列表表單例子用Vuex重構(gòu)

    先看Vuex的目錄結(jié)構(gòu):

    主要是在 src目錄下做組件重構(gòu):

    先看列表組件Todos.vue:

    
    
    
    
    
    

    表單組件TodoForm.vue

    
    
    
    
    

    App.vue總組件: