Vue官方文檔=>>>首頁(yè)-學(xué)習(xí)下拉欄-文檔-教程 =>火速一鍵進(jìn)入學(xué)習(xí)
漸進(jìn)式JavaScript框架:就是用你想用或者能用的功能特性齐饮,你不想用的部分功能可以先不用绎橘。VUE不強(qiáng)求你一次性接受并使用它的全部功能特性劫狠。(當(dāng)然也可以從頭到尾全部用Vue搭建)
一、初始Vue
1.給Vue準(zhǔn)備一個(gè)容器
(它需要一個(gè)DOM容器牌借,給vue去使用)
<div id="app">
<h2>姓名:{{name}}</h2>
<h2>年齡:{{age}}</h2>
<!-- v-on:指令用于綁定事件 -->
<button v-on:click="updateName">修改姓名</button>
<button v-on:click="updateAge">修改年齡</button>
</div>
vue的點(diǎn)擊事件綁定 <button v-on:click="方法名">修改姓名</button>
(小回顧)
bindtap="方法名" //微信小程序的觸屏綁定
onclick="方法名()" //原生的點(diǎn)擊綁定
2.引入vue.js文件
方式1:引入本地vue.js文件
<!-- 開(kāi)發(fā)版本 -->
<script src="../js/vue.js"></script>
<!-- 生產(chǎn)版本 (打包上線時(shí)使用此版本)-->
<script src="../js/vue.min.js"></script>
方式2:通過(guò)CDN引入
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
3.創(chuàng)建一個(gè)Vue對(duì)象
let vm = new Vue({
//指定當(dāng)前Vue對(duì)象操作的DOM容器
el:'#app',
//定義當(dāng)前Vue對(duì)象管理的數(shù)據(jù)
data:{
name:'張三',
age:20
},
//定義當(dāng)前Vue對(duì)象管理的方法
methods: {
//修改姓名的方法
updateName(){
this.name = '李四'
},
//修改年齡的方法
updateAge(){
this.age = 30
}
},
})
在vue的配置選項(xiàng)里面宿刮,定義的所有的數(shù)據(jù)以及定義的所有方法,都會(huì)成為Vue的屬性。
在方法里面貌夕,this指向的是對(duì)象本身。
以下為網(wǎng)頁(yè)顯示效果:el:' #容器的id '民镜, // 指定當(dāng)前Vue對(duì)象操作的DOM容器
data: { }啡专, // 定義當(dāng)前Vue對(duì)象管理的數(shù)據(jù)
methods: { }, // 定義當(dāng)前Vue對(duì)象管理的方法
點(diǎn)擊 修改姓名-- 姓名變成李四
點(diǎn)擊 修改年齡-- 年齡變成30
*小注意:初創(chuàng)建vue制圈,會(huì)出現(xiàn)以下2條提示:
*解決方法:
下載安裝vue-devtools工具(官方調(diào)試工具)植旧,
關(guān)閉生產(chǎn)提示:創(chuàng)建Vue對(duì)象前先鍵入: Vue.config.productionTip = false
*安裝vue-devtools工具后,可進(jìn)入后臺(tái)离唐,進(jìn)入Vue的調(diào)試工具以檢查我的數(shù)據(jù)
二病附、Vue的響應(yīng)式原理
1.理解什么是代理對(duì)象
- 1.定義源對(duì)象
let obj1 = {
name:'張三',
age:20
}
- 2.定義代理對(duì)象
let obj2 = obj1;
console.log('obj2:',obj2);
//代理對(duì)象修改了源對(duì)象的數(shù)據(jù)
obj2.name = '李四';
obj2.age = 30;
console.log(obj1); //{name: '李四', age: 30}
obj2是obj1的代理對(duì)象,代理對(duì)象修改了源對(duì)象的數(shù)據(jù)亥鬓。
通過(guò)obj2 修改了obj1 的姓名和年齡完沪,那obj1也變了哦~
2.看一下Vue是如何使用代理對(duì)象的
- 1.定義源對(duì)象(就是定一份數(shù)據(jù))
let myData = {
name:'張三',
age:20
}
-
2.將一個(gè)數(shù)據(jù)傳遞給Vue的data選項(xiàng)(背后做了兩件事情)
1)設(shè)置Vue實(shí)例的_data屬性,作為當(dāng)前源對(duì)象的代理對(duì)象嵌戈。(響應(yīng)式的核心)
2)將_data里面代理的所有數(shù)據(jù)覆积,再添加到當(dāng)前Vue實(shí)例身上。(為了Vue實(shí)例方便調(diào)用數(shù)據(jù))
let vm = new Vue({
data:myData //把myData這個(gè)對(duì)象傳給了vue實(shí)例
})
vm._data.name = '李四'; //data和_data互相影響熟呛,一方變另一方也變
vm._data.age = 30;
console.log(vm);
console.log(myData);
因?yàn)閷?duì)象是引用類型宽档,在傳遞時(shí),傳的是地址庵朝。
操作_data吗冤,真正改變的是data,此時(shí)就可以將_data當(dāng)做是data的代理對(duì)象九府。
3.給對(duì)象添加屬性的幾種方式
let obj3 = {}
- 方式一:
obj3.name = '張三';
- 方式二:
obj3['age'] = 20;
- 方式三:
Object.defineProperty(obj3,'sex',{
value:'男', //屬性值
enumerable:true, //允許被枚舉(默認(rèn)不允許)
configurable:true //允許被刪除(默認(rèn)不允許)
})
console.log(obj3);
Object.defineProperty( 對(duì)象名椎瘟,屬性名,{ 屬性值 } )
通過(guò)Object對(duì)象的defineProperty方法侄旬,給指定的對(duì)象添加指定的屬性肺蔚。
使用這種方式,給對(duì)象添加的屬性儡羔,默認(rèn)不可被枚舉宣羊,不能被刪除;
使用這種方式汰蜘,給對(duì)象添加的屬性仇冯,對(duì)屬性的保護(hù)措施更加嚴(yán)格。
//枚舉出對(duì)象的所有屬性(其實(shí)就遍歷出對(duì)象的所有屬性名)
for(let key in obj3){
console.log(key);
}
//通過(guò)delete關(guān)鍵鉴扫,可以刪除對(duì)象身上的指定屬性
delete obj3.name
delete obj3.sex
console.log(obj3);
如果沒(méi)有設(shè)置enumerable
值和configurable
值赞枕,那就不可以遍歷出對(duì)象的屬性名,也不可以刪除哦
*此處插個(gè)播坪创,看看不要錢 JavaScript中的可枚舉屬性與不可枚舉屬性
4.Vue響應(yīng)式的原理 ★★★★★
<div>
<h2>姓名:<span id="name"></span></h2>
<h2>年齡:<span id="age"></span></h2>
</div>
- 1.定義一個(gè)源對(duì)象
let data = {
name:'張三',
age:20
}
- 2.定義一個(gè)代理對(duì)象(使用_data 去代理 data)
let _data = {}
- 3.使用Object.defineProperty給代理對(duì)象添加屬性
Object.defineProperty(_data,'name',{
//這里除了寫value炕婶,還可以寫2個(gè)方法哦~
//get方法,用于返回屬性的值(當(dāng)我們調(diào)用name屬性獲取值時(shí)莱预,會(huì)調(diào)用get方法)
get(){
// console.log('get方法執(zhí)行了');
return data.name
},
//set方法柠掂,用于設(shè)置屬性的值(當(dāng)我們調(diào)用name屬性設(shè)置值時(shí),會(huì)調(diào)用set方法)
set(val){
// console.log('set方法執(zhí)行了');
data.name = val
//當(dāng)代理對(duì)象依沮,監(jiān)聽(tīng)到數(shù)據(jù)發(fā)生變化了涯贞,就會(huì)重新渲染頁(yè)面
document.querySelector('#name').innerHTML = data.name
}
})
Object.defineProperty(_data,'age',{
get(){
return data.age
},
set(val){
data.age = val
//當(dāng)代理對(duì)象,監(jiān)聽(tīng)到數(shù)據(jù)發(fā)生變化了危喉,就會(huì)重新渲染頁(yè)面
document.querySelector('#age').innerHTML = data.age
}
})
console.log(_data.name);
console.log(_data.age);
_data.name = '李四'
_data.age = 30
console.log(data);
除了寫value宋渔,還可以寫2個(gè)方法哦~
- get方法,用于返回屬性的值(當(dāng)我們調(diào)用name屬性獲取值時(shí)辜限,會(huì)調(diào)用get方法)
-
set方法皇拣,用于設(shè)置屬性的值(當(dāng)我們調(diào)用name屬性設(shè)置值時(shí),會(huì)調(diào)用set方法)
當(dāng)代理對(duì)象薄嫡,監(jiān)聽(tīng)到數(shù)據(jù)發(fā)生變化時(shí)氧急,就會(huì)重新渲染頁(yè)面
三、Vue的常用指令
v-bind: 用于綁定屬性毫深,通過(guò) v-bind: 綁定過(guò)的屬性吩坝,可以在屬性值可以寫表達(dá)式。
v-bind: 可以用 : 簡(jiǎn)寫哑蔫。
v-on: 用于綁定事件钉寝,通過(guò)v-on:綁定過(guò)的事件,可以指定Vue實(shí)例定義的方法闸迷。
v-on: 可以用@簡(jiǎn)寫瘩蚪。
v-model 指令,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的雙向綁定稿黍,v-model指令是 v-bind:value 和 v-on:input 的簡(jiǎn)寫疹瘦。
來(lái)看看吧=>>>
<!-- 我們需要一個(gè)容器 -->
<div id="app">
<div>
<span>姓名:</span>
<input type="text" v-bind:value="name">{{name}}
</div>
<div>
<span>年齡:</span>
<input type="text" :value="age">{{age}}
</div>
</div>
<script src="../js/vue.js"></script>
<script>
// 關(guān)閉生產(chǎn)提示
Vue.config.productionTip = false
// 用vm接收一下
let vm = new Vue({
el: '#app',
data: {
name: '張三',
age: 20,
}
})
</script>
以上,到目前為止是單向綁定巡球。
通過(guò)在后臺(tái) vm.data = '李四' 言沐,可以把頁(yè)面的數(shù)據(jù)改掉;但是在頁(yè)面的 input 中做修改并不會(huì)改變后臺(tái)的數(shù)據(jù)哦~
問(wèn)題來(lái)了:如何給它做雙向綁定呢酣栈?
綁定一個(gè)input事件 险胰,
代碼如下:
<div id="app">
<div>
<span>姓名:</span>
<input type="text" v-bind:value="name" v-on:input="updateName">{{name}}
</div>
<div>
<span>年齡:</span>
<!-- 如果事件方法的代碼不是很多,可以寫在行內(nèi)矿筝,注意:這里不能寫this起便,$event是事件對(duì)象 -->
<input type="text" :value="age" @input="age = $event.target.value">{{age}}
</div>
<div>
<span>工作:</span>
<input type="text" v-model="job">{{job}}
</div>
</div>
let vm = new Vue({
el: '#app',
//數(shù)據(jù)
data: {
name: '張三',
age: 20,
job: '程序員'
},
methods: {
updateName(e){ //這邊可以接收一個(gè)事件對(duì)象e,可以通過(guò)e.target獲取當(dāng)前元素
this.name = e.target.value // 獲取文本框里面的內(nèi)容,更新數(shù)據(jù)
}
},
})
設(shè)置了一個(gè)更新姓名的方法榆综,該方法更新name屬性值
注意:在調(diào)用方式時(shí)妙痹,如果沒(méi)有傳遞參數(shù),那么事件方法會(huì)默認(rèn)傳一個(gè)事件對(duì)象參數(shù)鼻疮。
這里邊接收事件對(duì)象 e
怯伊,可以通過(guò) e.target
獲取當(dāng)前元素
e.target.value
獲取文本框里面的內(nèi)容
this.name = e.target.value
更新數(shù)據(jù)
如果事件方法的代碼不是很多,可以寫在行內(nèi)判沟,
注意:不能寫 this 耿芹。示例:
<input type="text" :value="age" @input="age = $event.target.value">
四、Vue的條件渲染和列表渲染
1.條件渲染
-
v-if 條件渲染
代碼如下:
<!-- 根據(jù)成績(jī)挪哄,顯示下面的等級(jí) -->
<div id="app">
<h2 v-if="score>=90">優(yōu)秀</h2>
<h2 v-else-if="score>=80">良好</h2>
<h2 v-else-if="score>=70">中等</h2>
<h2 v-else-if="score>=60">合格</h2>
<h2 v-else>差</h2>
</div>
<script src="../js/vue.js"></script>
<script>
Vue.config.productionTip = false
new Vue({
el:'#app',
data:{
score:55,
}
})
</script>
頁(yè)面效果:- v-if / v-show 條件渲染
v-if 指令用于條件渲染,表達(dá)式返回true迹炼,顯示元素砸彬;否則不顯示元素。
v-if 每次根據(jù)isShow的值疗涉,確定是否渲染頁(yè)面拿霉。
v-show 指令也是用于條件渲染,表達(dá)式返回true咱扣,顯示元素绽淘;否則不顯示元素。
v-show 模板已經(jīng)渲染成功闹伪,通過(guò)樣式控制顯示隱藏沪铭。
<div id="app">
<!-- 根據(jù)成績(jī),顯示下面的等級(jí) -->
<h2 v-if="score>=90">優(yōu)秀</h2>
<h2 v-else-if="score>=80">良好</h2>
<h2 v-else-if="score>=70">中等</h2>
<h2 v-else-if="score>=60">合格</h2>
<h2 v-else>差</h2>
<hr>
<button @click="isShow=!isShow">顯示/隱藏</button>
<!-- v-if 每次要根據(jù)isShow的值偏瓤,確定是否渲染頁(yè)面 -->
<div v-if="isShow">
<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201804%2F28%2F20180428174908_sgsyj.thumb.1000_0.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1640144539&t=de45197a8aa3bf884b08b791723e7ed0">
</div>
<hr>
<!-- v-show 模板已經(jīng)渲染成功杀怠,通過(guò)樣式控制顯示隱藏 -->
<div v-show="isShow">
<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic40.nipic.com%2F20140428%2F9081536_114914525167_2.jpg&refer=http%3A%2F%2Fpic40.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1640144712&t=1261090ac684bf8e3c83f61ed012a2a7">
</div>
</div>
<script src="../js/vue.js"></script>
<script>
Vue.config.productionTip = false
new Vue({
el:'#app',
data:{
score:55,
isShow:false
}
})
</script>
問(wèn)題來(lái)了:v-if 和 v-show 如何選擇??
- 如果頁(yè)面需要反復(fù)切換顯示和隱藏厅克,用v-show赔退。
- 如果頁(yè)面中有很多模塊需要隱藏,用戶可能只對(duì)其中的某個(gè)模塊感興趣证舟,用v-if硕旗,所有的模塊首屏加載時(shí),全部都不渲染女责,當(dāng)用戶選擇指定的模塊后漆枚,再渲染指定的模塊。
(超多模塊如果用v-if很耗性能的抵知!達(dá)咩墙基!)
2.列表渲染
- v-for 列表渲染
v-for 指令软族,用于列表渲染;類型渲染時(shí)残制,通常都要綁定key立砸,key的作用是提高渲染性能。
注意:key必須是唯一痘拆,暫時(shí)可以將列表的索引作為key值去使用仰禽。
代碼如下:
<div>
<ul>
<li v-for="(item,index) in foods" :key="index">{{index}}--{{item.name}}--{{item.price}}</li>
</ul>
</div>
<script>
Vue.config.productionTip = false
new Vue({
el:'#app',
data:{
score:55,
isShow:false,
foods:[
{
id:1,
name:'薯片',
price:7.9
},
{
id:2,
name:'餅干',
price:3.9
},
{
id:3,
name:'面包',
price:9.9
},
{
id:4,
name:'蛋糕',
price:16.9
}
]
}
})
</script>
頁(yè)面效果:-
練習(xí):輪播圖
第一種寫法:后臺(tái)查看氮墨,頁(yè)面會(huì)有5張圖片纺蛆,通過(guò)display去顯示或者隱藏(不太好)
<div id="app">
<img v-for="(item,index) in imgs" :src="item" v-show="index===showActive" >
</div>
<script>
Vue.config.productionTip = false
new Vue({
el:'#app',
data:{
//顯示的下標(biāo)
showActive:0,
//圖片數(shù)組
imgs:["http://p1.music.126.net/7zAkp74zoKd0LuEuEP6dOg==/109951166645160829.jpg?imageView&quality=89",
"http://p1.music.126.net/pkXsmqmFQOehNkJYmehkng==/109951166646695577.jpg?imageView&quality=89",
"http://p1.music.126.net/c1olbeIgiVsj9I39fCUXkQ==/109951166644891380.jpg?imageView&quality=89",
"http://p1.music.126.net/JMYet32O1mi6-YZ1GGSYcQ==/109951166646419732.jpg?imageView&quality=89",
"http://p1.music.126.net/WCX5Cq1z17Du2z0QBEcEaA==/109951166645933077.jpg?imageView&quality=89"]
},
//生命周期函數(shù)(表示頁(yè)面掛載完成)
mounted() {
setInterval(() => {
this.showActive++
//如果下標(biāo)越界,重新從0開(kāi)始
if(this.showActive>=5) this.showActive = 0
}, 3000);
},
})
</script>
v-for 列表渲染规揪,循環(huán)出item和index(在組件中使用v-for循環(huán)時(shí),或在一些特殊情況中,如果v-for有問(wèn)題,必須在使用v-for的同時(shí),指定唯一的 字符串/數(shù)字 類型 :key值桥氏。)
:src綁定imgs這個(gè)數(shù)組的item
v-show 條件渲染,表達(dá)式返回true猛铅,顯示元素字支;否則不顯示元素
-- 此時(shí)頁(yè)面效果為 顯示 下標(biāo)為0的那張圖片 ,3秒后換下一張 --
mounted() { } 這個(gè)函數(shù)奸忽,是生命周期函數(shù)(表示頁(yè)面掛載完成)堕伪,
這里并沒(méi)有調(diào)用,但它會(huì)自己執(zhí)行哦栗菜。
第二種寫法:
<div id="app">
<img :src="imgs[showActive]" >
</div>
只需要綁定一個(gè) :src = imgs數(shù)組[索引]
因?yàn)樵趕cript里設(shè)定了定時(shí)器欠雌,且this.showActive++ 索引會(huì)自己變,然后mounted() { } 這個(gè)函數(shù)自己執(zhí)行疙筹,頁(yè)面會(huì)更新富俄。
(未完待續(xù)...loading...)