restate / v1.0.0

Câu hỏi thường gặp

Giải đáp những câu hỏi phổ biến nhất về render, lưu, scope và lỗi trong restate.

Cơ bảnTôi có cần Provider không?

Không. Store là giá trị cấp module; component nào import nó cũng dùng được. Hãy dùng useRestateScope khi state phải thuộc về một thể hiện component.

Cơ bảnVì sao component của tôi render mỗi khi có thay đổi?

Gọi hook không kèm selector sẽ đăng ký toàn bộ giá trị. Hãy truyền một selector chỉ trả về những gì component hiển thị.

Cơ bảnHàm selector của tôi trả về đối tượng và render mỗi lần.

Theo Object.is, một đối tượng mới không bao giờ bằng đối tượng trước. Truyền shallow làm đối số thứ hai hoặc chọn từng trường riêng.

Cơ bảnĐối tượng đã thay đổi, nhưng không có gì được cập nhật.

set nhận cùng một đối tượng, nên restate không thấy thay đổi. Hãy trả về đối tượng hoặc mảng mới từ set.

LưuTôi nên chờ dữ liệu đã lưu ở đâu?

Một lần, ở điểm vào phía client: chạy await restateManager.ready trước khi render ứng dụng. Từ đó component đọc trực tiếp các giá trị đã lưu. Store trong useRestateScope chờ scope.manager.ready của chúng.

LưuKhi nào dữ liệu được ghi vào bộ nhớ lưu trữ?

Chỉ khi bạn gọi save() hoặc, nếu autoSave đang bật, sau các thay đổi. Chỉnh sửa thay đổi bộ nhớ; status().dirty cho biết có thay đổi chưa lưu.

LưuautoSave hay save()?

Dùng autoSave cho cài đặt và bản nháp luôn cần được lưu. Dùng save() khi người dùng quyết định, như với nút Lưu hoặc khi gửi biểu mẫu. Bạn vẫn có thể gọi save() khi autoSave đang bật, ví dụ ở pagehide.

LưuLưu thất bại trong cửa sổ riêng tư hoặc khi SSR.

Khi bộ nhớ lưu trữ không khả dụng, store vẫn chạy trong bộ nhớ, status().available là false và save() bị từ chối với STORAGE_UNAVAILABLE. Ứng dụng vẫn khởi động thành công.

LỗirestateManager.ready bị từ chối. Giờ làm gì?

Nó bị từ chối với BULK_OPERATION_FAILED khi một bản ghi không thể đọc, di chuyển hoặc kiểm tra hợp lệ. error.failures liệt kê từng store và lỗi của nó. Hãy sửa hoặc xóa bản ghi, gọi initialize() của store đó và truy cập lại ready.

LỗiTôi thấy QUEUE_FULL hoặc STORAGE_TIMEOUT.

Bộ nhớ lưu trữ chậm hơn lượng việc bạn đưa vào hàng đợi. Tránh gọi save() trong vòng lặp dày — lần lưu đang chờ đã lấy giá trị mới nhất — hoặc dùng autoSave có thời gian chờ. Điều chỉnh maxPendingOperations và operationTimeoutMs nếu cần.

LỗiMột yêu cầu đến muộn sau khi unmount ghi vào store.

set() và reset() trên store đã hủy bị bỏ qua, giống cập nhật state React sau khi unmount. Đăng ký sẽ ném STORE_DESTROYED, và các lệnh lưu trữ bị từ chối.

ScopeStore trong scope của tôi bỏ qua props mới.

Factory chạy một lần, như hàm khởi tạo của useState. Hãy render component với key theo từng tài liệu để mỗi tài liệu mới có scope mới.

ScopeLàm sao tránh lệch dữ liệu khi hydrate?

Truyền cùng dữ liệu máy chủ dưới dạng props ở cả máy chủ và client, rồi tạo store từ đó trong useRestateScope. Giá trị ban đầu trở thành snapshot máy chủ.

ScopeVì sao store trong scope của tôi không có trong restateManager.ready?

Store được lưu trong scope bắt đầu tải khi component sở hữu được commit ở phía client. Hãy chờ scope.manager.ready bên trong ranh giới tải ở component đó.

LưuMMKV_UNAVAILABLE trên React Native.

Cài react-native-mmkv cùng các phụ thuộc native của nó, rồi build lại ứng dụng. Với Expo, dùng development build. Store trong bộ nhớ hoạt động mà không cần MMKV.

Tìm trong tài liệu

Tìm trong tiêu đề, mô tả và nội dung của mọi hướng dẫn.