Vue.js
什麼是Vue.js
- Vue.js 是目前最火的一個前端架構,React是最流行的一個前端架構(React除了開發網站,還可以開發手機App, Vue文法也是可以用于進行手機App開發的,需要借助于Weex)
- Vue.js 是前端的主流架構之一,和Angular.js、React.js 一起,并成為前端三大主流架構!
- Vue.js 是一套建構使用者界面的架構,隻關注視圖層,它不僅易于上手,還便于與第三方庫或既有項目整合。(Vue有配套的第三方類庫,可以整合起來做大型項目的開發)
- 前端的主要工作?主要負責MVC中的V這一層;主要工作就是和界面打交道,來制作前端頁面效果;
為什麼要學習流行架構
- 企業為了提高開發效率:在企業中,時間就是效率,效率就是金錢;
- 提高開發效率的發展曆程:原生JS -> Jquery之類的類庫 -> 前端模闆引擎 -> Angular.js / Vue.js(能夠幫助我們減少不必要的DOM操作;提高渲染效率;雙向資料綁定的概念【通過架構提供的指令,我們前端程式員隻需要關心資料的業務邏輯,不再關心DOM是如何渲染的了】)
- 在Vue中,一個核心的概念,就是讓使用者不再操作DOM元素,解放了使用者的雙手,讓程式員可以更多的時間去關注業務邏輯;
架構和庫的差別
- 架構:是一套完整的解決方案;對項目的侵入性較大,項目如果需要更換架構,則需要重新架構整個項目。
- 庫(插件):提供某一個小功能,對項目的侵入性較小,如果某個庫無法完成某些需求,可以很容易切換到其它庫實作需求。
Node(後端)中的 MVC 與 前端中的 MVVM 之間的差別
- MVC 是後端的分層開發概念;
- MVVM是前端視圖層的概念,主要關注于 視圖層分離,也就是說:MVVM把前端的視圖層,分為了 三部分 Model, View , VM ViewModel
Vue.js 基本代碼 和 MVVM 之間的對應關系
Vue 執行個體所控制的這個元素區域,就是我們的 V
new 出來的對象,就是我們 MVVM中的 VM排程者
這裡的 data 就是 MVVM中的 M,專門用來儲存 每個頁面的資料的
Vue之 - 基本的代碼結構
和 插值表達式
、 v-cloak
基本的代碼結構
插值表達式
v-cloak
使用 v-cloak 能夠解決 插值表達式( 即{{ }} )閃爍的問題
(閃爍是 浏覽器先把{{}}顯示,加載完vue之後才渲染出内容的)
Vue指令之 v-text
v-html
v-text
v-html
預設 v-text 是沒有閃爍問題的 。
v-text會覆寫元素中原本的内容,但是 插值表達式 隻會替換自己的這個占位符,不會把 整個元素的内容清空。
v-html也會覆寫元素中原本的内容,但是會識别出HTML标簽。
v-bind
的三種用法
v-bind
v-bind是 Vue中,提供的用于綁定屬性的指令,可以寫合法的JS表達式
- 直接使用指令
v-bind:
- 使用簡化指令
:
- 在綁定的時候,拼接綁定内容:
:title="btnTitle + ', 這是追加的内容'"
v-on
跑馬燈效果
v-on
跑馬燈效果
提供了 v-on:事件=“自己起的事件名” 事件綁定機制 簡化指令是@
v-on:click=“show”
事件如:click ,mouseover等等
跑馬燈效果
- HTML結構:
<div id="app">
<p>{{info}}</p>
<input type="button" value="開啟" v-on:click="go">
<input type="button" value="停止" v-on:click="stop">
</div>
- Vue執行個體:
// 建立 Vue 執行個體,得到 ViewModel
// 注意:在 VM執行個體中,如果想要擷取 data 上的資料,或者 想要調用 methods 中的 方法,必須通過 this.資料屬性名 或 this.方法名
//進行通路,這裡的this,就表示 我們 new 出來的 VM 執行個體對象
var vm = new Vue({
el: '#app',
data: {
info: '猥瑣發育,别浪~!',
intervalId: null
},
methods: {
go() {
// 如果目前有定時器在運作,則直接return
if (this.intervalId != null) {
return;
}
// 開始定時器
// 箭頭函數 函數體内的this對象,就是定義時所在的對象,而不是使用時所在的對象
this.intervalId = setInterval(() => {
this.info = this.info.substring(1) + this.info.substring(0, 1);
}, 500);
},
stop() {
clearInterval(this.intervalId);
}
}
});
事件修飾符:
-
.stop 阻止冒泡,隻執行目前事件
隻要孩子和父親有相同的事件,當觸發該事件時就會一層一層向上冒。
- .prevent 阻止預設事件
- .capture 添加事件偵聽器時使用事件捕獲模式 (從外面到裡面觸發事件,和冒泡相反)
-
.self 隻當事件在該元素本身(比如不是子元素)觸發時觸發回調
.self 隻會阻止自己身上冒泡行為的觸發,并不會真正阻止冒泡的行為
- .once 事件隻觸發一次
v-model
雙向資料綁定
v-model
雙向資料綁定
v-bind 隻能實作資料的單向綁定,從 M 自動綁定到 V, 無法實作資料的雙向綁定
v-model 指令,可以實作 表單元素和 Model 中資料的雙向資料綁定
v-model 隻能運用在 表單元素中
input(radio, text, address, email…) select checkbox textarea
簡易電腦案例
- 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>
- Vue執行個體代碼:
// 建立 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;
// 注意:這是投機取巧的方式,正式開發中,盡量少用
//var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
//this.result = eval(codeStr)
}
}
}
});
在Vue中使用樣式
使用class樣式
- 直接傳遞一個數組,數組裡面是類名,類名必須用單引号括起來。注意: 這裡的 class 需要使用 v-bind 做資料綁定
<h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
- 數組中使用三元表達式
<h1 :class="['red', 'thin', isactive?'active':'']">這是一個邪惡的H1</h1>
isactive是data裡面的資料,為true才可以
- 數組中嵌套對象,提高代碼的可讀性
<h1 :class="['red', 'thin', {'active': isactive}]">這是一個邪惡的H1</h1>
isactive是data裡面的
-
直接使用對象
在為 class 使用 v-bind 綁定 對象的時候,對象的屬性是類名,由于 對象的屬性可帶引号,也可不帶引号,是以 這裡我沒寫引号; 屬性的值 是一個辨別符
<h1 :class="{red:true, italic:true, active:true, thin:true}">這是一個邪惡的H1</h1>
使用内聯樣式
- 直接在元素上通過
的形式,書寫樣式對象:style
<h1 :style="{color: 'red', 'font-size': '40px'}">這是一個善良的H1</h1>
屬性裡有-時候 ,需要加上引号
- 将樣式對象,定義到
中,并直接引用到data
中:style
- 在data上定義樣式:
data: {
h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }
}
- 在元素中,通過屬性綁定的形式,将樣式對象應用到元素中:
<h1 :style="h1StyleObj">這是一個善良的H1</h1>
- 在
中通過數組,引用多個:style
上的樣式對象data
data: {
h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
h1StyleObj2: { fontStyle: 'italic' }
}
<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>
v-for
key
屬性
v-for
key
- 疊代數組
<ul>
<li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年齡:{{item.age}}</li>
</ul>
- 疊代對象中的屬性
<!-- 循環周遊對象身上的屬性 -->
<div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>
- 疊代數字
注意:如果使用 v-for 疊代數字的話,前面的 count 值從 1 開始
<p v-for="i in 10">這是第 {{i}} 個P标簽</p>
2.2.0+ 的版本裡,當在元件中使用 v-for 時,key 現在是必須的。
當 Vue.js 用 v-for 正在更新已渲染過的元素清單時,它預設用 “就地複用” 政策。如果資料項的順序被改變,Vue将不是移動 DOM 元素來比對資料項的順序, 而是簡單複用此處每個元素,并且確定它在特定索引下顯示已被渲染過的每個元素。
v-if
v-show
v-if
v-show