ฉันมีอาร์เรย์ที่เรียกpeople
ว่ามีวัตถุดังนี้:
ก่อน
[
{id: 0, name: 'Bob', age: 27},
{id: 1, name: 'Frank', age: 32},
{id: 2, name: 'Joe', age: 38}
]
สามารถเปลี่ยนแปลงได้:
หลังจาก
[
{id: 0, name: 'Bob', age: 27},
{id: 1, name: 'Frank', age: 33},
{id: 2, name: 'Joe', age: 38}
]
สังเกตว่าแฟรงค์เพิ่งอายุ 33 ปี
ฉันมีแอพที่ฉันพยายามดูอาร์เรย์คนและเมื่อค่าใด ๆ เปลี่ยนแปลงให้บันทึกการเปลี่ยนแปลง:
<style>
input {
display: block;
}
</style>
<div id="app">
<input type="text" v-for="(person, index) in people" v-model="people[index].age" />
</div>
<script>
new Vue({
el: '#app',
data: {
people: [
{id: 0, name: 'Bob', age: 27},
{id: 1, name: 'Frank', age: 32},
{id: 2, name: 'Joe', age: 38}
]
},
watch: {
people: {
handler: function (val, oldVal) {
// Return the object that changed
var changed = val.filter( function( p, idx ) {
return Object.keys(p).some( function( prop ) {
return p[prop] !== oldVal[idx][prop];
})
})
// Log it
console.log(changed)
},
deep: true
}
}
})
</script>
ฉันอิงตามคำถามที่ฉันถามเมื่อวานนี้เกี่ยวกับการเปรียบเทียบอาร์เรย์และเลือกคำตอบที่ใช้งานได้เร็วที่สุด
ดังนั้น ณ จุดนี้ฉันคาดว่าจะเห็นผลลัพธ์ของ: { id: 1, name: 'Frank', age: 33 }
แต่สิ่งที่ฉันได้รับกลับมาในคอนโซลคือ (จำไว้ว่าฉันมีมันอยู่ในส่วนประกอบ):
[Vue warn]: Error in watcher "people"
(found in anonymous component - use the "name" option for better debugging messages.)
และในcodepen ที่ฉันสร้างผลลัพธ์ก็คืออาร์เรย์ว่างเปล่าและไม่ใช่วัตถุที่เปลี่ยนแปลงซึ่งเปลี่ยนไปซึ่งจะเป็นอย่างที่ฉันคาดไว้
หากใครสามารถแนะนำได้ว่าเหตุใดจึงเกิดขึ้นหรือฉันผิดพลาดตรงไหนที่นี่จะได้รับการชื่นชมอย่างมากขอบคุณมาก!