Tại sao chúng ta di chuyển trạng thái liên tục của chúng ta vào cơ sở dữ liệu, thay vì cho phép mỗi thành phần phụ trợ quản lý trạng thái của chúng trong các tệp riêng biệt?
Vì việc truy vấn, gỡ lỗi và tuần tự hóa trạng thái ứng dụng tổng thể của chúng tôi trở nên dễ dàng hơn nhiều.
Redux được lấy cảm hứng từ một ngôn ngữ được gọi là Elm, cũng thúc đẩy việc sử dụng một mô hình duy nhất. Tác giả của Elm có một lý do chính đáng hơn về lý do tại sao đó là một chất lượng quan trọng cho các ứng dụng.
Có một nguồn chân lý duy nhất. Cách tiếp cận truyền thống buộc bạn phải viết một số lượng phong nha của mã tùy chỉnh và dễ bị lỗi để đồng bộ hóa trạng thái giữa nhiều thành phần trạng thái khác nhau. (Trạng thái của tiện ích này cần được đồng bộ hóa với trạng thái ứng dụng, cần được đồng bộ hóa với một số tiện ích khác, v.v.) Bằng cách đặt tất cả trạng thái của bạn ở một vị trí, bạn sẽ loại bỏ toàn bộ lớp lỗi trong đó hai thành phần nhận được vào trạng thái không nhất quán. Chúng tôi cũng nghĩ rằng bạn sẽ kết thúc viết ít mã hơn nhiều. Đó là quan sát của chúng tôi ở Elm cho đến nay.
Tôi thấy khái niệm này dễ học và dễ hiểu hơn trong khi giải quyết nó từ số Re-frame của ClojureScript và xem số videos on Om Next của David Nolen. Re-frame README cho dự án cũng là một tài nguyên học tập tuyệt vời.
Dưới đây là một số lý do cá nhân của tôi về lý do tại sao nhà nước toàn cầu là giải pháp thanh lịch hơn.
Linh kiện đơn giản
Một kịch bản phổ biến phát sinh trong nhiều ứng dụng dựa trên thành phần trạng thái, cần phải sửa đổi trạng thái sống trong thành phần khác. Ví dụ: nhấp vào nút chỉnh sửa trong thành phần NameTag
sẽ mở trình chỉnh sửa cho phép người dùng sửa đổi một số dữ liệu sống ở trạng thái của thành phần Profile
(phụ huynh của NameTag
). Cách để giải quyết vấn đề này là truyền các callback xử lý, sau đó truyền dữ liệu sao lưu cây thành phần. Mẫu này dẫn đến các luồng dữ liệu phụ khó hiểu trong luồng dữ liệu một chiều hiện có của các ứng dụng React.
Với trạng thái toàn cục, các thành phần chỉ gửi các hành động kích hoạt cập nhật cho trạng thái đó. Cả hai thành phần và hành động có thể được tham số hóa để gửi thông tin theo ngữ cảnh cho người dùng (ví dụ: id của người dùng có tên tôi đang chỉnh sửa) là gì. Bạn không cần phải suy nghĩ nhiều về cách bạn sẽ giao tiếp những thay đổi cho tiểu bang, bởi vì bạn biết chính xác vị trí của tiểu bang, và hành động là cơ chế được xác định trước để gửi những thay đổi đó ở đó.
Chức năng tinh khiết
Khi trạng thái ứng dụng của bạn sống ở một địa điểm duy nhất, các thành phần mà làm cho nó có thể là chức năng thuần túy mà phải mất trạng thái như một cuộc tranh cãi. Họ chỉ xem xét dữ liệu và trả lại chế độ xem có thể gửi các hành động để thực hiện cập nhật.
Các chức năng này có tính minh bạch tham chiếu, có nghĩa là đối với bất kỳ bộ đầu vào nào đã cho, luôn có cùng một đầu ra chính xác. Điều này là lý tưởng để thử nghiệm và bạn kết thúc với các thành phần đơn giản để kiểm tra.
serialization
Trong một truyền thống Phản ứng ứng dụng với các thành phần trạng thái, serializing toàn bộ trạng thái ứng dụng sẽ là một cơn ác mộng. Nó sẽ liên quan đến việc vượt qua toàn bộ cây thành phần và trích xuất giá trị trạng thái từ mỗi thành phần, trước khi thu thập tất cả chúng trong một cấu trúc dữ liệu và mã hóa nó.
Việc tăng cường lại các thành phần với trạng thái tuần tự sẽ có nghĩa là quy trình tương tự, ngoại trừ bạn cũng phải tìm ra loại thành phần nào chịu trách nhiệm về dữ liệu nào, để bạn có thể tái tạo chính xác cây thành phần. Điều này cũng có nghĩa là lưu trữ thông tin bổ sung về các loại thành phần trong tiểu bang của bạn.
Với trạng thái toàn cầu, bạn chỉ cần mã hóa và giải mã chính xác vị trí của nó.
Undo/Redo
Để thực hiện undo/redo với tình trạng toàn cầu, bạn cần lưu trữ quốc gia trong danh sách, chứ không phải là thay thế cuối cùng một khi nó cập nhật. Một con trỏ chỉ mục có thể kiểm soát trạng thái hiện tại của bạn.
Với các thành phần trạng thái, điều này sẽ yêu cầu mỗi thành phần thực hiện cơ chế này. Không chỉ có rất nhiều công việc phụ, nhưng nó cũng tạo ra một điểm khác trong ứng dụng của bạn cho các lỗi được giới thiệu. Mã tốt nhất là không có mã, như họ nói.
Action Playback
Trong Redux (và mô hình Flux nói chung) chúng ta có thể theo dõi các hành động đã được chơi, sau đó chơi chúng trở lại trong bối cảnh khác để sản xuất một cách chính xác tình trạng tương tự.
Nếu bạn giới thiệu thành phần địa phương nhà nước, sau đó bạn có thể nói lời tạm biệt với điều này. Các bản cập nhật cho trạng thái cục bộ có thể đến từ các trình xử lý sự kiện DOM, các yêu cầu mạng, các hoạt động không đồng bộ (và nhiều hơn nữa). Các hoạt động này không thể được tuần tự hóa, có nghĩa là chúng không thể phát lại được.
Tôi nghĩ có [thảo luận có liên quan về vấn đề này trên Github của họ] (https://github.com/reactjs/redux/issues/1385)? Đã không được chính thức trả lời nhưng nó đang được thảo luận - không chắc chắn nếu điều đó thực sự giúp mặc dù. – aug
điều gì sẽ xảy ra nếu bạn thiết kế lại ứng dụng của mình và trạng thái không toàn cầu phải toàn cầu bây giờ? – Theo
@aug: Cảm ơn bạn đã đăng bài. Một sự giàu có của thông tin đó. Nó giúp trả lời câu hỏi tôi có về "Tôi có thể sử dụng các cửa hàng redux và phản ứng nhà nước?" – Skitterm