restate / v1.0.0
מתחילים
התקינו את restate, שתפו את הערך הראשון בין רכיבים והשתמשו באותו מאגר מחוץ ל־React.
בעמוד הזה
התקנההמצב המשותף הראשון שלכםעדכון הערךשימוש מחוץ ל־ReactTypeScriptReact Nativeהצהרה אחת בכל פלטפורמההתקנה
restate עובד עם React 16.8 ומעלה. הצהרות TypeScript כלולות, ואין תלויות נוספות בזמן ריצה.
npm install @kkwaenggwari/restateהמצב המשותף הראשון שלכם
צרו את המאגר פעם אחת, מחוץ לרכיבים. הערך ש־restate מחזיר הוא גם hook וגם אובייקט עם מתודות כמו set ו־get.
אין props ואין Provider בין Editor ל־CharacterCount. הקלדה באחד מעדכנת את השני.
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>;
}עדכון הערך
set מקבל ערך חדש או פונקציה של הערך הקודם. reset חוזר לערך שהצהרתם עליו.
התייחסו לערך כבלתי משתנה: החזירו אובייקט או מערך חדש במקום לשנות את הישן, כדי שהבוררים יראו את השינוי.
אתם עושים push ל־cart.items וקוראים ל־useCart.set(cart). למה שום דבר לא מתרנדר?
המאגר מקבל את אותו אובייקט ו־Object.is לא רואה שינוי. החזירו אובייקט חדש, למשל 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 valueשימוש מחוץ ל־React
אותו מאגר עובד במטפלי אירועים, בשירותים ובבדיקות. get קורא את הערך הנוכחי, ו־subscribe קורא לכם אחרי כל שינוי ומחזיר פונקציה שמפסיקה להאזין.
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
העבירו את טיפוס המצב פעם אחת. בוררים, set וכל המתודות מקבלים ממנו טיפוסים.
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
מאגרים בזיכרון לא צריכים שום דבר נוסף ב־React Native. כדי לשמור מצב, התקינו את react-native-mmkv; נקודת הכניסה של React Native טוענת אותו אוטומטית.
בפרויקטי bare, הריצו pod install ל־iOS אחרי ההתקנה. ב־Expo השתמשו ב־development build, כי MMKV הוא מודול נייטיב.
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modulesהצהרה אחת בכל פלטפורמה
מאגר שמור משתמש ב־IndexedDB בדפדפן וב־MMKV ב־React Native. ההצהרה והרכיבים שלכם נשארים אותו דבר.
import { persistedRestate } from '@kkwaenggwari/restate';
// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });