一、初始Vue
1、準(zhǔn)備一個(gè)容器
<div id="app">
<h2>姓名:{{name}}</h2>
<h2>年齡:{{age}}</h2>
<!-- v-on:指令用于綁定事件 -->
<button v-on:click="updateName">修改姓名</button>
<button v-on:click="updateAge">修改年齡</button>
</div>
2、引入vue.js文件
方式(1)引入本地vue.js文件
<!-- 開發(fā)版本 -->
<script src="../js/vue.js"></script>
<!-- 生產(chǎn)版本(打包上線時(shí)使用) -->
<!-- <script src="../js/vue.min.js"></script> -->
方式(2)通過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ì)象
注意:初次使用vue,控制臺(tái)會(huì)有兩條提示。

如果想去掉這兩條信息,可以選擇安裝vue-devtools,引入生產(chǎn)版本的vue.js。
也可以使用以下代碼消除:
// 不允許 vue-devtools 檢查代碼
Vue.config.devtools = false
// vue 在啟動(dòng)時(shí)不顯示生產(chǎn)提示
Vue.config.productionTip = false
創(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
}
},
})
4、效果

點(diǎn)擊修改按鈕

二、Vue的響應(yīng)式原理
1、代理對(duì)象的基本理解
// (1)定義源對(duì)象obj1
let obj1 = {
name:'張三',
age:20
}
// (2)定義代理對(duì)象obj2,代理源對(duì)象obj1
let obj2 = obj1
console.log('obj2:',obj2);
// 代理對(duì)象修改了源對(duì)象的數(shù)據(jù)
obj2.name = '李四'
obj2.age = 30
console.log(obj1); // {name: "李四", age: 30}
2、vue的data和_data
// (1)定義源對(duì)象
let myData = {
name: '張三',
age: 20
}
let vm = new Vue({
// (2)將源對(duì)象傳遞給Vue的data,背后做了兩件事
// ① 設(shè)置Vue實(shí)例的_data屬性,作為當(dāng)前源對(duì)象的代理對(duì)象。(響應(yīng)式的核心)
// ② 將_data里面代理的所有數(shù)據(jù),再添加到當(dāng)前Vue實(shí)例身上,也就是vm身上。(方便直接調(diào)用數(shù)據(jù))
data:myData
})
// 通過改變vue實(shí)例的屬性可以改變?cè)磳?duì)象的屬性值
vm.name = '王五'
vm.age = 40
console.log(myData); // {name: "王五", age: 40}
3、給對(duì)象添加屬性的幾種方式
方式(1)使用點(diǎn) .
let obj3 = {}
obj3.name = '張三'
方式(2)使用中括號(hào) [ ]
obj3['age'] = 20
方式(3)defineProperty方法
通過Object對(duì)象的defineProperty方法,給指定的對(duì)象添加指定的屬性。
使用這種方式,給對(duì)象添加的屬性,默認(rèn)不可被枚舉,不能被刪除;對(duì)屬性的保護(hù)措施更加嚴(yán)謹(jǐn)。
Object.defineProperty(obj3,'sex',{
// 屬性值
value:'男',
// 允許被枚舉(默認(rèn)不允許)
enumerable:true,
// 允許被刪除(默認(rèn)不允許)
configurable:true
})
// 枚舉出對(duì)象的所有屬性(其實(shí)就遍歷出對(duì)象的所有屬性名)
// 如果sex屬性沒有設(shè)置允許被枚舉,就不能被枚舉
for(let key in obj3){
console.log(key);
}
// 通過delete關(guān)鍵,可以刪除對(duì)象身上的指定屬性
delete obj3.name
delete obj3.sex // 如果sex屬性沒有設(shè)置允許被刪除,就不能被刪除
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
}
//在頁面中,顯示姓名和年齡
document.querySelector('#name').innerHTML = data.name
document.querySelector('#age').innerHTML = data.age
// (2)定義一個(gè)代理對(duì)象(使用_data 去代理 data)
let _data = {}
// (3)使用Object.defineProperty給代理對(duì)象添加屬性
Object.defineProperty(_data,'name',{
// 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)聽到數(shù)據(jù)發(fā)生變化了,就會(huì)重新渲染頁面
document.querySelector('#name').innerHTML = data.name
}
})
Object.defineProperty(_data,'age',{
get(){
return data.age
},
set(val){
data.age = val
// 當(dāng)代理對(duì)象,監(jiān)聽到數(shù)據(jù)發(fā)生變化了,就會(huì)重新渲染頁面
document.querySelector('#age').innerHTML = data.age
}
})
// 改變代理對(duì)象_data的數(shù)據(jù),頁面會(huì)重新渲染
_data.name = '李四'
_data.age = 40
三、Vue的常用指令
v-bind:用于綁定屬性,通過v-bind:綁定過的屬性,可以在屬性值可以寫表達(dá)式。v-bind:可以用 : 簡寫。
v-on:用于綁定事件,通過v-on:綁定過的事件,可以指定Vue實(shí)例定義的方法。v-on:可以用 @ 簡寫。
v-model指令可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的雙向綁定。所謂雙向綁定指的是:數(shù)據(jù)發(fā)生變化重新渲染頁面,頁面數(shù)據(jù)發(fā)生變化更新回?cái)?shù)據(jù)。v-model指令是 v-bind:value 和 v-on:input 的簡寫。
實(shí)現(xiàn)數(shù)據(jù)改變時(shí),文本框的值會(huì)隨之改變;輸入框文本改變時(shí),數(shù)據(jù)也會(huì)隨之更改。
<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,返回的就是事件對(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>
<script>
let vm = new Vue({
el: '#app',
//數(shù)據(jù)
data: {
name: '張三',
age: 20,
job:'程序員'
},
methods: {
updateName(e){
//獲取文本框里面的內(nèi)容,更新數(shù)據(jù)
this.name = e.target.value
}
}
})
</script>
四、條件渲染和列表渲染
1、條件渲染
可以使用v-if 或者v-show實(shí)現(xiàn)條件渲染。
★ v-if 和 v-show 如何選擇
① 如果頁面需要反復(fù)切換顯示和隱藏,用v-show。
② 如果頁面中有很多模塊需要隱藏,用戶可能只對(duì)其中的某個(gè)模塊感興趣,用v-if。所有的模塊首屏加載時(shí),全部都不渲染,當(dāng)用戶選擇指定的模塊后,再渲染指定的模塊。
<div id="app">
<!-- 根據(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>
<!-- 每次要根據(jù)isShow的值,確定是否渲染頁面 -->
<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>
<!-- 模板已經(jīng)渲染成功,通過樣式控制顯示隱藏 -->
<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>
new Vue({
el:'#app',
//定義數(shù)據(jù)
data:{
score:55,
isShow:false
}
})
</script>
2、列表渲染
v-for指令:用于列表渲染;列表渲染時(shí),通常都要綁定key,key的作用是提高渲染性能。
注意:key必須是唯一,暫時(shí)可以將列表的索引作為key值去使用。
<div id="app">
<ul>
<li v-for="(item,index) in foods" :key="index">{{index}}--{{item.name}}--{{item.price}}</li>
</ul>
</div>
<script>
new Vue({
el:'#app',
//定義數(shù)據(jù)
data:{
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>
五、小練習(xí)之輪播圖
<div id="app">
<img :src="imgs[showActive]" >
</div>
<script>
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ù)(表示頁面掛載完成)
mounted() {
setInterval(() => {
this.showActive++
//如果下標(biāo)越界,重新從0開始
if(this.showActive>=5) this.showActive = 0
}, 3000);
},
})
</script>