2016-07-20 19 views
8

Xem xét một ứng dụng VueJS cho phép hiển thị/chỉnh sửa các bài đăng trên blog.Cách thích hợp để đồng bộ hóa các đạo cụ với dữ liệu

  • Khi nhấp vào "chỉnh sửa blogpost" một phương thức (thành phần Vue) được hiển thị để chỉnh sửa blogpost hiện tại (chỉ là đối tượng js bình thường).
  • Để kết thúc này, tôi vượt qua bài đăng blog hiện tại dưới dạng prop thành thành phần phương thức.
  • Thành phần phương thức có một số trường biểu mẫu phải được điền bằng thuộc tính blogpost.
  • Tuy nhiên, cách Vue là có đối tượng data trên thành phần Phương thức hoạt động như mô hình để điền vào các trường biểu mẫu và ngược lại, được cập nhật khi người dùng thay đổi các trường biểu mẫu.

Vấn đề: Làm thế nào để kết nối các bài đăng trên blog được thông qua như là một prop đến data trường của phương thức thành phần sao cho:

  • bài đăng blog populates các trường mẫu
  • các bài đăng trên blog được cập nhật khi cập nhật các trường biểu mẫu

Cách Vue chính xác để thực hiện việc này là gì?

Trả lời

1

Bạn có ba (ít nhất) cách để làm điều đó:

1) Kết nối dữ liệu thông qua các thuộc tính prop, cũng giống như bạn đang làm, nhưng thêm các thuộc tính .sync với nó. Bằng cách này, khi dữ liệu được sửa đổi trên biểu mẫu, nó cũng tự động được sửa đổi trên thành phần. Vấn đề với giải pháp này là bản cập nhật là tự động, vì vậy nếu xác thực không thành công hoặc người dùng đóng phương thức mà không lưu các thay đổi, thì những thay đổi này vẫn được lưu. Ví dụ: https://jsfiddle.net/Lz3aq64f/

2) Cách khác để thực hiện việc này là nhận được phương thức $dispatch sự kiện với thông tin đã lưu khi thông tin được lưu. Phần tử blogpost nên lắng nghe sự kiện này và hành động tương ứng.

Trên phương thức:

this.$dispatch('update-post', this.title, this.author); 

Trên blogpost:

this.$on('update-post', function(title, author) { 
    this.title = title; 
    this.author = author 
}); 

Nếu thành phần blogpost và thành phần đa phương thức không nằm trong hệ thống cấp bậc cùng, mọi thứ trở nên một chút phức tạp hơn, và có lẽ bạn cần phần tử cha mẹ phổ biến để hoạt động như một proxy. Hãy suy nghĩ về các yếu tố modaldispatching thông tin, yếu tố #app bắt nó qua $on và sau đó thực hiện $broadcast thành phần blogpost.

3) Sử dụng một cái gì đó như vuex để hoạt động như một kho lưu trữ trung tâm của trạng thái. Tôi không biết đơn đăng ký của bạn lớn đến mức nào, nhưng đây sẽ là cách sạch nhất để đi: http://vuex.vuejs.org/en/index.html

Chúc may mắn!

+1

Đến với tùy chọn 4 (dựa trên trò chuyện gitter vuejs) có vẻ như hoạt động.Điều này được dựa trên việc nhận ra rằng tất cả các đạo cụ tự động là một phần của 'dữ liệu' (không cần phải có' đồng bộ' ở đây) Vì vậy nếu tôi có một lệnh gọi là 'blogpost' (một đối tượng đơn giản), tôi chỉ có thể sử dụng blogpost trong mẫu thành phần như do đó ''. Điều này với cùng một caveat như tùy chọn của bạn 1, trong đó cập nhật được thực hiện ngay lập tức, vì vậy tôi cần phải chắc chắn để giữ một 'blogpostOld' xung quanh hoặc một cái gì đó để hợp nhất trở lại vào ngày hủy bỏ. Cảm ơn vì tổng quan tuyệt vời. –

+0

Có, 'props',' data' và 'computed' có cùng chất lượng. NHƯNG, theo như tôi hiểu, mặc dù, khi bạn vượt qua một prop cho một mục, mối quan hệ là một chiều xuống (một sự thay đổi trong phụ huynh được thông qua cho trẻ em). Nếu bạn sử dụng '.sync', quan hệ sẽ trở thành' hai chiều': một thay đổi dữ liệu trong con cũng thay đổi phụ huynh: https://vuejs.org/guide/components.html#Prop-Binding-Types –

+1

Chắc chắn nhìn thấy hành vi hai chiều dự định mà không xác định 'đồng bộ'. Tôi đoán điều này là bởi vì tôi đang đi qua một tham chiếu đối tượng thay vì một loại đơn giản như chuỗi. –

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