目錄
一. vue插值文法
二. vue指令
1. v-bind
2. v-show
3. v-if 和 v-else
4. v-else-if
5. v-for
6. v-on
7. v-html
8. v-cloak和v-text
9. v-once:
10. v-pre
11. v-model
💥 擴充:this判斷—8種指向
⬛ 總結:知識點提煉
【前文回顧】👉 vue的插值文法及常用指令的應用_02

一. vue插值文法
二. vue指令
1. v-bind
2. v-show
3. v-if 和 v-else
4. v-else-if
5. v-for
6. v-on
(1). 什麼是: 專門綁定事件的指令
(2). 何時: 今後隻要一個元素可能觸發事件,都用v-on來綁定事件.
(3). 如何:
a. 标準: <元素 v-on:事件名="處理函數名(實參值清單)">
b. 簡寫: <元素 @事件名="處理函數名(實參值清單)">
c. 更簡寫: 如果事件處理函數不需要傳參,則可以省略()
<元素 @事件名="處理函數名">
(4). 隻要界面中定義了幾個事件綁定,new Vue()中methods裡,就要定義幾個同名的方法支援:
new Vue({
el:"#app",
data:{ ... },
methods:{
處理函數(形參清單){
... this.變量名 ...
}
}
})
(5). 示例: 綁定事件處理函數,并傳參
1_v-on.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
#d1,#d2{
width:200px; height:100px;
}
#d1{
background-color:#afa
}
#d2{
background-color:#aaf
}
</style>
</head>
<body>
<div id="app">
<!--點哪個div,哪個div就可以喊自己疼!-->
<div id="d1" @click="say('d1')">d1</div>
<div id="d2" @click="say('d2')">d2</div>
<!--補:vue中凡是有綁定文法的地方,引号裡面必須是一個合法的js語句,
什麼意思呢,就是引号裡面的内容複制出來,粘貼到控制台(f12)當中能夠運作,
這裡我們傳的d1,d2是一個字元串、一個名字,不是變量,是以要加引号,又因為外面是雙引号,
裡面如果再用雙引号,不知道誰跟誰配對,是以為了避免歧義,外雙内單或是外單内雙。
另,隻有模闆字元串裡什麼都可以用
-->
</div>
<script>
new Vue({
el:"#app",
methods:{
//因為界面上需要一個事件處理函數
say(dname){
console.log(`${dname} - 疼!`)
}
}
})
</script>
</body>
</html>
運作結果:![]()
【vue】vue的常用指令及用法總結(續)_03
(6). 獲得事件對象:
a. 和DOM中完全一樣:
1). DOM中: 給事件處理函數添加第一個形參。事件發生時,浏覽器就會自動将事件對象傳遞給事件處理函數的第一個形參:
event對象
↓
元素.on事件名=function( e ){ ... e ...}
或
元素.addEventListener("事件名", function(e){ ... e ... })
2). vue中:
i. 界面中: 綁定時千萬不要加()
<元素 @事件名="處理函數">
因為加上空的(),表示什麼參數都不傳!浏覽器一旦看到空的(),就不會自動傳事件對象了!
ii. methods: {
處理函數(e){
... e和DOM中的e,完全一樣!...
}
3). 示例: 獲得滑鼠位置,實作點哪兒,喊哪兒疼!
1_v-on2.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
#d1,#d2{
width:200px; height:100px;
}
#d1{
background-color:#afa
}
#d2{
background-color:#aaf
}
</style>
</head>
<body>
<div id="app">
<!--點在div的哪個位置,就喊哪個位置疼!-->
<div id="d1" @click="say">d1</div>
<div id="d2" @click="say">d2</div>
</div>
<script>
new Vue({
el:"#app",
methods:{
//因為界面上需要一個事件處理函數
say(e){
console.log(`x:${e.offsetX},y:${e.offsetY} - 疼!`)
}
}
})
</script>
</body>
</html>
運作結果:![]()
【vue】vue的常用指令及用法總結(續)_03
4). 問題: 沖突:
a. 本來vue的事件處理函數,是可以傳實參值的
b. 但是,要想獲得事件對象e,又必須不能加()
b. 即獲得事件對象,又可傳實參值:
1). 界面中: 綁定事件處理函數時,要用$event代替事件對象。
a. 凡是$開頭的都是vue中的關鍵字,有特殊功能!不能改變!
b. 什麼是$event: 提前獲得浏覽器自動建立的事件對象!
c. 如何:
提前接住浏覽器的event對象
<元素 @事件名="處理函數($event, 其它實參值)"
2). new Vue()中:
methods:{
處理函數(e, 其它形參){
}
}
🕵️ Tips:$event和其它實參值的放置順序可以調換
3). 示例: 即獲得事件對象,又傳入其它實參值:
1_v-on3.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
#d1,#d2{
width:200px; height:100px;
}
#d1{
background-color:#afa
}
#d2{
background-color:#aaf
}
</style>
</head>
<body>
<div id="app">
<!--點在div的哪個位置,就喊哪個位置疼!-->
<div id="d1" @click="say($event, '亮哥')">亮哥</div>
<div id="d2" @click="say($event, '然哥')">然哥</div>
</div>
<script>
new Vue({
el:"#app",
methods:{
//因為界面上需要一個事件處理函數
say(e,dname){
console.log(`${dname}的x:${e.offsetX},y:${e.offsetY}位置 - 疼!`)
}
}
})
</script>
</body>
</html>
運作結果:![]()
【vue】vue的常用指令及用法總結(續)_03
7. v-html
(1). 問題: 使用{{}}綁定一段HTML内容時,顯示在頁面上的結果是未解析的原始的HTML内容。
(2). 解決: 今後隻要綁定的是一段HTML内容,都要用v-html代替{{}}
(3). 如何: <元素 v-html="變量或js表達式"> </元素>
(4). 示例: 使用v-html綁定HTML内容:
2_v-html.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<h3>{{msg}}</h3>
<h3 v-html="msg"></h3>
</div>
<script>
new Vue({
el:"#app",
data:{
msg:`來自<a href="javascript:;" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ><<新華社>></a>的消息`
}
})
</script>
</body>
</html>
運作結果:
來自<a href="javascript:;" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ><<新華社>></a>的消息
來自<<新華社>>的消息
8. v-cloak和v-text
(1). 問題: 當網速慢時,new Vue()下載下傳和運作有些延遲,對界面的解析也有些延遲。導緻使用者短暫看到{{}}文法!
(2). 解決:
a. v-cloak:
鬥篷
1). 什麼是: 專門在new Vue()加載之前,臨時隐藏元素的特殊指令
2). 何時: 今後隻要希望即使new Vue()加載之前,也不希望使用者看到{{}}時,都用v-cloak隐藏
3). 如何: 2步
a. 因為v-cloak本身不帶任何樣式!是以,必須靠我們自己定義v-cloak屬性選擇器,添加隐藏的樣式!
css中: [v-cloak]{ display:none }
b. <元素 v-cloak>
4). 原理:
i. 開局: v-cloak在元素上,發揮作用,元素隐藏
ii. 當new Vue()加載完之後,會自動掃描頁面中所有v-cloak屬性,并自動删除所有v-cloak屬性。v-cloak不再發揮作用。元素就顯示出來了。
b. v-text:
1). 什麼是: 專門代替{{}}綁定元素内容的特殊指令
2). 為什麼: 因為{{}}出現在元素的内容中,一旦解析延遲,使用者就會短暫看到{{}}。而v-text是寫在元素的開始标簽中的屬性,即使new Vue()加載延遲,使用者也不可能看到元素的屬性!
3). 何時: 今後隻要想避免使用者短暫看到{{}},都可以用v-text代替{{}}綁定元素的内容.
4). 如何: <元素 v-text="變量或表達式"> </元素>
🕵️ Tips:标簽之間的内容不用寫,因為v-text=後的"變量或表達式"會代替元素内容
5). v-text vs v-html
i. v-text和{{}}性質是一樣的,如果綁定的内容是一段HTML片段,則也不會解析,而是原樣顯示在界面上。是以,不能用v-text來綁定html片段内容.
ii. v-html可以将原始的HTML片段先解析後,再顯示給人看。是以,今後,隻要綁定的内容是HTML片段内容,都用v-html。
c. 示例: 防止使用者短暫看到{{}}
3_v-cloak_v-text.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
/*複習屬性選擇器*/
[v-cloak]{
display:none
}
</style>
</head>
<body>
<div id="app">
<h3 v-cloak>使用者名:{{uname}}</h3>
<!--js程式的底盤 -->
<h3 v-text="`積分:${score}`"></h3>
</div>
<script>
setTimeout(function(){
new Vue({
el:"#app",
data:{
uname:"dingding",
score:3000
}
})
},3000)
</script>
</body>
</html>
運作結果:![]()
【vue】vue的常用指令及用法總結(續)_03 ![]()
【vue】vue的常用指令及用法總結(續)_03
🕵️Tips:v-cloak與v-text解決的問題都是:new Vue()延遲加載時,使用者短暫看到{{}}的問題,至于使用哪個更好,沒有定論,看個人習慣
9. v-once:
(1). 什麼是: 專門控制一個元素隻在首次加載時,動态綁定一次内容。今後,即使變量發生變化,該元素也不更新。
(2). 何時: 今後隻要一個元素的内容,隻需要在首次加載時,動态綁定一次,今後,不再改變,都用v-once來修飾。
(3). 如何: <元素 v-once>
(4). 原理: 凡是帶有v-once的元素,隻在首次加載時更新内容。并不會被儲存到虛拟DOM樹。是以,即使将來變量變化,也無法通知到該元素。自然,内容不會再改變。
(5). 優化: 凡是隻在首次加載時更新,今後不更新的元素,如果用v-once标記,就不會被加入到虛拟DOM樹中。減小了虛拟DOM樹的大小,跟提高了周遊和查找的效率。
(6). 示例: 頁面顯示上線時間和目前系統時間
4_v-once.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<h3 v-once>上線時間: {{time}}</h3>
<h3>目前系統時間: {{time}}</h3>
</div>
<script>
var vm=new Vue({
el:"#app",
data:{
time:new Date().toLocaleString()
}
});
//每隔1秒,重新獲得系統時間,顯示在網頁上
setInterval(function(){
vm.time=new Date().toLocaleString();
},1000)
</script>
</body>
</html>
運作結果:
上線時間: 2020/10/26 下午2:16:42
目前系統時間: 2020/10/26 下午2:16:58
10. v-pre
(1). 什麼是: 專門保護元素内容中的{{}}不被vue編譯!
(2). 何時: 如果内容正文中,剛好有{{}},又不想被vue編譯時,就可用v-pre來保護.
(3). 如何: <元素 v-pre>
(4). 結果: 内容中的{{}}會原樣顯示在網頁中。
(5). 示例: 使用v-pre保護内容中的{{}}不被new Vue()編譯
5_v-pre.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<h3 v-pre>Vue中都是用{{變量名}}文法來标記頁面中可能發生變化的位置</h3>
</div>
<script>
new Vue({
el:"#app"
})
</script>
</body>
</html>
運作結果:
Vue中都是用{{變量名}}文法來标記頁面中可能發生變化的位置
11. v-model
(1). 什麼: v-model 指令,能輕松實作表單輸入和應用狀态之間的雙向綁定。
(2). 何時: 擷取到使用者表單送出的資料,我們通常會使用v-model指令來完成。
◼️ v-model的作用
👉 vue中使用v-model指令來實作表單元素和資料的雙向綁定。
👉 将表單中使用者送出的資訊和程式員設定的變量進行綁定。
❓ 差別于v-bind:動态更新HTML元素上的屬性的值
v-model屬性的值是一個資料的變量,如果資料的值發生變化,會影響input的值,input的值的變化同時影響資料的變化
◼️ v-mode的原理
官方文檔:『
v-model
本質上不過是文法糖。它負責監聽使用者的輸入事件以更新資料,并對一些極端場景進行一些特殊處理。』
因為官方文檔裡有說到,v-model其實是一個文法糖,他背後的原理本質上是包含兩個操作
- v-bind綁定元素的value屬性
- v-on指令給目前元素綁定input事件
是以上述代碼等價于
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
/*簡寫: <input type="text" :value="message" @input="message=$event.target.value" placeholder="請輸入"> */
<input type="text" v-bind:value="message" v-on:input="message = $event.target.value" placeholder="請輸入">
<p>輸入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
</body>
</html>
當然,我們也可以把input事件定義為一個方法去調用——v-on綁定input事件監聽到函數中,函數會擷取最新的值指派到綁定的屬性中;
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<input type="text" :value="message" @input="handleInput" placeholder="請輸入">
<p>輸入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
//對象方法簡寫
// handleInput(e){
// this.messsge = e.target.value;
// }
handleInput: function (e) {
this.messsge = e.target.value;
}
}
})
</script>
</body>
</html>
💥 擴充:this判斷—8種指向
this 8種指向: 判斷this,一定不要看定義在哪兒!隻看調用時!
➡️ 1. obj.fun() this->obj
➡️ 2. fun() 或 (function(){ ... })() 或 多數回調函數 或 定時器函數 this->window
➡️ 3. new Fun() this->new正在建立的新對象
➡️ 4. 類型名.prototype.共有方法=function(){ ... } this->将來誰調用指誰,同第一種情況
➡️ 5. DOM或jq中事件處理函數中的this->目前正在觸發事件的DOM元素對象
如果需要使用簡化版函數,必須$(this)
➡️ 6. 箭頭函數中的this->箭頭函數外部作用域中的this
➡️ 7. jQuery.fn.自定義函數=function(){ ... } this->将來調用這個自定義函數的.前的jQuery子對象,不用再$(this)
➡️ 8. new Vue()中methods中的函數中的this->目前new Vue()對象
⬛ 總結:知識點提煉
1. MVVM: 界面View+模型Model+視圖模型ViewModel
2. Vue綁定原理: 通路器屬性+虛拟DOM樹
變量被修改時: 通路器屬性發出通知,虛拟DOM樹掃描并僅更新受影響的元素
3. 虛拟DOM樹優點:
(1). 小: 隻包含可能變化的元素。
(2). 周遊查找快
(3). 修改效率高: 隻修改受影響的元素。
(4). 避免重複編碼: 已封裝DOM增删改查代碼
4. Vue功能3步:
(1). 先建立增強版的界面:
a. 整個界面必須包含在一個唯一的父元素下:
通常是<div id="app">
b. 可能變化的元素内容用{{自定義變量名}}标記
c. 觸發事件的元素用@click="自定義處理函數名"标記
(2). 再建立new Vue()對象,其中el:指向new Vue()要監控的頁面區域
(3). 在new Vue()對象内定義模型對象data和methods
a.界面所需的所有變量都放在data中
b.界面所需的所有事件處理函數都放在methods中
5. 總結: 綁定文法+13種指令
(1). 如果元素的内容需要随變量自動變化: {{}}
(2). 如果元素的屬性值需要随變量自動變化: :
(3). 控制一個元素顯示隐藏: v-show //使用display:none隐藏元素
(4). 控制兩個元素二選一顯示: v-if v-else //使用删除元素方式隐藏元素
(5). 多個元素多選一顯示: v-if v-else-if v-else
(6). 隻要反複生成多個相同結構的元素組成清單時: v-for :key="唯一辨別"
強調: 為什麼必須加:key="i"?給每個元素副本添加唯一辨別。修改數組中某個元素值時,避免重建整個清單,隻需要修改一個DOM元素副本即可!提高修改效率。
(7). 隻要綁定事件: @ $event
(8). 防止使用者短暫看到{{}}: v-cloak和v-text
(9). 隻要綁定原始HTML代碼片段内容: v-html
(10). 如果元素的内容隻在首次加載時綁定一次,之後都不會改變: v-once
優化: 減少虛拟DOM樹中元素個數。
(11). 保護内容中的{{}}不被編譯: v-pre
(12). 今後隻要想獲得表單元素的值或狀态: v-model
更多v-model指令詳解,待續...👇
【後文傳送門】👉 vue雙向資料綁定的原了解析及代碼實作_04
如果這篇【文章】有幫助到你,希望可以給【青春木魚】點個贊👍,創作不易,相比官方的陳述,我更喜歡用【通俗易懂】的文筆去講解每一個知識點,如果有對【前端技術】感興趣的小可愛,也歡迎關注❤️❤️❤️【青春木魚】❤️❤️❤️,我将會給你帶來巨大的【收獲與驚喜】💕💕!