React Context vs React Redux, khi nào tôi nên sử dụng từng cái? [đóng cửa]


185

React 16.3.0 đã được phát hành và API bối cảnh không còn là một tính năng thử nghiệm nữa. Dan Abramov (người tạo ra Redux) đã viết một bình luận tốt ở đây về điều này, nhưng đã 2 năm khi Bối cảnh vẫn là một tính năng Thử nghiệm.

Câu hỏi của tôi là, theo ý kiến ​​/ kinh nghiệm của bạn khi nào tôi nên sử dụng React Context hơn React Redux và ngược lại?


Nếu bạn đang so sánh API Redux và React Context API, thì đó là vì bạn chỉ muốn giữ các vars đồng bộ giữa các thành phần. Kiểm tra duixgói npm. Nó chỉ là một trình quản lý nhà nước đơn giản với các cuộc gọi lại, thực sự dễ thực hiện. Chỉ cần rõ ràng: Tôi là người sáng tạo.
Broda Noel

Câu trả lời:


206

Như bối cảnh không còn là một tính năng thử nghiệm và bạn có thể sử dụng trực tiếp Ngữ cảnh trong ứng dụng của mình và sẽ rất tuyệt vời khi truyền dữ liệu đến các thành phần lồng nhau sâu sắc mà nó được thiết kế cho.

Như Mark erikson đã viết trong blog của mình :

Nếu bạn chỉ sử dụng Redux để tránh truyền lại đạo cụ, bối cảnh có thể thay thế Redux - nhưng có lẽ bạn không cần Redux ngay từ đầu.

Ngữ cảnh cũng không cung cấp cho bạn bất cứ thứ gì như Redux DevTools, khả năng theo dõi các cập nhật trạng thái của bạn, middlewaređể thêm logic ứng dụng tập trung và các khả năng mạnh mẽ khác Redux cho phép.

Reduxmạnh hơn nhiều và cung cấp một số lượng lớn các tính năng mà Context Apikhông cung cấp, như As @danAbramov đã đề cập

React Redux sử dụng bối cảnh trong nội bộ nhưng nó không phơi bày sự thật này trong API công khai. Vì vậy, bạn sẽ cảm thấy an toàn hơn nhiều khi sử dụng ngữ cảnh qua React Redux so với trực tiếp bởi vì nếu nó thay đổi, gánh nặng cập nhật mã sẽ thuộc về React Redux chứ không phải bạn.

Redux của nó thực sự cập nhật việc triển khai để tuân thủ API ngữ cảnh mới nhất

API bối cảnh mới nhất có thể được sử dụng cho các Ứng dụng mà bạn chỉ cần sử dụng Redux để truyền dữ liệu giữa các thành phần, tuy nhiên ứng dụng sử dụng dữ liệu tập trung và xử lý yêu cầu API trong trình tạo Hành động bằng cách sử dụng redux-thunkhoặc redux-sagavẫn cần chuyển hướng. Ngoài ra, redux này còn có các thư viện khác được liên kết như redux-persistcho phép bạn lưu dữ liệu lưu trữ trong localStorage và bù nước khi làm mới, đó là điều mà API ngữ cảnh vẫn không hỗ trợ.

Như @dan_abramov đã đề cập trong blog của mình Bạn có thể không cần Redux , redux đó có ứng dụng hữu ích như

  • Kiên trì lưu trữ cục bộ và sau đó khởi động từ nó, ra khỏi hộp.
  • Trạng thái điền trước trên máy chủ, gửi nó đến máy khách trong HTML và khởi động từ nó, ra khỏi hộp.
  • Tuần tự hóa các hành động của người dùng và đính kèm chúng, cùng với ảnh chụp nhanh trạng thái, vào các báo cáo lỗi tự động, để các nhà phát triển sản phẩm
    có thể phát lại chúng để tái tạo lỗi.
  • Truyền các đối tượng hành động qua mạng để thực hiện các môi trường hợp tác mà không có thay đổi lớn đối với cách viết mã.
  • Duy trì lịch sử hoàn tác hoặc thực hiện các đột biến lạc quan mà không có thay đổi lớn đối với cách viết mã.
  • Di chuyển giữa lịch sử trạng thái đang phát triển và đánh giá lại trạng thái hiện tại từ lịch sử hành động khi mã thay đổi, là TDD.
  • Cung cấp khả năng kiểm tra và kiểm soát đầy đủ cho công cụ phát triển để các nhà phát triển sản phẩm có thể xây dựng các công cụ tùy chỉnh cho họ
    ứng dụng .
  • Cung cấp UI thay thế trong khi sử dụng lại hầu hết logic kinh doanh.

Với nhiều ứng dụng này, quá sớm để nói rằng Redux sẽ được thay thế bằng API bối cảnh mới


Ok, nhưng những gì về tái sử dụng? Các bối cảnh hoàn toàn có thể tái sử dụng, một khi redux + thunk, và đặc biệt là redux + saga là hầu như không.
Yurii Haiovyi

4
@Daggett Một điều chúng ta cần hiểu là redux không phải là bối cảnh, nó được xây dựng dựa trên bối cảnh, cửa hàng mà bạn có được truyền qua ngữ cảnh, bạn cũng có thể giải thích ý nghĩa của bạn bằng cách sử dụng lại
Shubham Khatri

Ngay cả việc phát triển một thứ cơ bản như thùng chứa có thể tái sử dụng với các tác dụng phụ cũng trở thành cơn ác mộng với redux. Redux chặt chẽ đến mức ứng dụng, và bạn có thể nói, nó vẫn có thể tái sử dụng, v.v., nhưng nói rằng tôi có thể tái sử dụng ... Không có spaghetti của gai, được xây dựng như một gói riêng biệt và có thể được sử dụng độc lập để thiết lập ứng dụng .
Yurii Haiovyi

@YuriiHaiovyi Tôi đồng ý với câu hỏi của bạn. Câu trả lời này về cơ bản là một phiên bản được biên dịch của những gì bài viết trên blog được liên kết nói. Không có gì về việc chia sẻ quan điểm riêng, như tôi đã chỉ sử dụng bối cảnh, và sau đó tôi bị mắc kẹt, và cảm thấy đó là một lựa chọn tồi cho một số lý do x, y, z và sau đó chuyển sang Redux, Mobx đã giải quyết nó .. hoặc ngược lại câu chuyện chẳng hạn. Chủ yếu mọi người đang hỏi hoặc tìm kiếm điều này để xem liệu có một số câu chuyện xấu hay tốt có thể giúp người đọc suy nghĩ và đưa ra quyết định có tính toán ... Vậy câu hỏi của tôi là bạn chọn con đường nào?
Arup Rakshit

4
Phần nào của redux không thể tái sử dụng? Bạn có thể dễ dàng sử dụng lại các bộ giảm tốc, bộ chọn, hành động và người tạo hành động trong một ứng dụng khác với redux (phản ứng, thậm chí là góc cạnh).
Dávid Molnár

85

Nếu bạn chỉ sử dụng Redux để tránh chuyển các đạo cụ xuống các thành phần được lồng sâu , thì bạn có thể thay thế Redux bằng ContextAPI. Nó chính xác dành cho trường hợp sử dụng này.

Mặt khác, nếu bạn đang sử dụng Redux cho mọi thứ khác (có bộ chứa trạng thái có thể dự đoán được, xử lý logic ứng dụng của bạn bên ngoài các thành phần của bạn, tập trung trạng thái ứng dụng của bạn, sử dụng Redux DevTools để theo dõi khi nào, ở đâu, tại sao và trạng thái của ứng dụng của bạn đã thay đổi hoặc sử dụng các plugin như Redux Form , Redux Saga , Redux Undo , Redux Persist , Redux Logger , v.v.), thì hoàn toàn không có lý do gì để bạn từ bỏ Redux. CácContext API không cung cấp bất kỳ về điều này.

Và cá nhân tôi tin rằng tiện ích mở rộng Redux DevTools là một công cụ gỡ lỗi tuyệt vời, bị đánh giá thấp, nó tự biện minh cho việc tiếp tục sử dụng Redux.

Một số tài liệu tham khảo:


12

Tôi thích sử dụng redux với redux-thunk để thực hiện các cuộc gọi API (cũng sử dụng Axios) và gửi phản hồi tới các bộ giảm tốc. Nó là sạch sẽ và dễ hiểu.

API bối cảnh rất cụ thể đối với phần phản ứng-redux về cách các thành phần React được kết nối với cửa hàng. Đối với điều này, phản ứng-redux là tốt. Nhưng nếu bạn muốn, vì Ngữ cảnh được hỗ trợ chính thức, bạn có thể sử dụng API ngữ cảnh thay vì phản ứng-redux.

Vì vậy, câu hỏi nên là API bối cảnh so với phản ứng-redux chứ không phải API bối cảnh so với redux. Ngoài ra, câu hỏi là hơi quan điểm. Vì, tôi quen thuộc với Reac-redux và sử dụng nó trong tất cả các dự án, tôi sẽ tiếp tục sử dụng nó. (Không có động lực để tôi thay đổi).

Nhưng nếu bạn đang học redux ngay hôm nay và bạn chưa sử dụng nó ở bất cứ đâu, thì đáng để cung cấp cho API bối cảnh và thay thế redux phản ứng bằng mã API bối cảnh tùy chỉnh của bạn. Có lẽ, nó sạch sẽ hơn nhiều theo cách đó.

Cá nhân, đó là một câu hỏi về sự quen thuộc. Không có lý do rõ ràng để chọn cái này hơn cái kia vì chúng tương đương nhau. Và trong nội bộ, Reac-redux sử dụng Context anyways.


10

Những lý do duy nhất để sử dụng Redux cho tôi là:

  • Bạn muốn một đối tượng trạng thái toàn cầu (vì nhiều lý do, như gỡ lỗi, kiên trì ...)
  • Ứng dụng của bạn đã hoặc sẽ lớn và nên mở rộng cho nhiều nhà phát triển: trong trường hợp như vậy, bạn có thể cần một mức độ gián tiếp (tức là hệ thống sự kiện): bạn thực hiện các sự kiện (trong quá khứ) và sau đó những người bạn không biết trong tổ chức thực sự có thể lắng nghe họ

Bạn có thể không cần mức độ gián tiếp cho toàn bộ ứng dụng của mình, vì vậy thật tốt khi kết hợp các kiểu và sử dụng trạng thái / bối cảnh cục bộ và Redux cả hai cùng một lúc.


1
  • Nếu bạn cần sử dụng phần mềm trung gian cho các mục đích khác nhau. Ví dụ: hành động ghi nhật ký, báo cáo lỗi, gửi các yêu cầu khác tùy thuộc vào phản hồi của máy chủ, v.v.
  • Khi dữ liệu đến từ nhiều điểm cuối ảnh hưởng đến một thành phần / khung nhìn.
  • Khi bạn muốn có quyền kiểm soát lớn hơn đối với các hành động trong ứng dụng của mình. Redux cho phép theo dõi các hành động và thay đổi dữ liệu, nó đơn giản hóa rất nhiều việc gỡ lỗi.
  • Nếu bạn không muốn phản hồi của máy chủ để thay đổi trực tiếp trạng thái của ứng dụng của bạn. Redux thêm một lớp, nơi bạn có thể quyết định cách thức, thời điểm và nếu dữ liệu này nên được áp dụng. Các mẫu quan sát. Thay vì tạo nhiều nhà xuất bản và người đăng ký trên toàn bộ ứng dụng, bạn chỉ cần kết nối các thành phần với cửa hàng Redux.

Từ: Khi nào nên sử dụng Redux?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.