国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Vue.js學習

TIGERB / 2402人閱讀

摘要:一基礎學習模式下圖不僅概括了模式,還描述了在中是如何和以及進行交互的。關于這一點我們將在后續反應系統中討論。父組件通過向下傳遞數據給子組件,子組件通過給父組件發送消息。這個對象必須是普通對象原生對象,及原型屬性會被忽略。

Vue.js 是用于構建交互式的 Web 界面的庫。
Vue.js 提供了 MVVM 數據綁定和一個可組合的組件系統,具有簡單、靈活的 API。

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

理解Vuejs最關鍵的一句話叫做“數據驅動視圖”,比如用Jquery來做一個列表,這個列表的數據是從Laravel來的,那么我們要遍歷這個數據,然后把列表的html元素加到dom里面去, 要刪除一個列表項的時候,先要在找到列表項在dom的位置,然后去除這個節點。Vuejs不用,數據在的時候,列表就在,數據減一,列表項就自動實時相應減一。也就是說,你只要操作數據就夠了,不用管dom。這基本就是Vuejs的中心思想。

一、基礎學習 1.MVVM模式

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

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

當創建了ViewModel后,雙向綁定是如何達成的呢?

首先,我們將上圖中的DOM Listeners和Data Bindings看作兩個工具,它們是實現雙向綁定的關鍵。
從View側看,ViewModel中的DOM Listeners工具會幫我們監測頁面上DOM元素的變化,如果有變化,則更改Model中的數據;
從Model側看,當我們更新Model中的數據時,Data Bindings工具會幫我們更新頁面中的DOM元素。

1.2 Vue基本語法

先來看一個簡單的示例,Hello,World!





Vue學習



{{ message }}

示例詳解:

1.2.1 data屬性和方法

每個Vue實例都會代理其data對象中的所有屬性:

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

需要注意的是只有代理屬性是反應式的,如果在實例創建之后添加一個新的屬性到實例上,將不會觸發任何視圖更新。關于這一點我們將在后續反應系統中討論。

除了數據屬性之外,Vue實例還提供了許多有用的實例屬性和方法,這些屬性和方法都以$開頭以便和代理數據屬性進行區分。例如:

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 實例生命周期

每個Vue實例在創建時都會經歷一系列實例化步驟,例如,需要設置數據觀察、編譯模板、以及創建必要的數據綁定。在這個過程中,還會調用生命周期鉤子,從而方便我們執行自定義邏輯,例如,created鉤子會在實例創建后調用:

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

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

1.2.3 props 用法

props將數據從父作用域傳到子組件。在 Vue.js 中,父子組件的關系可以總結為 props down, events up 。父組件通過 props 向下傳遞數據給子組件,子組件通過 events 給父組件發送消息。

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


    這只是一個假設的例子,但是我們已經設法將應用分割成了兩個更小的單元,子單元通過 props 接口實現了與父單元很好的解耦。我們現在可以進一步為我們的 todo-item 組件實現更復雜的模板和邏輯的改進,而不會影響到父單元。

    組件實例的作用域是孤立的。這意味著不能(也不應該)在子組件的模板內直接引用父組件的數據。要讓子組件使用父組件的數據,我們需要通過子組件的props選項。

    子組件要顯式地用props 選項聲明它期待獲得的數據:

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

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

    結果:

    hello!
    1.2.4 data屬性對象和函數返回對象的區別

    我們先來看一下這個比較經典的問題,當初在學Vue的時候也犯過這樣的迷惑,不知道何時傳遞data對象,何時傳遞data函數 。Vue.js的data是要一個對象還是一個function?

    Vue 實例的數據對象。Vue.js 會遞歸地將它全部屬性轉為 getter/setter,從而讓它能響應數據變化。這個對象必須是普通對象:原生對象,getter/setter 及原型屬性會被忽略。不推薦觀察復雜對象。

    在實例創建之后,可以用 vm.$data 訪問原始數據對象。Vue 實例也代理了數據對象所有的屬性。

    在定義組件時,同一定義將創建多個實例,此時 data 必須是一個函數,返回原始數據對象。如果 data 仍然是一個普通對象,則所有的實例將指向同一個對象!換成函數后,每當創建一個實例時,會調用這個函數,返回一個新的原始數據對象的副本。

    簡單說, 在實例中data是對象, 在組件中data就得是函數返回對象。

    組件中的data寫法示例:

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

    由于這三個組件共享了同一個 data , 因此增加一個 counter 會影響所有組件!這不對。我們可以通過為每個組件返回全新的 data 對象來解決這個問題:

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

    更多詳情請參考:官網組件數據data傳遞說明(Component)

    1.2.5 組件寫法需注意的幾個問題

    一個組件下只能有一個并列的 div,可以這么寫,所以復制官網示例的時候只要復制 div 里面的內容就好。

    但是不能這樣寫:

    第二。數據要寫在 return 里面而不是像文檔那樣子寫

    錯誤的寫法:

    組件使用 :
    firstComponent.vue

    
    
    
    
    

    其他Vue問題,可以參考該博文:Vue2.0 新手完全填坑攻略——從環境搭建到發布

    2.Vue.js的常用指令請參考官方文檔

    Vue官方文檔

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

    在了解了vue的基本用法(數據綁定、指令、縮寫、條件渲染等)后,來看一個完整示例,動態添加/刪除元素:

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

    Demo
    Github示例源碼

    實戰示例:

    添加、刪除表單數據

    
    
    
    Vue js
    
    
    
      
    
    
    welcome to Vue.js

    {{ message }}

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

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

    2.計算屬性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 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素, Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴展。

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

    1)、全局組件

    先注冊,然后再使用

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

    渲染:

    A custom component!

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

    2)、局部注冊

    不必在全局注冊每個組件。通過使用組件實例選項注冊,可以使組件僅在另一個實例/組件的作用域中可用:

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

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

    注意在 JavaScript對象和數組是引用類型,指向同一個內存空間,如果 prop 是一個對象或數組,在子組件內部改變它會影響父組件的狀態。

    
    
    
    
    
    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  

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

    2、命令安裝webpack項目
    ?  Code vue init webpack vuejs-cli

    然后再執行上邊給出的提示命令:

    cd vuejs-2.0-cli
    npm install
    npm run dev

    執行完上邊的命令后,會打開瀏覽器的http://localhost:8080/#/頁面

    我們看一下這個目錄下邊的文件:

    3.vue-router

    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構建單頁面應用。vue的單頁面應用是基于路由和組件的,路由用于設定訪問路徑,并將路徑和組件映射起來。傳統的頁面應用,是用一些超鏈接來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也就是組件的切換。

    vue-router 快速入門
    Vue路由的使用

    4.JavaScript ES6中export及export default的區別

    相信很多人都使用過export、export default、import,然而它們到底有什么區別呢? 在JavaScript ES6中,export與export default均可用于導出常量、函數、文件、模塊等,你可以在其它文件或模塊中通過import+(常量 | 函數 | 文件 | 模塊)名的方式,將其導入,以便能夠對其進行使用,但在一個文件或模塊中,export、import可以有多個,export default僅有一個。

    具體事例,請看下邊的原文章:
    JavaScript ES6中export及export default的區別

    四、Vue請求api之vue-axios使用

    axios github官方地址
    vue-axios 擴展包GitHub地址

    我們在學習vue的API請求,所以,我們用第二個特定的包vue-axios來安裝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提供數據

    這里使用axios請求接口,會出現跨域的問題,不過,我們可以通過安裝https://github.com/barryvdh/laravel-cors庫來解決這個問題。

    六、Vuex學習 1、什么是Vuex?

    Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。---官方文檔

    2、state理解

    state 這樣概念初次接觸的時候可能會感覺到有點模糊,簡單來說就是將 state 看成我們項目中使用的數據的集合。然后,Vuex 使得 組件本地狀態(component local state)應用層級狀態(application state) 有了一定的差異。

    component local state:該狀態表示僅僅在組件內部使用的狀態,有點類似通過配置選項傳入 Vue 組件內部的意思。

    application level state:應用層級狀態,表示同時被多個組件共享的狀態層級。

    假設有這樣一個場景:我們有一個父組件,同時包含兩個子組件。父組件可以很容易的通過使用 props 屬性來向子組件傳遞數據。

    但是問題來了,當我們的兩個子組件如何和對方互相通信的? 或者子組件如何傳遞數據給他父組件的?在我們的項目很小的時候,這個兩個問題都不會太難,因為我們可以通過事件派發和監聽來完成父組件和子組件的通信。

    然而,隨著我們項目的增長:

    保持對所有的事件追蹤將變得很困難。到底哪個事件是哪個組件派發的,哪個組件該監聽哪個事件?

    項目邏輯分散在各個組件當中,很容易導致邏輯的混亂,不利于我們項目的維護。

    父組件將變得和子組件耦合越來越嚴重,因為它需要明確的派發和監聽子組件的某些事件。

    這就是 Vuex 用來解決的問題。 Vuex 的四個核心概念分別是:

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

    Getters:用來從 store 獲取 Vue 組件數據。

    Mutators:事件處理器用來驅動狀態的變化。

    Actions:可以給組件使用的函數,以此用來驅動事件處理器 mutations

    如何你暫時還不太理解這個四個概念,不用著急,我們將在后面的項目實戰中詳細的解釋。

    Vuex 應用中數據的流向(Vuex 官方圖)

    上邊的流程圖簡單解釋下:

    Vuex 規定,屬于應用層級的狀態只能通過 Mutation 中的方法來修改,而派發 Mutation 中的事件只能通過 action。

    從左到又,從組件出發,組件中調用 action,在 action 這一層級我們可以和后臺數據交互,比如獲取初始化的數據源,或者中間數據的過濾等。然后在 action 中去派發 Mutation。Mutation 去觸發狀態的改變,狀態的改變,將觸發視圖的更新。

    注意事項

    數據流都是單向的

    組件能夠調用 action

    action 用來派發 Mutation

    只有 mutation 可以改變狀態

    store 是響應式的,無論 state 什么時候更新,組件都將同步更新

    3、Vuex目錄結構

    我們來看一下創建的Vuex項目的目錄結構:

    components/ 文件夾用來存放我們的 Vue 組件

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

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

    config/ 文件夾存放的是一些配置項,比如我們服務器訪問的端口配置等

    dist/ 該文件夾一開始是不存在,在我們的項目經過 build 之后才會產出

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

    index.html 整個項目的入口文件,將會引用我們的根組件 App.vue

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

    注:本博客Vuex部分內容轉自該博文:使用 Vuex + Vue.js 構建單頁應用,博文作者對Vuex理解的比較透徹,所以轉過來學習下。

    4、將上邊實戰列表表單例子用Vuex重構

    先看Vuex的目錄結構:

    主要是在 src目錄下做組件重構:

    先看列表組件Todos.vue:

    
    
    
    
    
    

    表單組件TodoForm.vue

    
    
    
    
    

    App.vue總組件: