2016-03-12 48 views
14

Tôi đang sử dụng bộ nạp-vue (http://vuejs.github.io/vue-loader/start/spec.html) để xây dựng các thành phần đơn *.vue của mình, nhưng tôi gặp sự cố với quá trình mở rộng thành phần một tệp từ một thành phần khác.Làm cách nào để mở rộng một thành phần VueJS khác trong một thành phần tệp đơn? (ES6 vue-loader)

Nếu một thành phần sau spec để export default { [component "Foo" definition] }, tôi sẽ nghĩ nó chỉ là một vấn đề nhập khẩu thành phần này (như tôi làm với bất kỳ thành phần con) và sau đó export default Foo.extend({ [extended component definition] })

Thật không may này không hoạt động. Bất cứ ai có thể vui lòng cung cấp lời khuyên?

Trả lời

9

Cách thích hợp để làm điều này sẽ được sử dụng mixins: http://vuejs.org/guide/mixins.html

Hãy suy nghĩ về mixins như các thành phần trừu tượng, mà bạn có thể mở rộng. Vì vậy, bạn có thể tạo một mixin với bất kỳ chức năng nào bạn muốn có trong cả hai, và sau đó chỉ áp dụng nó cho mỗi thành phần của bạn.

21

Sau một số thử nghiệm, giải pháp đơn giản là đảm bảo xuất đối tượng Vue.extend() thay vì đối tượng đơn giản cho bất kỳ thành phần nào đang được mở rộng.

Trong trường hợp của tôi, các thành phần cơ bản:

import Vue from 'vue' 

export default Vue.extend({ [component "Foo" definition] }) 

và các thành phần mở rộng:

import Foo from './Foo' 

export default Foo.extend({ [extended component definition] }) 
+0

Đây là một ý tưởng tuyệt vời, vui mừng bạn đã nhận nó tìm ra. Tôi có thể tưởng tượng ở một số nơi này sẽ thích hợp hơn để mixins – Jeff

+0

Chính xác những gì tôi đang tìm kiếm, cảm ơn. Đây là câu trả lời tốt hơn IMO giải pháp được chấp nhận, bởi vì toàn bộ một thành phần không thể được tạo thành mixin vì nó sẽ làm tăng khả năng va chạm tên. Mixin nên được giới hạn trong mã chia sẻ nhỏ hơn. – Kashif

+1

Điều này làm việc cho tôi nhưng tôi phải cẩn thận về chức năng ghi đè. Ví dụ các cuộc gọi vòng đời như gắn kết đã không bị ghi đè, kỳ quặc cả hai được gọi là: nó và siêu của nó. Nhưng các hàm được khai báo trong các phương thức đã bị ghi đè. Vì vậy, tôi chuyển logic cần thiết để được ghi đè vào các phương thức và gọi chúng từ cuộc gọi vòng đời. – yeahdixon

11

Một khả năng khác là extends tùy chọn:

import Foo from './Foo' 

export default { extends: Foo } 
+0

Có cách nào chúng tôi có thể mở rộng nhiều đối tượng như xuất mặc định {mở rộng: Foo, Bar, Baz} – Phantom007

+0

@ Phantom007 mixins. – trusktr

Các vấn đề liên quan