restate / v1.0.0
Bắt đầu
Cài restate, chia sẻ giá trị đầu tiên giữa các component và dùng cùng store đó bên ngoài React.
Trên trang này
Cài đặtState dùng chung đầu tiên của bạnCập nhật giá trịDùng bên ngoài ReactTypeScriptReact NativeMột khai báo trên mọi nền tảngCài đặt
restate hoạt động với React 16.8 trở lên. Có sẵn khai báo TypeScript và không có phụ thuộc runtime nào khác.
npm install @kkwaenggwari/restateState dùng chung đầu tiên của bạn
Tạo store một lần, bên ngoài component. Giá trị restate trả về vừa là hook vừa là đối tượng có các phương thức như set và get.
Giữa Editor và CharacterCount không có props cũng không có Provider. Gõ vào một bên sẽ cập nhật bên kia.
import { restate } from '@kkwaenggwari/restate';
export const useDraft = restate('');
export function Editor() {
const text = useDraft();
return <textarea value={text} onChange={(event) => useDraft.set(event.target.value)} />;
}
export function CharacterCount() {
const count = useDraft((text) => text.length);
return <span>{count} characters</span>;
}Cập nhật giá trị
set nhận giá trị mới hoặc một hàm của giá trị trước. reset quay về giá trị bạn đã khai báo.
Hãy coi giá trị là bất biến: trả về đối tượng hoặc mảng mới thay vì sửa cái cũ, để selector nhận ra thay đổi.
Bạn dùng push thêm một mục vào cart.items rồi gọi useCart.set(cart). Vì sao không có gì render?
Store nhận cùng một đối tượng và Object.is không thấy thay đổi. Hãy trả về đối tượng mới, chẳng hạn useCart.set(cart => ({ ...cart, items: [...cart.items, item] })).
useCount.set(10); // replace the value
useCount.set((count) => count + 1); // compute from the previous value
useCount.reset(); // back to the declared initial valueDùng bên ngoài React
Cùng store đó hoạt động trong trình xử lý sự kiện, service và test. get đọc giá trị hiện tại, còn subscribe gọi bạn sau mỗi thay đổi và trả về một hàm để ngừng lắng nghe.
import { useCart } from './stores/cart';
// Any module, event handler or test can use the same store.
const current = useCart.get();
useCart.set((cart) => ({ ...cart, items: [...cart.items, 'Pen'] }));
const stop = useCart.subscribe((cart, previous) => {
console.log(previous.items.length, '→', cart.items.length);
});
stop();TypeScript
Khai báo kiểu state một lần. Selector, set và mọi phương thức đều lấy kiểu từ đó.
import { restate } from '@kkwaenggwari/restate';
type Cart = { items: string[]; coupon: string };
export const useCart = restate<Cart>({ items: [], coupon: '' });
const count = useCart((cart) => cart.items.length); // number
useCart.set((cart) => ({ ...cart, coupon: 'SPRING' }));React Native
Store trong bộ nhớ không cần gì thêm trên React Native. Để lưu state, hãy cài react-native-mmkv; điểm vào React Native sẽ tự tải nó.
Trong dự án bare, chạy pod install cho iOS sau khi cài. Với Expo, dùng development build vì MMKV là module native.
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modulesMột khai báo trên mọi nền tảng
Store được lưu dùng IndexedDB trong trình duyệt và MMKV trên React Native. Khai báo và các component của bạn vẫn giữ nguyên.
import { persistedRestate } from '@kkwaenggwari/restate';
// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });