Tôi là tác giả chính của mô-đun ảo , vì vậy tôi có thể trả lời câu hỏi của bạn. Thực tế có 2 vấn đề cần được giải quyết ở đây
- Khi nào tôi kết xuất lại? Trả lời: Khi tôi quan sát thấy dữ liệu bị bẩn.
- Làm thế nào để tôi kết xuất lại hiệu quả? Trả lời: Sử dụng DOM ảo để tạo bản vá DOM thực
Trong React, mỗi thành phần của bạn có một trạng thái. Trạng thái này giống như một trạng thái có thể quan sát mà bạn có thể tìm thấy trong các thư viện loại trực tiếp hoặc MVVM khác. Về cơ bản, React biết khi nào sẽ kết xuất lại cảnh vì nó có thể quan sát khi dữ liệu này thay đổi. Kiểm tra bẩn chậm hơn các quan sát vì bạn phải thăm dò dữ liệu theo một khoảng thời gian đều đặn và kiểm tra tất cả các giá trị trong cấu trúc dữ liệu theo cách đệ quy. Khi so sánh, việc đặt giá trị trên trạng thái sẽ báo hiệu cho người nghe biết rằng một số trạng thái đã thay đổi, vì vậy React có thể chỉ cần lắng nghe các sự kiện thay đổi trên trạng thái và xếp hàng kết xuất lại.
DOM ảo được sử dụng để kết xuất lại DOM hiệu quả. Điều này không thực sự liên quan đến việc kiểm tra dữ liệu bẩn của bạn. Bạn có thể kết xuất lại bằng DOM ảo có hoặc không có kiểm tra bẩn. Bạn đúng ở chỗ có một số chi phí trong việc tính toán độ lệch giữa hai cây ảo, nhưng khác biệt DOM ảo là về việc hiểu những gì cần cập nhật trong DOM và không biết liệu dữ liệu của bạn có thay đổi hay không. Trong thực tế, thuật toán diff là bản thân trình kiểm tra bẩn nhưng nó được sử dụng để xem liệu DOM có bị bẩn không.
Chúng tôi chỉ nhắm mục tiêu kết xuất lại cây ảo khi trạng thái thay đổi. Vì vậy, sử dụng một quan sát để kiểm tra xem trạng thái đã thay đổi hay chưa là một cách hiệu quả để ngăn chặn việc tái xuất không cần thiết, điều này sẽ gây ra nhiều khác biệt về cây không cần thiết. Nếu không có gì thay đổi, chúng tôi không làm gì cả.
Một DOM ảo là tốt vì nó cho phép chúng ta viết mã của mình như thể chúng ta đang hiển thị lại toàn bộ cảnh. Đằng sau hậu trường, chúng tôi muốn tính toán một hoạt động vá lỗi cập nhật DOM để xem chúng tôi mong đợi như thế nào. Vì vậy, trong khi thuật toán diff / patch DOM ảo có lẽ không phải là giải pháp tối ưu , nó mang lại cho chúng ta một cách rất hay để thể hiện các ứng dụng của mình. Chúng tôi chỉ tuyên bố chính xác những gì chúng tôi muốn và React / virtual-dom sẽ tìm ra cách làm cho cảnh của bạn trông như thế này. Chúng ta không phải thực hiện thao tác DOM thủ công hoặc nhầm lẫn về trạng thái DOM trước đó. Chúng ta cũng không phải kết xuất lại toàn bộ cảnh, điều này có thể kém hiệu quả hơn nhiều so với vá nó.