Vue 學習筆記

# Vue.js

### 什么是Vue.js

+ Vue.js 是目前最火的一個前端框架所意,React是最流行的一個前端框架(React除了開發(fā)網站淮逊,還可以開發(fā)手機App催首, Vue語法也是可以用于進行手機App開發(fā)的,需要借助于Weex)

+ Vue.js 是前端的**主流框架之一**泄鹏,和Angular.js郎任、React.js 一起,并成為前端三大主流框架备籽!

+ Vue.js 是一套構建用戶界面的框架舶治,**只關注視圖層**,它不僅易于上手车猬,還便于與第三方庫或既有項目整合霉猛。(Vue有配套的第三方類庫,可以整合起來做大型項目的開發(fā))

+ 前端的主要工作珠闰?主要負責MVC中的V這一層惜浅;主要工作就是和界面打交道,來制作前端頁面效果伏嗜;

## 為什么要學習流行框架

+ 企業(yè)為了提高開發(fā)效率:在企業(yè)中坛悉,時間就是效率,效率就是金錢承绸;

? - 企業(yè)中裸影,使用框架,能夠提高開發(fā)的效率军熏;

+ 提高開發(fā)效率的發(fā)展歷程:原生JS -> Jquery之類的類庫 -> 前端模板引擎 -> Angular.js / Vue.js(能夠幫助我們減少不必要的DOM操作轩猩;提高渲染效率;雙向數據綁定的概念【通過框架提供的指令荡澎,我們前端程序員只需要關心數據的業(yè)務邏輯均践,不再關心DOM是如何渲染的了】)

+ 在Vue中,一個核心的概念衔瓮,就是讓用戶不再操作DOM元素浊猾,解放了用戶的雙手,讓程序員可以更多的時間去關注業(yè)務邏輯热鞍;

+ 增強自己就業(yè)時候的競爭力

? - 人無我有葫慎,人有我優(yōu)

? - 你平時不忙的時候,都在干嘛薇宠?

## 框架和庫的區(qū)別

+ 框架:是一套完整的解決方案偷办;對項目的侵入性較大,項目如果需要更換框架澄港,則需要重新架構整個項目椒涯。

? - node 中的 express;

+ 庫(插件):提供某一個小功能回梧,對項目的侵入性較小废岂,如果某個庫無法完成某些需求祖搓,可以很容易切換到其它庫實現需求。

? - 1. 從Jquery 切換到 Zepto

? - 2. 從 EJS 切換到 art-template

## Node(后端)中的 MVC 與 前端中的 MVVM 之間的區(qū)別

+ MVC 是后端的分層開發(fā)概念湖苞;

+ MVVM是前端視圖層的概念拯欧,主要關注于 視圖層分離,也就是說:MVVM把前端的視圖層财骨,分為了 三部分 Model, View , VM ViewModel

+ 為什么有了MVC還要有MVVM

## Vue.js 基本代碼 和 MVVM 之間的對應關系

## Vue之 - `基本的代碼結構`和`插值表達式`镐作、`v-cloak`

## Vue指令之`v-text`和`v-html`

## Vue指令之`v-bind`的三種用法

1. 直接使用指令`v-bind`

2. 使用簡化指令`:`

3. 在綁定的時候,拼接綁定內容:`:title="btnTitle + ', 這是追加的內容'"`

## Vue指令之`v-on`和`跑馬燈效果`

### 跑馬燈效果

1. HTML結構:

```

<div id="app">

? ? <p>{{info}}</p>

? ? <input type="button" value="開啟" v-on:click="go">

? ? <input type="button" value="停止" v-on:click="stop">

? </div>

```

2. Vue實例:

```

// 創(chuàng)建 Vue 實例隆箩,得到 ViewModel

? ? var vm = new Vue({

? ? ? el: '#app',

? ? ? data: {

? ? ? ? info: '猥瑣發(fā)育该贾,別浪~!',

? ? ? ? intervalId: null

? ? ? },

? ? ? methods: {

? ? ? ? go() {

? ? ? ? ? // 如果當前有定時器在運行捌臊,則直接return

? ? ? ? ? if (this.intervalId != null) {

? ? ? ? ? ? return;

? ? ? ? ? }

? ? ? ? ? // 開始定時器

? ? ? ? ? this.intervalId = setInterval(() => {

? ? ? ? ? ? this.info = this.info.substring(1) + this.info.substring(0, 1);

? ? ? ? ? }, 500);

? ? ? ? },

? ? ? ? stop() {

? ? ? ? ? clearInterval(this.intervalId);

? ? ? ? }

? ? ? }

? ? });

```

## Vue指令之`v-on的縮寫`和`事件修飾符`

### 事件修飾符:

+ .stop? ? ? 阻止冒泡

+ .prevent? ? 阻止默認事件

+ .capture? ? 添加事件偵聽器時使用事件捕獲模式

+ .self? ? ? 只當事件在該元素本身(比如不是子元素)觸發(fā)時觸發(fā)回調

+ .once? ? ? 事件只觸發(fā)一次

## Vue指令之`v-model`和`雙向數據綁定`

## 簡易計算器案例

1. HTML 代碼結構

```

? <div id="app">

? ? <input type="text" v-model="n1">

? ? <select v-model="opt">

? ? ? <option value="0">+</option>

? ? ? <option value="1">-</option>

? ? ? <option value="2">*</option>

? ? ? <option value="3">÷</option>

? ? </select>

? ? <input type="text" v-model="n2">

? ? <input type="button" value="=" v-on:click="getResult">

? ? <input type="text" v-model="result">

? </div>

```

2. Vue實例代碼:

```

// 創(chuàng)建 Vue 實例杨蛋,得到 ViewModel

? ? var vm = new Vue({

? ? ? el: '#app',

? ? ? data: {

? ? ? ? n1: 0,

? ? ? ? n2: 0,

? ? ? ? result: 0,

? ? ? ? opt: '0'

? ? ? },

? ? ? methods: {

? ? ? ? getResult() {

? ? ? ? ? switch (this.opt) {

? ? ? ? ? ? case '0':

? ? ? ? ? ? ? this.result = parseInt(this.n1) + parseInt(this.n2);

? ? ? ? ? ? ? break;

? ? ? ? ? ? case '1':

? ? ? ? ? ? ? this.result = parseInt(this.n1) - parseInt(this.n2);

? ? ? ? ? ? ? break;

? ? ? ? ? ? case '2':

? ? ? ? ? ? ? this.result = parseInt(this.n1) * parseInt(this.n2);

? ? ? ? ? ? ? break;

? ? ? ? ? ? case '3':

? ? ? ? ? ? ? this.result = parseInt(this.n1) / parseInt(this.n2);

? ? ? ? ? ? ? break;

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? });

```

## 在Vue中使用樣式

### 使用class樣式

1. 數組

```

<h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>

```

2. 數組中使用三元表達式

```

<h1 :class="['red', 'thin', isactive?'active':'']">這是一個邪惡的H1</h1>

```

3. 數組中嵌套對象

```

<h1 :class="['red', 'thin', {'active': isactive}]">這是一個邪惡的H1</h1>

```

4. 直接使用對象

```

<h1 :class="{red:true, italic:true, active:true, thin:true}">這是一個邪惡的H1</h1>

```

### 使用內聯樣式

1. 直接在元素上通過 `:style` 的形式,書寫樣式對象

```

<h1 :style="{color: 'red', 'font-size': '40px'}">這是一個善良的H1</h1>

```

2. 將樣式對象理澎,定義到 `data` 中六荒,并直接引用到 `:style` 中

+ 在data上定義樣式:

```

data: {

? ? ? ? h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }

}

```

+ 在元素中,通過屬性綁定的形式矾端,將樣式對象應用到元素中:

```

<h1 :style="h1StyleObj">這是一個善良的H1</h1>

```

3. 在 `:style` 中通過數組,引用多個 `data` 上的樣式對象

+ 在data上定義樣式:

```

data: {

? ? ? ? h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },

? ? ? ? h1StyleObj2: { fontStyle: 'italic' }

}

```

+ 在元素中卵皂,通過屬性綁定的形式秩铆,將樣式對象應用到元素中:

```

<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>

```

## Vue指令之`v-for`和`key`屬性

1. 迭代數組

```

<ul>

? <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年齡:{{item.age}}</li>

</ul>

```

2. 迭代對象中的屬性

```

<!-- 循環(huán)遍歷對象身上的屬性 -->

? ? <div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>

```

3. 迭代數字

```

<p v-for="i in 10">這是第 {{i}} 個P標簽</p>

```

> 2.2.0+ 的版本里,**當在組件中使用** v-for 時灯变,key 現在是必須的殴玛。

當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用 “**就地復用**” 策略添祸。如果數據項的順序被改變滚粟,Vue將**不是移動 DOM 元素來匹配數據項的順序**, 而是**簡單復用此處每個元素**刃泌,并且確保它在特定索引下顯示已被渲染過的每個元素凡壤。

為了給 Vue 一個提示,**以便它能跟蹤每個節(jié)點的身份耙替,從而重用和重新排序現有元素**亚侠,你需要為每項提供一個唯一 key 屬性。

## Vue指令之`v-if`和`v-show`

> 一般來說俗扇,v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗硝烂。因此,如果需要頻繁切換 v-show 較好铜幽,如果在運行時條件不大可能改變 v-if 較好滞谢。

## 品牌管理案例

### 添加新品牌

### 刪除品牌

### 根據條件篩選品牌

1. 1.x 版本中的filterBy指令串稀,在2.x中已經被廢除:

[filterBy - 指令](https://v1-cn.vuejs.org/api/#filterBy)

```

<tr v-for="item in list | filterBy searchName in 'name'">

? <td>{{item.id}}</td>

? <td>{{item.name}}</td>

? <td>{{item.ctime}}</td>

? <td>

? ? <a href="#" @click.prevent="del(item.id)">刪除</a>

? </td>

</tr>

```

2. 在2.x版本中[手動實現篩選的方式](https://cn.vuejs.org/v2/guide/list.html#顯示過濾-排序結果):

+ 篩選框綁定到 VM 實例中的 `searchName` 屬性:

```

<hr> 輸入篩選名稱:

<input type="text" v-model="searchName">

```

+ 在使用 `v-for` 指令循環(huán)每一行數據的時候,不再直接 `item in list`狮杨,而是 `in` 一個 過濾的methods 方法母截,同時,把過濾條件`searchName`傳遞進去:

```

<tbody>

? ? ? <tr v-for="item in search(searchName)">

? ? ? ? <td>{{item.id}}</td>

? ? ? ? <td>{{item.name}}</td>

? ? ? ? <td>{{item.ctime}}</td>

? ? ? ? <td>

? ? ? ? ? <a href="#" @click.prevent="del(item.id)">刪除</a>

? ? ? ? </td>

? ? ? </tr>

? ? </tbody>

```

+ `search` 過濾方法中禾酱,使用 數組的 `filter` 方法進行過濾:

```

search(name) {

? return this.list.filter(x => {

? ? return x.name.indexOf(name) != -1;

? });

}

```

## Vue調試工具`vue-devtools`的安裝步驟和使用

[Vue.js devtools - 翻墻安裝方式 - 推薦](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=zh-CN)

## 過濾器

概念:Vue.js 允許你自定義過濾器微酬,**可被用作一些常見的文本格式化**。過濾器可以用在兩個地方:**mustache 插值和 v-bind 表達式**颤陶。過濾器應該被添加在 JavaScript 表達式的尾部颗管,由“管道”符指示;

### 私有過濾器

1. HTML元素:

```

<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>

```

2. 私有 `filters` 定義方式:

```

filters: { // 私有局部過濾器滓走,只能在 當前 VM 對象所控制的 View 區(qū)域進行使用

? ? dataFormat(input, pattern = "") { // 在參數列表中 通過 pattern="" 來指定形參默認值垦江,防止報錯

? ? ? var dt = new Date(input);

? ? ? // 獲取年月日

? ? ? var y = dt.getFullYear();

? ? ? var m = (dt.getMonth() + 1).toString().padStart(2, '0');

? ? ? var d = dt.getDate().toString().padStart(2, '0');

? ? ? // 如果 傳遞進來的字符串類型,轉為小寫之后搅方,等于 yyyy-mm-dd比吭,那么就返回 年-月-日

? ? ? // 否則,就返回? 年-月-日 時:分:秒

? ? ? if (pattern.toLowerCase() === 'yyyy-mm-dd') {

? ? ? ? return `${y}-${m}-$nbp99z3`;

? ? ? } else {

? ? ? ? // 獲取時分秒

? ? ? ? var hh = dt.getHours().toString().padStart(2, '0');

? ? ? ? var mm = dt.getMinutes().toString().padStart(2, '0');

? ? ? ? var ss = dt.getSeconds().toString().padStart(2, '0');

? ? ? ? return `${y}-${m}-$xtl9dfh ${hh}:${mm}:${ss}`;

? ? ? }

? ? }

? }

```

> 使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')來填充字符串姨涡;

### 全局過濾器

```

// 定義一個全局過濾器

Vue.filter('dataFormat', function (input, pattern = '') {

? var dt = new Date(input);

? // 獲取年月日

? var y = dt.getFullYear();

? var m = (dt.getMonth() + 1).toString().padStart(2, '0');

? var d = dt.getDate().toString().padStart(2, '0');

? // 如果 傳遞進來的字符串類型衩藤,轉為小寫之后,等于 yyyy-mm-dd涛漂,那么就返回 年-月-日

? // 否則赏表,就返回? 年-月-日 時:分:秒

? if (pattern.toLowerCase() === 'yyyy-mm-dd') {

? ? return `${y}-${m}-$vb33h7l`;

? } else {

? ? // 獲取時分秒

? ? var hh = dt.getHours().toString().padStart(2, '0');

? ? var mm = dt.getMinutes().toString().padStart(2, '0');

? ? var ss = dt.getSeconds().toString().padStart(2, '0');

? ? return `${y}-${m}-$dj1vttn ${hh}:${mm}:${ss}`;

? }

});

```

> 注意:當有局部和全局兩個名稱相同的過濾器時候,會以就近原則進行調用匈仗,即:局部過濾器優(yōu)先于全局過濾器被調用瓢剿!

## 鍵盤修飾符以及自定義鍵盤修飾符

### 1.x中自定義鍵盤修飾符【了解即可】

```

Vue.directive('on').keyCodes.f2 = 113;

```

### [2.x中自定義鍵盤修飾符](https://cn.vuejs.org/v2/guide/events.html#鍵值修飾符)

1. 通過`Vue.config.keyCodes.名稱 = 按鍵值`來自定義案件修飾符的別名:

```

Vue.config.keyCodes.f2 = 113;

```

2. 使用自定義的按鍵修飾符:

```

<input type="text" v-model="name" @keyup.f2="add">

```

## [自定義指令](https://cn.vuejs.org/v2/guide/custom-directive.html)

1. 自定義全局和局部的 自定義指令:

```

? ? // 自定義全局指令 v-focus,為綁定的元素自動獲取焦點:

? ? Vue.directive('focus', {

? ? ? inserted: function (el) { // inserted 表示被綁定元素插入父節(jié)點時調用

? ? ? ? el.focus();

? ? ? }

? ? });

? ? // 自定義局部指令 v-color 和 v-font-weight悠轩,為綁定的元素設置指定的字體顏色 和 字體粗細:

? ? ? directives: {

? ? ? ? color: { // 為元素設置指定的字體顏色

? ? ? ? ? bind(el, binding) {

? ? ? ? ? ? el.style.color = binding.value;

? ? ? ? ? }

? ? ? ? },

? ? ? ? 'font-weight': function (el, binding2) { // 自定義指令的簡寫形式间狂,等同于定義了 bind 和 update 兩個鉤子函數

? ? ? ? ? el.style.fontWeight = binding2.value;

? ? ? ? }

? ? ? }

```

2. 自定義指令的使用方式:

```

<input type="text" v-model="searchName" v-focus v-color="'red'" v-font-weight="900">

```

## Vue 1.x 中 自定義元素指令【已廢棄,了解即可】

```

Vue.elementDirective('red-color', {

? bind: function () {

? ? this.el.style.color = 'red';

? }

});

```

使用方式:

```

<red-color>1232</red-color>

```

## 相關文章

1. [vue.js 1.x 文檔](https://v1-cn.vuejs.org/)

2. [vue.js 2.x 文檔](https://cn.vuejs.org/)

3. [String.prototype.padStart(maxLength, fillString)](http://www.css88.com/archives/7715)

4. [js 里面的鍵盤事件對應的鍵碼](http://www.cnblogs.com/wuhua1/p/6686237.html)

5. [Vue.js雙向綁定的實現原理](http://www.cnblogs.com/kidney/p/6052935.html)

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市火架,隨后出現的幾起案子鉴象,更是在濱河造成了極大的恐慌,老刑警劉巖何鸡,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炼列,死亡現場離奇詭異,居然都是意外死亡音比,警方通過查閱死者的電腦和手機俭尖,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稽犁,你說我怎么就攤上這事焰望。” “怎么了已亥?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵熊赖,是天一觀的道長。 經常有香客問我虑椎,道長震鹉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任捆姜,我火速辦了婚禮传趾,結果婚禮上,老公的妹妹穿的比我還像新娘泥技。我一直安慰自己浆兰,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布珊豹。 她就那樣靜靜地躺著簸呈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪店茶。 梳的紋絲不亂的頭發(fā)上蜕便,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音贩幻,去河邊找鬼玩裙。 笑死,一個胖子當著我的面吹牛段直,可吹牛的內容都是我干的。 我是一名探鬼主播溶诞,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸯檬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了螺垢?” 一聲冷哼從身側響起喧务,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枉圃,沒想到半個月后功茴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡孽亲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年坎穿,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玲昧,死狀恐怖栖茉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情孵延,我是刑警寧澤吕漂,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尘应,受9級特大地震影響惶凝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜犬钢,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一苍鲜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娜饵,春花似錦坡贺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晴股,卻和暖如春愿伴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背电湘。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工隔节, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寂呛。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓怎诫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贷痪。 傳聞我的和親對象是個殘疾皇子幻妓,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容

  • Vue簡介 2014年誕生险掀,2013年react举反,09年angularjs 作者: 尤雨溪 核心概念: 組件化 雙...
    簡單就好wfc閱讀 1,575評論 0 1
  • vue學習筆記 安裝 Vue 提供一個官方命令行工具嘶炭,可用于快速搭建大型單頁應用琉兜。只需幾分鐘即可創(chuàng)建并啟動一個帶熱...
    EL_PSY_CONGROO閱讀 1,059評論 0 5
  • 序言:亂七八糟一鍋粥毅该! 基于Vue.js 教程撬码、介紹— Vue.js 心得: 在vue中处铛,推薦始終使用 kebab...
    苦苦修行閱讀 651評論 0 1
  • 一晾嘶、Vue.js介紹 Vue.js也稱為Vue熟吏,讀音類似view距糖,錯誤讀音v-u-e玄窝,由華人尤雨溪開源并維護。 V...
    間陽幕賓閱讀 575評論 1 6
  • 腳手架搭建: 在這里先拋出一個問題肾筐,為什么在命令行輸入npm run dev就可以運行了哆料? 解析vue-cli中的...
    tency小七閱讀 4,865評論 0 2