รูปแบบ Vue propsลดลงและeventsเพิ่มขึ้น ฟังดูง่าย แต่ลืมง่ายเมื่อเขียนส่วนประกอบที่กำหนดเอง
ตั้งแต่ Vue 2.2.0 คุณสามารถใช้v-model (พร้อมคุณสมบัติที่คำนวณได้ ) ฉันพบว่าชุดค่าผสมนี้สร้างอินเทอร์เฟซที่เรียบง่ายสะอาดและสอดคล้องกันระหว่างส่วนประกอบ:
propsองค์ประกอบใด ๆ ที่ส่งผ่านไปยังองค์ประกอบของคุณจะยังคงมีปฏิกิริยา (เช่นมันไม่ได้ถูกโคลนหรือไม่จำเป็นต้องมีwatchฟังก์ชั่นในการอัพเดทสำเนาในเครื่องเมื่อตรวจพบการเปลี่ยนแปลง)
- การเปลี่ยนแปลงจะถูกปล่อยออกโดยอัตโนมัติไปยังผู้ปกครอง
- สามารถใช้กับส่วนประกอบหลายระดับ
คุณสมบัติที่คำนวณได้อนุญาตให้ setter และ getter แยกกันได้ สิ่งนี้อนุญาตให้Taskคอมโพเนนต์ถูกเขียนใหม่ดังนี้:
Vue.component('Task', {
template: '#task-template',
props: ['list'],
model: {
prop: 'list',
event: 'listchange'
},
computed: {
listLocal: {
get: function() {
return this.list
},
set: function(value) {
this.$emit('listchange', value)
}
}
}
})
รูปแบบกำหนดสถานที่ให้บริการที่propมีความเกี่ยวข้องกับv-modelและกรณีที่จะถูกปล่อยออกมาเกี่ยวกับการเปลี่ยนแปลง จากนั้นคุณสามารถเรียกใช้คอมโพเนนต์นี้จากพาเรนต์ดังนี้:
<Task v-model="parentList"></Task>
listLocalคุณสมบัติคำนวณให้ทะเยอทะยานและตั้งค่าอินเตอร์เฟซที่เรียบง่ายภายในส่วนประกอบ (คิดว่ามันเหมือนเป็นตัวแปรเอกชน) ภายใน#task-templateคุณสามารถแสดงผลlistLocalและมันจะยังคงมีปฏิกิริยา (เช่นหากparentListการเปลี่ยนแปลงจะอัปเดตTaskองค์ประกอบ) นอกจากนี้คุณยังสามารถกลายพันธุ์listLocalโดยการเรียกตัวตั้งค่า (เช่นthis.listLocal = newList) และมันจะปล่อยการเปลี่ยนแปลงไปยังผู้ปกครอง
สิ่งที่ยอดเยี่ยมเกี่ยวกับรูปแบบนี้คือคุณสามารถส่งlistLocalต่อไปยังองค์ประกอบย่อยของTask(โดยใช้v-model) และการเปลี่ยนแปลงจากองค์ประกอบย่อยจะเผยแพร่ไปยังองค์ประกอบระดับบนสุด
ตัวอย่างเช่นสมมติว่าเรามีEditTaskส่วนประกอบแยกต่างหากสำหรับทำการแก้ไขบางชนิดกับข้อมูลงาน โดยใช้v-modelรูปแบบคุณสมบัติที่เหมือนกันและคำนวณเราสามารถส่งผ่านlistLocalไปยังองค์ประกอบ (โดยใช้v-model):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
ถ้าEditTaskปล่อยออกมามีการเปลี่ยนแปลงได้อย่างเหมาะสมจะเรียกset()ในlistLocalและจึงเผยแพร่เหตุการณ์ให้อยู่ในระดับด้านบน ในทำนองเดียวกันEditTaskองค์ประกอบยังสามารถเรียกส่วนประกอบเด็กอื่น ๆ (เช่นองค์ประกอบของแบบฟอร์ม) v-modelโดยใช้