Vue監(jiān)視數(shù)據(jù)的原理詳解
1. Vue監(jiān)視數(shù)據(jù)的原理(set方法)
1.1 Vue監(jiān)視不同類型數(shù)據(jù)的原理
特點:vue會監(jiān)視data中所有層級的數(shù)據(jù),并且如果他檢測到是對象那么就會給對象里面所有的屬性配置getter和setter函數(shù)
1.1.1 如何監(jiān)測對象中的數(shù)據(jù)?
通過setter實現(xiàn)監(jiān)視,且要在new Vue時就傳入要監(jiān)測的數(shù)據(jù)
?(1).對象中后追加的屬性,Vue默認(rèn)不做響應(yīng)式處理(就是沒有配置getter和setter函數(shù))
(2).如需給后添加的屬性做響應(yīng)式,請使用如下API:
? Vue.set(target,propertyName/index,value)
? vm.$set(target,propertyName/index,value)
1.1.2 如何監(jiān)測數(shù)組中的數(shù)據(jù)?
通過包裹數(shù)組更新元素的方法實現(xiàn),本質(zhì)就是做了兩件事:
(1). 調(diào)用原生對應(yīng)的方法對數(shù)組進(jìn)行更新。 (2). 重新解析模板,進(jìn)而更新頁面。
在Vue修改數(shù)組中的某個元素一定要用如下方法:
? (1). 使用這些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
? (2). Vue.set() 或 vm.$set()
1.1.3 小案例
<div id="root">
<h2>人員信息</h2>
<button @click="updatep">點擊更新馬東梅的信息</button>
<ul>
<li v-for='p in person' :key="p.id">
{{p.name}} -- {{p.age}} -- {{p.gender}}
</li>
</ul>
<button @click="addNew">在結(jié)尾添加一個人的信息</button>
</div>
<script>
Vue.config.productionTip = false
let vm = new Vue({
el: '#root',
data: {
person: [
{ id: "001", name: "馬冬梅", age: 20, gender: "女" },
{ id: "002", name: "夏洛特", age: 33, gender: "男" },
{ id: "003", name: "沈騰", age: 50, gender: "男" },
{ id: "004", name: "賈玲", age: 45, gender: "女" },
]
},
methods: {
updatep() {
// 但是下面方法不奏效,此方法Vue檢測不到,
// 原因是因為數(shù)組上面沒有g(shù)etter和setter方法所以檢測不到數(shù)據(jù)發(fā)生改變
// this.person[0] = {id:"001",name:"李煥英",age:66,gender:"女"}
// 下面方法奏效,是因為屬性上面已經(jīng)配置了getter和setter方法
// this.person[0].name = "李煥英"
// this.person[0].age = "66"
// this.person[0].gender = "女"
// this.person.splice(0, 1, { id: "001", name: "李煥英", age: 66, gender: "女" })
this.$set(this.person, 0, { id: "001", name: "李煥英", age: 66, gender: "女" })
},
addNew() {
this.person.push({id: "005", name: "老妹啊", age: 99, gender: "女"})
}
},
})
</script>
1.1.4 set()小案例
<div id="root">
<h2>學(xué)生信息</h2>
<p>姓名:{{student.name}}</p>
<!--
一個很重要的點:如果是查找對象中不存在的屬性,返回的是一個undefined
不管v-show或者是v-if,如果等到undefined的就不顯示
-->
<p v-show="student.sex">性別:{{student.sex}}</p>
<p>年齡:{{student.age}}</p>
<p>地址:{{student.address}}</p>
<p>聯(lián)系方式:{{student.contact}}</p>
朋友:<p v-for="(v,index) in student.friends" :key="index">{{v.name}} -- {{v.age}}</p>
<button @click="add">點擊添加性別</button>
</div>
<script>
Vue.config.productionTip = false
let vm = new Vue({
el: '#root',
data: {
student: {
name: "Jack",
age: 18,
address: "北京",
contact: "13xxxxxxx56",
friends: [
{ name: 'Mark', age: 12 },
{ name: 'Lisa', age: 52 },
{ name: 'Guli', age: 25 },
]
}
},
methods: {
add() {
兩種寫法都可以
// this.$set(vm.student,"sex","男")
Vue.set(this.student,"sex","男")
}
},
})
</script>
總結(jié)
以上就是今天要講的內(nèi)容,本文介紹了Vue監(jiān)視數(shù)據(jù)的原理和set方法,該部分很重要需要好好理解,希望對大家有所幫助!
相關(guān)文章
詳解VUE Element-UI多級菜單動態(tài)渲染的組件
這篇文章主要介紹了VUE Element-UI多級菜單動態(tài)渲染的組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue+axios使用FormData方式向后端發(fā)送數(shù)據(jù)
在前后端分離的項目中經(jīng)常使用到Vue+axios通過FormData的方式向后端發(fā)送表單數(shù)據(jù),下面就來介紹一下如何實現(xiàn),感興趣的可以了解一下2023-09-09
Vue的移動端多圖上傳插件vue-easy-uploader的示例代碼
這篇文章主要介紹了Vue的移動端多圖上傳插件vue-easy-uploader的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

