restate / v1.0.0

מתחילים

התקינו את restate, שתפו את הערך הראשון בין רכיבים והשתמשו באותו מאגר מחוץ ל־React.

בעמוד הזההתקנההמצב המשותף הראשון שלכםעדכון הערךשימוש מחוץ ל־ReactTypeScriptReact Nativeהצהרה אחת בכל פלטפורמה

התקנה

restate עובד עם React 16.8 ומעלה. הצהרות TypeScript כלולות, ואין תלויות נוספות בזמן ריצה.

Terminal
npm install @kkwaenggwari/restate

המצב המשותף הראשון שלכם

צרו את המאגר פעם אחת, מחוץ לרכיבים. הערך ש־restate מחזיר הוא גם hook וגם אובייקט עם מתודות כמו set ו־get.

אין props ואין Provider בין Editor ל־CharacterCount. הקלדה באחד מעדכנת את השני.

JavaScript / JSX
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] })).

JavaScript / JSX
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 קורא לכם אחרי כל שינוי ומחזיר פונקציה שמפסיקה להאזין.

JavaScript / JSX
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 וכל המתודות מקבלים ממנו טיפוסים.

JavaScript / JSX
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 הוא מודול נייטיב.

Terminal
npm install @kkwaenggwari/restate react-native-mmkv@4 react-native-nitro-modules

הצהרה אחת בכל פלטפורמה

מאגר שמור משתמש ב־IndexedDB בדפדפן וב־MMKV ב־React Native. ההצהרה והרכיבים שלכם נשארים אותו דבר.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

// IndexedDB on the web, MMKV on React Native. Same declaration.
export const useDraft = persistedRestate('', { key: 'draft' });

חיפוש בתיעוד

חיפוש בכותרות, בתיאורים ובטקסט של כל המדריכים.