Vue監視數據的原理詳解

1. Vue監視數據的原理(set方法)

1.1 Vue監視不同類型數據的原理

特點:vue會監視data中所有層級的數據,並且如果他檢測到是對象那麼就會給對象裡面所有的屬性配置getter和setter函數

1.1.1 如何監測對象中的數據?

通過setter實現監視,且要在new Vue時就傳入要監測的數據

​(1).對象中後追加的屬性,Vue默認不做響應式處理(就是沒有配置getter和setter函數)

(2).如需給後添加的屬性做響應式,請使用如下API:

​ Vue.set(target,propertyName/index,value) 

​ vm.$set(target,propertyName/index,value)

1.1.2 如何監測數組中的數據?

通過包裹數組更新元素的方法實現,本質就是做瞭兩件事:

		(1). 調用原生對應的方法對數組進行更新。

		(2). 重新解析模板,進而更新頁面。

在Vue修改數組中的某個元素一定要用如下方法:

​ (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">在結尾添加一個人的信息</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檢測不到,
                    // 原因是因為數組上面沒有getter和setter方法所以檢測不到數據發生改變
                    // this.person[0] = {id:"001",name:"李煥英",age:66,gender:"女"}

                    // 下面方法奏效,是因為屬性上面已經配置瞭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>學生信息</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>聯系方式:{{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>

總結

以上就是今天要講的內容,本文介紹瞭Vue監視數據的原理和set方法,該部分很重要需要好好理解,希望對大傢有所幫助!

推薦閱讀: