一、內容概述:
- 插值操作
- 系結屬性
- 計算屬性
- 事件監聽
- 條件判斷
- 回圈遍歷
- 階段案例
- v-model
二、插值操作-mustache語法(掌握)
如何將data中的文本資料,插入到HTML中呢?
- 我們已經學習過了,可以通過Mustache({{}})語法(也就是雙大括號)
- Mustache:胡子/胡須
mustache語法中,不僅僅可以直接寫變數,也可以寫簡單的運算式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<h2>{{message}},welcome you</h2>
<!--mustache語法中,不僅僅可以直接寫變數,也可以寫簡單的運算式-->
<h2>{{firstName + lastName}}</h2>
<h2>{{firstName + ' ' + lastName}}</h2>
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{counter * 2}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const vue = new Vue({
el: '#app',
data: {
message: 'hello Vue!',
firstName: '你好',
lastName: 'Vue',
counter: 100
}
});
</script>
</body>
</html>
結果:

三、插值操作-其他指令使用(掌握)
v-once //值只能使用一次

v-html //決議帶有標簽的字串
結果:

v-text //展示文本不決議標簽,且會覆寫標簽中原有的文本
結果:

v-pre //原封不動的顯示文本(不決議)
結果:

v-cloak //未決議的情況不會顯示(解決閃爍問題)
了解即可
四、v-bind的基本使用(掌握)
前面我們學習的指令主要作用是將值插入到我們模板的內容當中
但是,除了內容需要動態來決定外,某些屬性我們也希望動態來系結
- 比如動態系結a元素的href屬性
- 比如動態系結img元素的src屬性
這個時候,我們可以使用v-bind指令:
作用:動態系結屬性
縮寫::
預期:any(with argument)| Object(without argument)
引數:attrOrProp(optional)
下面,我們就來具體學習v-bind的使用
v-bind基礎
v-bind用于系結一個或多個屬性值,或者向另一個組件傳遞props值(這個學到組件時再介紹)
在開發中,有哪些屬性需要動態進行系結呢?
- 還是有很多的,比如圖片的鏈接src、網站的鏈接href、動態系結一些類、樣式等等
比如通過Vue實體中的data系結元素的src和href,代碼如下:

語法糖簡寫:(用 :代替)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<!--錯誤的做法:這里不可以使用mustache語法-->
<!--<img src="{{imgURL}}" alt="">-->
<!--正確的做法:使用v-bind指令-->
<img :src="imgURL" alt="">
<a :href="aHref">百度一下</a>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
imgURL:'https://img2.baidu.com/it/u=2464877933,1986620259&fm=26&fmt=auto',
aHref:'http://www.baidu.com'
}
});
</script>
</body>
</html>
結果:

五、v-bind動態系結class【物件語法】(掌握)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
<style>
.active{
color:red;
}
</style>
</head>
<body>
<div id="app">
<!--<h2 :class="active">{{message}}</h2>-->
<!--<h2 :class="{類名1:true,類名2:boolean}">{{message}}</h2>-->
<h2 :class="{active:isActive,line:isLine}">{{message}}</h2>
<button v-on:click="btnClick">按鈕</button>//按鈕來控制類是否系結
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
isActive:true,
isLine:false
},
methods:{
btnClick:function () {
this.isActive=!this.isActive
}
}
});
</script>
</body>
</html>

不需要通過vue動態改變的class可以直接寫出來:
<h2 class="title" :class="{active:isActive,line:isLine}">{{message}}</h2>//不需要通過vue動態改變的class可以直接寫出來
改進:

總結:

六、v-bind系結class【陣列語法】(掌握)
通過上述案例,我們知道系結class有兩種方式:
- 物件語法
- 陣列語法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
<style>
.active{
color:red;
}
</style>
</head>
<body>
<div id="app">
<h2 class="title" :class="['active','line']">{{message}}</h2>
<h2 class="title" :class="[active,line]">{{message}}</h2>
<h2 class="title" :class="getClasses()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
active:'aa',
line:'bb'
},
methods:{
getClasses:function () {
return [this.active,this.line]
}
}
});
</script>
</body>
</html>

七、v-bind和v-for結合的作業布置(完成)
請看后續,,,
八、v-bind系結style(一)【物件語法】(掌握)
也有兩種語法:物件語法與陣列語法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<!--<h2 :style="{key(css屬性名):value(屬性值)}">{{message}}</h2>-->
<!--'50px'必須加上引號,否則是當做一個變數去決議兩種寫法皆可,如果不用駝峰命名法就必須加引號,否則-將被決議為減號-->
<h2 :style="{'font-size':'50px'}">{{message}}</h2>
<h2 :style="{fontSize:'50px'}">{{message}}</h2>
<!--以變數名傳入,兩種方式-->
<h2 :style="{fontSize:finalSize}">{{message}}</h2>
<h2 :style="{fontSize:finalSize2+'px'}">{{message}}</h2>
<!--多屬性-->
<h2 :style="{fontSize:finalSize2+'px',color:finalColor}">{{message}}</h2>
<!--抽象為方法-->
<h2 :style="getStyles()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
finalSize:'50px',
finalSize2:50,
finalColor:'red'
},
methods:{
getStyles:function () {
return {fontSize:this.finalSize2+'px',color:this.finalColor}
}
}
});
</script>
</body>
</html>
結果:

九、v-bind系結style(二)【陣列語法】(了解)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2 :style="[baseStyle,baseStyle2]">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
baseStyle:{backgroundColor:'red'},
baseStyle2:{fontSize:'20px'}
}
});
</script>
</body>
</html>

十、計算屬性的基本使用(掌握)
我們知道,在模板中可以直接通過插值語法顯示一些data中的資料,
但是在某些情況,我們可能需要對資料進行一些轉化后再顯示,或者需要將多個資料結合起來進行顯示
- 比如我們有fristName和lastName兩個變數,我們需要顯示完整的名稱
- 但是如果多個地方都需要顯示完整的名稱,我們就需要寫多個{{firstName}}{{lastName}}
我們可以將上面的代碼換成計算屬性:
- 計算屬性是寫在實體的computed選項中的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'小',
lastName:'明'
},
computed:{//寫計算屬性的函式
fullName:function () {
return this.firstName+' '+this.lastName
}
}
});
</script>
</body>
</html>
十一、計算屬性的復雜操作(掌握)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>總價格:{{totalPrice}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
books:[
{id:110,name:'Unix編程藝術',price:119},
{id:111,name:'代碼大全',price:105},
{id:112,name:'深入理解計算機原理',price:98},
{id:113,name:'現代作業系統',price:87}
]
},
computed:{//相比于methods(methods呼叫幾次就執行幾次,是沒有快取的,性能較低)computed只執行一次,有快取(起名字盡量為名詞)
//高階函式:filter、map、reduce
totalPrice:function () {
let result=0;
for (let i=0;i<this.books.length;i++){
result+=this.books[i].price;
}
return result;
}
}
});
</script>
</body>
</html>
結果:

十二、計算屬性setter和getter(理解)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{fullName}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'Kobe',
lastName:'Bryant'
},
computed:{
/* fullName:function () {//這是簡寫
return this.firstName+' '+this.lastName;
}*/
fullName:{//完整寫法(理解即可)
// set:function () {//計算屬性一般是沒有set方法,只讀屬性
//
// },
get:function () {
return this.firstName+' '+this.lastName;
}
}
}
});
</script>
</body>
</html>
十三、計算屬性和methods的對比(掌握)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<!--1.直接拼接,語法過于繁瑣-->
<h2>{{firstName}} {{lastName}}</h2>
<!--2.通過定義methods-->
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<!--3.通過計算屬性-->
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
<h2>{{fullName}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'Kobe',
lastName:'Bryant'
},
methods:{
getFullName:function () {
console.log('getFullName')
return this.firstName+' '+this.lastName;
}
},
computed:{
fullName:function () {
console.log('fullName')
return this.firstName+' '+this.lastName;
}
}
});
</script>
</body>
</html>

很明顯計算屬性效率高(只會執行一次,有快取)!!!!
十四、塊級作用域-let和var(掌握)
事實上var的設計可以看成JavaScript語言設計上的錯誤,但這種錯誤多半不能修復和移除,需要向后兼容
- 大概十年前,Brendan Eich就決定修復這個問題,于是他添加了一個新的關鍵字:let
- 我們可以將let看成更完美的var
塊級作用域
- JS中使用var來宣告一個變數時,變數的作用域主要是和函式的定義有關
- 針對于其他塊定義來說是沒有作用域的,比如if/for等,這在我們開發中往往會引起一些問題,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<button>按鈕1</button>
<button>按鈕2</button>
<button>按鈕3</button>
<button>按鈕4</button>
<button>按鈕5</button>
<script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<button>按鈕1</button>
<button>按鈕2</button>
<button>按鈕3</button>
<button>按鈕4</button>
<button>按鈕5</button>
<script>
//ES5之前因為if和for都沒有塊級作用域的概念,所以在很多時候,我們必須借助于function的作用域來解決應用外面變數的問題
//ES6中,加入了let,let它是有if和for的塊級作用域
// //1.變數作用域:變數在什么范圍內是可用的
// {
// var name='why';//var沒有塊級作用域
// console.log(name);
// }
// console.log(name)//原則上不能訪問
//2.沒有塊級作用域引起的問題(if的塊級)
// var func;
// if(true){
// var name='why';
// func=function () {
// console.log(name);
// }
// // func();
// }
// name='kobe'
// func();
// // console.log(name)
//for回圈也是沒有作用域的
// var btns=document.getElementsByTagName('button');
// for(var i=0;i<btns.length;i++){
// btns[i].addEventListener("click",function () {
// console.log('第' + i + '個按鈕被點擊');
// })
// }
//為什么閉包可用解決(因為函式是一個作用域)
// var btns=document.getElementsByTagName('button');
// for(var i=0;i<btns.length;i++){
// (function (i) {
// btns[i].addEventListener("click",function () {
// console.log('第' + i + '個按鈕被點擊');
// })
// })(i)
// }
//正確寫法:
const btns=document.getElementsByTagName('button');
for(let i=0;i<btns.length;i++){
(function (i) {
btns[i].addEventListener("click",function () {
console.log('第' + i + '個按鈕被點擊');
})
})(i)
}
</script>
</body>
</html>
十五、三種方案對比-ES5沒有閉包-有閉包-ES6的let(理解)
var宣告的是全域變數,let是區域變數
十六、const的使用和注意點
const關鍵字
- 在很多語言中已經存在,比如c/c++中,主要的作用是將某個變數修飾為常量
- 在JavaScript中也是如此,使用const修飾的識別符號為常量,不可以再次賦值
什么時候使用const呢?
- 當我們修飾的識別符號不會被再次賦值的時,就可以使用const來保證資料的安全性
- 建議在ES6開發中,優先使用const,只有需要改變某一識別符號的時候才使用let
const的注意:
一、不可再次賦值
二、const修飾的識別符號必須賦值
三、常量的含義是指向的物件不能修改,但是可以改變物件內部的屬性
十七、ES6物件字面量增強寫法(掌握)
ES6中,對物件字面量進行了很多增強
什么叫字面量呢?
<script>
const obj={};//這樣的寫法就叫物件的字面量
</script>
屬性簡寫
ES5的寫法:
const name='why';
const age=18;
const height=1.88;
//將上面屬性寫入物件中
//曾經的寫法
const obj={
name:name,
age:age,
height:height
}
console.log(obj)

ES6增強寫法:
const obj={
name,age,height
}
console.log(obj)

函式簡寫:
//函式的增強寫法
//ES5:
const obj={
run:function () {
},
eat:function () {
}
}
//ES6:
const obj2={
run(){
},
eat(){
}
}
JavaScript仍然存在缺陷,有以下升級版:
Angular---->google
TypeScript---->microsoft—>(型別檢測功能)
flow---->(facebook)
十八、v-on的基本使用和語法糖(掌握)
在前端開發中,我們需要經常和用戶互動
- 這個時候,我們就必須監聽事件發生的時間,比如切換,拖拽,鍵盤事件等等
- 在Vue中如何監聽事件呢?使用v-on指令
v-on介紹
- 作用:系結事件監聽器
- 縮寫:@
- 預期:Function| Inline Statement| Object
- 引數:event
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{counter}}</h2>
<button @click="increment()">+</button>
<button @click="decrement()">-</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
counter: 0
},
methods:{
increment(){
this.counter++;
},
decrement(){
this.counter--;
}
}
});
</script>
</body>
</html>
十九、v-on的引數傳遞問題(掌握)
-
當通過methods中定義方法,以供@click呼叫時,需要注意引數問題:
-
情況一:如果該方法不需要額外引數,那么方法后的()可以不添加
- 但是注意:如果方法本身中有一個引數,那么會默認將原生事件event引數傳遞進去
-
情況二:如果需要同時傳入某個引數,同時需要event時,可以通過$event傳入事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<!--事件呼叫的方法沒有引數-->
<button @click="btn1Click()">按鈕1</button>
<button @click="btn1Click">按鈕2</button>
<!--在事件定義時,寫方法時省略了小括號,但是方法本身是需要一個引數的,這個時候,
Vue會默認將瀏覽器產生的event事件物件作為引數傳入到方法-->
<!-- <button @click="btn2Click(123)">按鈕2</button>
<button @click="btn2Click()">按鈕2</button>-->
<button @click="btn2Click(111)">按鈕2</button>
<!--方法定義時,我們需要event物件,同時又需要其他引數-->
<!--在呼叫方法時,如何手動的獲取到瀏覽器引數的event物件:$event-->
<button @click="btn3Click(abc,$event)">按鈕三</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
abc:123
},
methods:{
btn1Click(){
console.log("btn1Click")
},
btn2Click(a){
console.log("-----",a)
},
btn3Click(abc,event){
console.log("::::",abc,event);
}
}
});
</script>
</body>
</html>

二十、v-on修飾符
- 在某些情況下,我們拿到event的目的可能是進行一些事件處理
- Vue提供了修飾符來幫助我們方便的處理一些事件:
- .stop – 呼叫 event.stopPropagation()
- .prevent – 呼叫 event.preventDefault()
- .(keyCode | keyAlias) – 只當事件是從特定鍵觸發時才觸發回呼
- .native – 監聽組件根元素的原生事件
- .once – 只觸發一次回呼
.stop修飾符阻止事件冒泡:

不用修飾符的情況下點擊按鈕:

加上修飾符:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Title</title>
</head>
<body>
<div id="app">
<div @click="btn1Click()">
父盒子
<button @click.stop="btn2Click()">按鈕</button>
</div>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
},
methods:{
btn1Click(){
console.log("btn1Click")
},
btn2Click(){
console.log("btn2Click")
}
}
});
</script>
</body>
</html>
再次點擊按鈕,不再冒泡:

.prevent修飾符阻止默認事件:


.keyAlias監聽鍵帽的點擊(keyAlias是一系列事件):

以enter為例:


.once只觸發一次修飾符:


休息,后續待更新,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/301774.html
標籤:其他




