通過上一節,我們知道了vue檢測物件資料發生改變的原理
但是還有個api我們沒有講解,Vue.set();
這個API比較適合在理解了物件檢測的原理後進行講解
html
<!-- 建立一個容器 -->
<div class="app">
<h1>姓名:{{student.name}}</h1>
<h1>年齡:{{student.age}}</h1><br>
<h2>朋友們</h2>
<ul>
<!-- 列表渲染 == friends -->
<li v-for="(item,index) in friends">
{{item.name}}-{{item.rage}}-{{item.mage}}
</li>
</ul>
</div>
data設定項
<script>
const vm = new Vue({
el: '.app',
data: {
student: {
name: 'wavesbright',
age: 21,
},
friends: [ // 真實年齡,內心年齡
{name: "Jack",rage: 32,mage: 40},
{name: "Jony",rage: 24,mage: 45},
{name: "Jone",rage: 28,mage: 50},
]
},
methods: {
},
});
</script>
頁面效果
新增測試
我們在這裡新增一個渲染項,然後我們新增屬性試試,現在我data當中是沒有這個屬性的
並不能被vue所識別到
那麼我們後面想要自己新增屬性就沒有辦法完成響應式了嗎,誒,這就是我們接下來要引入的API
我現在算是明白了,小程式的 this.setData() 就是從這裡變來的
這裡其實應該是 .student的;因為操作的都是同一個物件的地址
我現在要在data當中,新增一個屬性,這個屬性是leader == 校長
我們使用.set新增試試
vm是不能作為target的,vm當中的data,也不能作為target
資料代理
現在我們點選去看看二者有什麼不同,或者說,vue當中對陣列和物件型別的資料是如何代理的
陣列
物件
區別,目前而言
我們寫一串DOM元素進行測試
<div class="app">
<ul>
<li v-for="item in numbers">{{item}}</li>
</ul>
</div>
現在,我直接在控制檯中對陣列當中的元素進行修改
我們將最後一項 從5改為6
資料的確修改成功了,但是vue檢測不到,頁面無法響應
現在,我們來回顧一下之前遇到的bug,我們新增一個persons物件陣列
從控制檯我們來觀察一下這個persons
所以為什麼下面的修改不起作用,因為根本沒代理,沒有代理無法完成響應式資料
這個問題解決了順勢丟擲下一個問題,vue怎麼就知道陣列內部的屬性發生改變了呢,它是如何監測到的?
那它咋知道我呼叫了上面的7個API呢?
使用 Array這個原形物件身上的 push 舉例子
這個push,是給陣列呼叫的
我們在控制檯上來個陣列
這個push是哪裡來的?==> 其實是一層一層巢狀的,從原形物件身上來的
二者身上的push是相等的
vue身上的陣列,使用的並不是 原形陣列Array身上的 API函數
如何測試?
很簡單,回到我們剛剛的案例
這下您能明白了嗎
當你對一個被vue所管理的陣列進行了api的呼叫(push,shift,unshift.....)
你呼叫的這個API,就不是原型物件Array身上的API了;而是vue的api
在這個api當中,會做兩個步驟
是這麼一回事嗎,我們看下官網是如何解答的
我們來看這句話
enmmmm,後面沒講了,基本其實到這裡就差不多了,後面的都需要在實際開發當中去慢慢琢磨了
尚矽谷yyds,黑馬也是
你們都是我的天使