Kiến trúc chung cho upload file linh hoạt trong React Web và React Native

23 lượt xem · 3 trả lời

1. 11:52 10/10/2026
Bài viết này sẽ giới thiệu một kiến trúc chung cho việc upload file trong cả React Web và React Native, giúp các dự án chia sẻ logic while vẫn giữ được tính năng riêng của mỗi nền tảng. Đầu tiên, chúng ta cần một state management trung tâm, Context API là lựa chọn nhẹ và có thể mở rộng. Tạo một Context provider gọi là FileUploadContext, chứa các trạng thái như fileQueue, progress, error, và các hàm uploadFile, cancelUpload. Sau đó, sử dụng React Query để quản lý vòng đời request, cache kết quả và tự động refresh token nếu cần. Với React Query, mỗi lần upload sẽ được ghi lại trong cache, cho phép truy cập nhanh chóng từ bất kỳ component nào trên web hoặc mobile. Trong React Native, vì giao tiếp với hệ thống file native, chúng ta có thể tạo một custom hook useFileUploader. Hook này sẽ thực hiện việc chuẩn bị multipart/form-data, thiết lập headers, và trả về promise. Khi gọi uploadFile từ context, hook sẽ được truyền vào, nên logic chung được tách rời. Đối với việc xử lý lỗi, chúng ta nên chuẩn hoá mã lỗi HTTP và thông báo lỗi tùy ngữ cảnh, đồng thời hiển thị UI toast hoặc dialog trên cả hai nền tảng. Ví dụ thực tế: trên web, một component FileUploader nhận input[type=file], khi người dùng chọn file, nó dispatch một action vào context, context sẽ cập nhật fileQueue và bắt đầu upload qua React Query. Trong React Native, cùng component (được viết bằng Expo) sẽ gọi useFileUploader, nhận kết quả và cập nhật UI. Cả hai đều sử dụng cùng một API backend, vì vậy không cần viết hai đoạn code khác nhau. Lưu ý quan trọng: luôn đặt timeout cho request, và khi upload thành công, xóa file tạm trong cache để tránh lãng phí bộ nhớ. Cuối cùng, việc tách biệt logic upload khỏi UI giúp dự án dễ bảo trì và mở rộng, đặc biệt khi cần hỗ trợ thêm các framework như Flutter hoặc Svelte.
0 Facebook
2. 14:44 10/10/2026
Trả lời Quản Trị Viên Bài viết này sẽ giới thiệu một kiến trúc chung cho việc upload file trong cả React Web và React Native, giúp các dự án c…
Tôi thấy cách tiếp cận hai lớp này rất hợp lý—sử dụng Context API để đồng bộ hóa state trên cả web và mobile, trong khi React Query xử lý caching và làm mới token một cách liền mạch. Việc tách custom hook `useFileUploader` giúp bạn tận dụng các tính năng native mà không làm rối logic upload chung. Tôi đặc biệt đánh giá cao việc chuẩn hóa mã lỗi và hiển thị toast/dialog thống nhất; điều này giúp giảm đáng kể thời gian gỡ lỗi khi chuyển đổi giữa các nền tảng. Một vấn đề thực tế mà tôi gặp phải là việc quản lý progress upload trên thiết bị di động: các sự kiện progress từ React Query không dễ dàng truy cập được do các ràng buộc của hook. Bạn có xử lý progress thông qua polling không, hay bạn dựa vào các sự kiện trên socket để cập nhật UI? Tôi rất muốn biết cách bạn cân bằng giữa phản hồi tức thì và trải nghiệm người dùng mượt mà trên cả hai nền tảng.
0
3. 20:01 25/10/2026
Trả lời Hoàng Oanh Tôi thấy cách tiếp cận hai lớp này rất hợp lý—sử dụng Context API để đồng bộ hóa state trên cả web và mobile, trong khi …
Mình không dùng React Query để lấy progress vì hook mutation không expose tiến trình ổn định; React Query chỉ giữ trạng thái mutation/cache. Progress mình tách riêng: web dùng XMLHttpRequest.upload.onprogress (hoặc axios onUploadProgress), React Native cũng dùng XHR/axios vì fetch thường không có upload progress. Mỗi file có một ref/event emitter cập nhật local state, throttle khoảng 100–250ms để UI không giật;
0
4. 15:54 26/10/2026
Trả lời Hoàng Oanh Tôi thấy cách tiếp cận hai lớp này rất hợp lý—sử dụng Context API để đồng bộ hóa state trên cả web và mobile, trong khi …
Mình nghĩ nên tách rõ hai loại “progress”: tiến độ truyền byte lên server và tiến độ xử lý phía server. Với React Query, đừng cố lấy progress từ hook mutation vì nó không phù hợp cho cập nhật tần suất cao; mình thường giữ mutation cho trạng thái cuối (thành công/lỗi) và đẩy progress vào state cục bộ hoặc Context, throttle cập nhật UI khoảng 100–250ms để tránh re-render quá nhiều. Trên web có thể dùng XHR/axios với onUploadProgress; trên React Native thì axios/XHR cũng hỗ trợ onUploadProgress, hoặc dùng expo-file-system uploadAsync n
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại