Các mẫu Vue là propsxuống và eventslên. Nghe có vẻ đơn giản, nhưng rất dễ quên khi viết một thành phần tùy chỉnh.
Kể từ Vue 2.2.0, bạn có thể sử dụng mô hình v (với các thuộc tính được tính toán ). Tôi đã tìm thấy sự kết hợp này tạo ra một giao diện đơn giản, rõ ràng và nhất quán giữa các thành phần:
- Bất kỳ
propsthông qua nào cho thành phần của bạn vẫn phản ứng (nghĩa là nó không được nhân bản cũng như không yêu cầu watchchức năng cập nhật bản sao cục bộ khi phát hiện thay đổi).
- Thay đổi được tự động phát ra cho phụ huynh.
- Có thể được sử dụng với nhiều cấp độ của các thành phần.
Một thuộc tính được tính cho phép setter và getter được xác định riêng. Điều này cho phép Taskthành phần được viết lại như sau:
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)
}
}
}
})
Các mô hình định nghĩa tài sản đó propgắn liền với v-model, và trong đó sự kiện sẽ được phát ra trên những thay đổi. Sau đó, bạn có thể gọi thành phần này từ cha mẹ như sau:
<Task v-model="parentList"></Task>
Thuộc listLocaltính được cung cấp một giao diện getter và setter đơn giản trong thành phần (nghĩ về nó giống như một biến riêng tư). Trong #task-templatebạn có thể kết xuất listLocalvà nó sẽ vẫn phản ứng (nghĩa là, nếu parentListthay đổi, nó sẽ cập nhật Taskthành phần). Bạn cũng có thể thay đổi listLocalbằng cách gọi setter (ví dụ this.listLocal = newList:) và nó sẽ phát ra thay đổi cho cha mẹ.
Điều tuyệt vời về mẫu này là bạn có thể chuyển listLocalsang một thành phần con của Task(sử dụng v-model) và các thay đổi từ thành phần con sẽ lan truyền đến thành phần cấp cao nhất.
Ví dụ: giả sử chúng ta có một EditTaskthành phần riêng để thực hiện một số loại sửa đổi đối với dữ liệu tác vụ. Bằng cách sử dụng v-modelmẫu thuộc tính giống nhau và được tính toán, chúng ta có thể chuyển listLocalđến thành phần (bằng cách sử dụng v-model):
<script type="text/x-template" id="task-template">
<div>
<EditTask v-model="listLocal"></EditTask>
</div>
</script>
Nếu EditTaskphát ra một sự thay đổi nó một cách thích hợp sẽ gọi set()trên listLocalvà qua đó tuyên truyền các sự kiện đến cấp cao nhất. Tương tự, EditTaskthành phần này cũng có thể gọi các thành phần con khác (như các phần tử biểu mẫu) bằng cách sử dụng v-model.