Vue之 - 基本的代碼結構
和插值表達式
、v-cloak
Vue指令之v-text
和v-html
Vue指令之v-bind
的三種用法
- 直接使用指令
v-bind
- 使用簡化指令
:
- 在綁定的時候,拼接綁定內容:
:title="btnTitle + ', 這是追加的內容'"
Vue指令之v-on
和跑馬燈效果
- HTML結構:
<div id="app">
<p>{{info}}</p>
<input type="button" value="開啟" v-on:click="go">
<!-- 在Vue中,使用事件綁定機制,為元素指定處理函數的時候,如果加了小括號,就可以給函數傳參了 -->
<!-- <input type="button" value="添加" class="btn btn-primary" @click="add()">-->
<input type="button" value="停止" v-on:click="stop">
</div>
- Vue實例:
// 創建 Vue 實例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
info: '一個字,干~!',
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 只當事件在該元素本身(比如不是子元素)觸發時觸發回調
- .once 事件只觸發一次
Vue指令之v-model
和雙向數據綁定
簡易計算器案例
- 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">
<!-- 注意: Vue中所有的指令,在調用的時候,都以 v- 開頭 -->
<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;
}
}
}
});
在Vue中使用樣式
使用class樣式
- 數組
<h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
- 數組中使用三元表達式
<h1 :class="['red', 'thin', isactive?'active':'']">這是一個邪惡的H1</h1>
- 數組中嵌套對象
<h1 :class="['red', 'thin', {'active': isactive}]">這是一個邪惡的H1</h1>
- 直接使用對象
<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上定義樣式:
data: {
h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
h1StyleObj2: { fontStyle: 'italic' }
}
- 在元素中,通過屬性綁定的形式,將樣式對象應用到元素中:
<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>
Vue指令之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>
- 迭代數字
<p v-for="i in 10">這是第 {{i}} 個P標簽</p>
2.2.0+ 的版本里,當在組件中使用 v-for 時,key 現在是必須的。
當 Vue.js 用 v-for 正在更新已渲染過的元素列表時,它默認用 “就地復用” 策略。如果數據項的順序被改變,Vue將不是移動 DOM 元素來匹配數據項的順序, 而是簡單復用此處每個元素,并且確保它在特定索引下顯示已被渲染過的每個元素。
為了給 Vue 一個提示,以便它能跟蹤每個節點的身份,從而重用和重新排序現有元素,你需要為每項提供一個唯一 key 屬性。
Vue指令之v-if
和v-show
一般來說,v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗。因此,如果需要頻繁切換 v-show 較好,如果在運行時條件不大可能改變 v-if 較好。
1.x 版本中的filterBy指令,在2.x中已經被廢除:
filterBy - 指令在2.x版本中手動實現篩選的方式:
Vue調試工具vue-devtools
的安裝步驟和使用
過濾器
概念:Vue.js 允許你自定義過濾器,可被用作一些常見的文本格式化。過濾器可以用在兩個地方:mustache 插值和 v-bind 表達式。過濾器應該被添加在 JavaScript 表達式的尾部,由“管道”符指示;
私有過濾器
- HTML元素:
<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>
- 私有
filters
定義方式:
filters: { // 私有局部過濾器,只能在 當前 VM 對象所控制的 View 區域進行使用
dataFormat(input, pattern = "") { // 在參數列表中 通過 pattern="" 來指定形參默認值,防止報錯
// 過濾器的定義語法
// Vue.filter('過濾器的名稱', function(){})
// 過濾器中的 function ,第一個參數,已經被規定死了,永遠都是 過濾器 管道符前面 傳遞過來的數據
/* Vue.filter('過濾器的名稱', function (data) {
return data + '123'
}) */
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}-$p6btvjt`;
} 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}-$x6wxerf ${hh}:${mm}:${ss}`;
}
}
}
使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')來填充字符串;
全局過濾器
// 定義一個全局過濾器
// 所謂的全局過濾器,就是所有的VM實例都共享的
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}-$d0zqyzr`;
} 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}-$efopi0p ${hh}:${mm}:${ss}`;
}
});
注意:當有局部和全局兩個名稱相同的過濾器時候,會以就近原則進行調用,即:局部過濾器優先于全局過濾器被調用!
鍵盤修飾符以及自定義鍵盤修飾符
1.x中自定義鍵盤修飾符【了解即可】
Vue.directive('on').keyCodes.f2 = 113;
2.x中自定義鍵盤修飾符
- 通過
Vue.config.keyCodes.名稱 = 按鍵值
來自定義案件修飾符的別名:
Vue.config.keyCodes.f2 = 113;
- 使用自定義的按鍵修飾符:
<input type="text" v-model="name" @keyup.f2="add">
自定義指令
- 自定義全局和局部的 自定義指令:
// 使用 Vue.directive() 定義全局的指令 v-focus
// 其中:參數1 : 指令的名稱,注意,在定義的時候,指令的名稱前面,不需要加 v- 前綴,
// 但是: 在調用的時候,必須 在指令名稱前 加上 v- 前綴來進行調用
// 參數2: 是一個對象,這個對象身上,有一些指令相關的函數,這些函數可以在特定的階段,執行相關的操作
Vue.directive('focus', {
bind: function (el) { // 每當指令綁定到元素上的時候,會立即執行這個 bind 函數,只執行一次
// 注意: 在每個 函數中,第一個參數,永遠是 el ,表示 被綁定了指令的那個元素,這個 el 參數,是一個原生的JS對象
// 在元素 剛綁定了指令的時候,還沒有 插入到 DOM中去,這時候,調用 focus 方法沒有作用
// 因為,一個元素,只有插入DOM之后,才能獲取焦點
// el.focus()
},
inserted: function (el) { // inserted 表示元素 插入到DOM中的時候,會執行 inserted 函數【觸發1次】
el.focus()
// 和JS行為有關的操作,最好在 inserted 中去執行,放置 JS行為不生效
},
updated: function (el) { // 當VNode更新的時候,會執行 updated, 可能會觸發多次
}
})
// 自定義一個 設置字體顏色的 指令
Vue.directive('color', {
// 樣式,只要通過指令綁定給了元素,不管這個元素有沒有被插入到頁面中去,這個元素肯定有了一個內聯的樣式
// 將來元素肯定會顯示到頁面中,這時候,瀏覽器的渲染引擎必然會解析樣式,應用給這個元素
bind: function (el, binding) {
// el.style.color = 'red'
// console.log(binding.name)
// 和樣式相關的操作,一般都可以在 bind 執行
// console.log(binding.value)
// console.log(binding.expression)
el.style.color = binding.value
}
})
// 自定義局部指令 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;
}
}
- 自定義指令的使用方式:
<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>