Nâng cao ứng dụng React với Provider Pattern

DSCF5909.jpg
Phuong Vo
Đăng ngày 07 tháng 11, 2023

Trong thế giới phát triển React, việc chia sẻ dữ liệu giữa các thành phần khác nhau là một thách thức chung

Mở
Giới Thiệu Provider Pattern
Tối Ưu Lại Với Hook
Kết Luận
context_api.jpg

Bạn có thể thường xuyên rơi vào tình huống cần làm cho nhiều components trong ứng dụng của mình có thể truy cập được dữ liệu. Mặc dù bạn có thể truyền dữ liệu bằng cách sử dụng props nhưng mọi thứ có thể trở nên phức tạp khi một số lượng lớn các components cần truy cập vào cùng một dữ liệu. Tình huống này thường dẫn đến tình trạng mà các nhà phát triển gọi là , trong đó bạn phải chuyển props xuống cây components, vì vậy dữ liệu phải đi qua nhiều components khác nhau mà chúng không cần sử dụng đến, việc này khiến việc tái cấu trúc mã trở nên khó khăn và việc theo dõi dữ liệu thậm chí còn phức tạp hơn.

Hãy minh họa điều này bằng một ví dụ: Hãy tưởng tượng bạn có components App chứa dữ liệu cần thiết. Sâu trong cây components của bạn, có các components: đều yêu cầu dữ liệu này. Để cung cấp dữ liệu này cho các thành phần này, bạn phải chuyển dữ liệu đó qua nhiều lớp components, dẫn đến một cấu trúc phức tạp.


Việc quản lý props theo cách này có thể trở nên cồng kềnh, đặc biệt là khi bạn cần đổi tên prop trong tương lai. Bạn sẽ phải cập nhật nó trong tất cả components. Khi ứng dụng của bạn phát triển, vấn đề này sẽ leo thang, khiến việc bảo trì mã trở thành một thách thức đáng kể.

Sẽ thật lý tưởng nếu dữ liệu của bạn có thể bỏ qua tất cả các lớp components không cần thiết và cung cấp quyền truy cập trực tiếp vào dữ liệu cho các components yêu cầu dữ liệu đó mà không cần dựa vào . Đây là lúc Provider Pattern trở nên hữu ích cho bạn.

Giới Thiệu Về

Với Provider Pattern, bạn có thể cung cấp dữ liệu cho nhiều components mà không cần chuyển dữ liệu đó qua nhiều lớp. Thay vào đó, bạn bao tất cả các components có liên quan vào trong một , đây là "higher-order component" được cung cấp bởi React Context. Để thực hiện điều này, bạn cần tạo một đối tượng Context bằng phương thức do React cung cấp.

Đây là cách nó hoạt động:


Giờ đây, bạn không còn phải truyền dữ liệu qua props cho các components theo cách thủ công nữa. Nhưng làm cách nào để các components: , truy cập được dữ liệu?

Chúng có thể truy cập dữ liệu bằng hook , được thiết kế riêng cho mục đích này. Hook này cho phép các components đọc và ghi dữ liệu vào đối tượng context. Mã nguồn sẽ như thế này:


Các thành phần không cần giá trị dữ liệu sẽ không phải xử lý nó. Bạn đã loại bỏ một cách hiệu quả những rắc rối khi chuyển props xuống nhiều cấp độ cho các components không yêu cầu dữ liệu, đơn giản hóa việc cấu trúc và bảo trì mã nguồn.

Tối Ưu Lại Với Hook

Để nâng cao hơn nữa khả năng sử dụng của context, bạn có thể tạo các hook tùy chỉnh cho context cụ thể, cho phép các components truy cập vào context chúng cần mà không cần nhập nhằn khi sử dụng bạn phải chọn lựa xem sử dụng context nào.

Ví dụ:


Hook tùy chỉnh này đóng gói logic của context, giúp dễ dàng tách logic ra khỏi thành phần hiển thị dữ liệu (UI - View). Thật tình cờ một cách tương tự bạn có thể tạo thêm nhiều Provider để gói các dữ liệu/logic lại và tạo thêm nhiều hooks như: , , ,... cho những mục đích sử dụng khác nhau trong ứng dụng của bạn.

Kết Luận

Mặc dù Provider Pattern mang lại những lợi thế đáng kể nhưng điều cần thiết là phải nhận thức được những đánh đổi tiềm ẩn. Việc lạm dụng context có thể dẫn đến các vấn đề về hiệu suất, vì tất cả các thành phần sử dụng context sẽ render lại sau mỗi thay đổi trạng thái. Để giảm thiểu điều này, bạn cần phải tạo ra các context với cấp độ, phạm vi riêng biệt cho các trường hợp sử dụng cụ thể, đảm bảo rằng các components chỉ nhận dữ liệu chúng thực sự cần, cuối cùng là tối ưu hóa hiệu suất ứng dụng của bạn.

button right
Mở
Giới Thiệu Provider Pattern
Tối Ưu Lại Với Hook
Kết Luận