restate / v1.0.0

البداية

ثبّت restate، وشارك أول قيمة لك بين المكوّنات، واستخدم المخزن نفسه خارج React.

في هذه الصفحةالتثبيتأول حالة مشتركة لكتحديث القيمةالاستخدام خارج ReactTypeScriptReact Nativeتعريف واحد على كل منصة

التثبيت

يعمل restate مع React 16.8 وما بعده. تعريفات TypeScript مضمّنة، ولا توجد تبعيات أخرى وقت التشغيل.

Terminal
npm install @kkwaenggwari/restate

أول حالة مشتركة لك

أنشئ المخزن مرة واحدة خارج المكوّنات. القيمة التي يعيدها restate هي خطّاف وكائن معًا، بدوال مثل 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' });

البحث في التوثيق

ابحث في عناوين جميع الأدلة وأوصافها ونصوصها.