Các mẫu Vue là props
xuống và events
lê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ỳ
props
thô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 watch
chứ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 Task
thà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 đó prop
gắ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 listLocal
tí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-template
bạn có thể kết xuất listLocal
và nó sẽ vẫn phản ứng (nghĩa là, nếu parentList
thay đổi, nó sẽ cập nhật Task
thành phần). Bạn cũng có thể thay đổi listLocal
bằ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 listLocal
sang 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 EditTask
thà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-model
mẫ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 EditTask
phát ra một sự thay đổi nó một cách thích hợp sẽ gọi set()
trên listLocal
và qua đó tuyên truyền các sự kiện đến cấp cao nhất. Tương tự, EditTask
thà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
.