Vue 基礎

vue-learn

學習vue, 記錄筆記

代碼放在:vue-learn

Hello World

  1. 創建vue 實例
  2. el 表示 vue 管理的區域
  3. data 表示管理區域內的數據
  4. {{內容}} 進行綁定

TODOList

v-for

循環遍歷 data中 list 的數據

v-on

綁定事件, 放在methods 內

todoList 中在按鈕中綁定提交事件

簡寫: v-on:click => @click

v-model

數據的雙向綁定

輸入框數據發生變化, 則data中數據也發送變化. data 中定義變量發送變化則頁面數據也跟着變

v-model.lazy : 懶惰加載,當鼠標移出輸入框後才加載
v-model.number : 數字加載,只有輸入的是數字才加載,字符串不加載
v-model.trim : 去除空格

v-bind

向組件傳入綁定值,

props 組件接受那些值

簡寫: v-bind:index => :index

v-if

條件判斷語句

v-else

判斷語句, 必須緊跟 v-if, 中間不能插入其他元素

v-else-if

判斷語句, 必須緊跟 v-if, 中間不能插入其他元素

v-text

將值輸出成文本

v-html

將值輸出成html

v-show

輸出元素,不會移除dom, 經常控制界面元素顯示和影藏

v-show 會渲染到頁面,只是display: none;

不支持<template></template>屬性

v-once

將組件放到內存中,不會每次去銷燬,提高性能

MVVM 模式

傳統MVP 設計模式

主要面向DOM進行操作

View <=> Presenter <=> Model

View : 視圖 Presenter : 控制器, 大量的DOM操作

MVVM

View <=> ViewModel <=> Model

ViewModel : DOM Listeners , Data Bindings. Vue 內置的, 我們並不需要關注

主要面向數據進行操作

前端組件化

可以將頁面進行切分, 組件就是界面中的一小塊。

父組件使用v-bind 向子組件傳值,子組件使用 this.$emit 向父組件觸發事件,父組件監聽這個時間, 並接受事件的參數

Vue 實例

全局變量: app.$data.xx

以$開頭的都是這個實例的實例屬性實例方法

app.$destroy() //將這個實例銷燬,銷燬後再修改值,頁面不會發送變化

生命週期鉤子

生命週期函數就是vue實例在某個時間點自動執行的函數

  1. init : 初始化事件和生命週期相關部分
  2. beforeCreate()
  3. init : 處理外部注入和 雙向綁定等
  4. created() //初始化完成
  5. has el : 是否有元素綁定,沒有執行 vm.$mount(el)
  6. has template : 是否有模版, 有模版就執行模版,沒有就把el的內容當成模版
  7. beforeMount() //模版和數據即將掛載的一瞬間, 未渲染頁面
  8. vm.$el replace el 模版和數據進行掛載
  9. mounted() //已渲染頁面
  10. mount 掛載
  11. 當 data 中數據有變化 (app.$data.seen = false)
  12. beforeUpdate() //渲染之前
  13. DOM 重新開始渲染
  14. updated() //渲染之後
  15. 當 vm.$destroy() 被調用,下面開始執行 (app.$destroy())
  16. beforeDestroy() //銷燬之前
  17. 銷燬
  18. destroyed() //銷燬之後

模版語法

這3個內容之中都可以寫js 表達式

  1. 插值表達式 : {{data}},

  2. v-text

  3. v-html

  4. 單次插入值:當 {{* data}} 使用 v-model 綁定的時候,只會初始化一次,就不會雙向綁定了。多了一個* 。

  5. 等同於v-html : 當使用 {{{raw_html}}} 時,解析爲html. 這時數據綁定會忽略,如果需要複用模塊片段,使用partials.

  6. 表達式可以添加過濾器 filter: {{message | capitalize}}, 管道預約不是js語法,不能在表達式中使用,只能添加在表達式之後。Vue內置了一些過濾器,過濾器可以串聯,可以接受參數 {{message | filterA 'arg1' arg2}}.

計算屬性, 方法, 偵聽器

  • computed
  • methods
  • watch

樣式綁定

class

  1. 綁定obj: v-bind:class
  2. 綁定數組: v-bind:[classA, classB]
<div class="static" v-bind:class="{class-a:isA, class-b:isB}"></div>
data : {
	isA: true,
	isB: false,
}

=> 結果
<div class="static class-a" ></div>
<div v-bind:class="classObject" ></div>
data : {
	calssObject :{
		'class-a': true,
		'class-b': false,
	}
}

style

  1. 綁定obj : v-bind:style="xx"
  2. 綁定數組 : v-bind:[styleObjectA, styleObjectB]

條件渲染

給元素加 key="xx" vue就會認爲是頁面中唯一的元素,如果key不同就不會複用

    <div v-if="show">
        用戶名: <input>
    </div>
    <div v-else>
        郵箱名: <input>
    </div>

加key 不會複用

    <div v-if="show">
        用戶名: <input key="username" />
    </div>
    <div v-else>
        郵箱名: <input key="mail" />
    </div>

列表渲染

    <div v-for="(item, index) of list"
         :key="item.id">
    {{item}} -- {{index}}
    </div>

性能高: key值唯一,不是用index

我們操作數組的時候,不能使用下標的方式,

  1. 使用vue提供的方法。
  • push 增加
  • pop 刪除最後一條
  • shift 刪除第一項
  • unshift 第一項加內容
  • splice 切割
  • sort 排序
  • reverse 取反
  1. 改變數組引用,

app.list = [{新數據}]

  1. set 方法
Vue.set(app.list, 1, 5)

app.$set(app.list, 1, 5)

template

模版佔位符, 包裹一些元素,並不會被渲染

    <template v-for="(item, index) of list"
         :key="item.id">
        <div>{{item}} -- {{index}}</div>
        <span>xxx</span>
    </template>

對象循環

    <div  v-for="(item, key, index) of userInfo">
        <div>{{item}} -- {{key}} -- {{index}} </div>
    </div>


  1. 改變引用來進行渲染的改變
  2. set 方法進行改變
//全局方法
Vue.set(app.userInfo, "address", "beijin")

//實例方法
app.$set(app.userInfo, "address", "beijin")

vue 組件間的關係

is

使用is 解決h5中 標籤規範 的bug, 包含後頁面展現錯誤



<select>
    <option is="row"></option>
</select>


Vue.component("row", {
    template : "<tr><td>this is a row</td></tr>",
})


子組件定義data, 必須是一個函數,而不能是一個對象,

Vue.component("row", {
    data : function () {
      return {
          content : "this is a row"
      }
    },
    template : "<tr><td>{{content}}</td></tr>",
})

操作DOM

使用 ref 定義引用名稱

<div ref="hello" @click="handleClick"> hello world</div>


var app = new Vue({
    el: "#app",
    methods : {
        handleClick : function () {
           console.log( this.$refs.hello.innerHTML  )
        }
    },
})

父組件通過屬性的方式向子組件傳值

父組件

    <counter :count="0"></counter>

子組件 使用props 接受父組件傳遞的參數

var counter = {
        template: '<div>{{count}}</div>',
        props : ["count"],
    }

單項數據流:子組件不能反過來修改父組件的值, 只能拷貝後修改自己的值

父子組件傳值

  1. 父組件通過屬性的方式,子組件props 接收
  2. 子組件使用事件觸發向上傳值,父組件監聽事件,獲得傳遞的參數

非父子組件傳值

  1. Vuex
  2. 總線機制 : Bus/總線/發佈訂閱模式/觀察者模式

Vue中的插槽(slot)

當子組件顯示依賴父組件傳遞dom 進行展現的時候,使用插槽

CSS 動畫效果

transition

使用該標籤實現動畫效果, 過渡動畫效果。

原理:在一定時間在組件上加css

avatar

avatar

參考

animate.css Velocity.js

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章