restate / v1.0.0
البداية
ثبّت restate، وشارك أول قيمة لك بين المكوّنات، واستخدم المخزن نفسه خارج React.
في هذه الصفحة
التثبيتأول حالة مشتركة لكتحديث القيمةالاستخدام خارج ReactTypeScriptReact Nativeتعريف واحد على كل منصةالتثبيت
يعمل restate مع React 16.8 وما بعده. تعريفات TypeScript مضمّنة، ولا توجد تبعيات أخرى وقت التشغيل.
npm install @kkwaenggwari/restateأول حالة مشتركة لك
أنشئ المخزن مرة واحدة خارج المكوّنات. القيمة التي يعيدها restate هي خطّاف وكائن معًا، بدوال مثل 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' });