restate / v1.0.0

حالة يملكها مكوّن

امنح كل مستند أو مربع حوار أو طلب مخازنه الخاصة، تُنشأ مع المكوّن وتُحرَّر بعد إزالته.

في هذه الصفحةuseRestateScopeقواعد دالة المصنعقيم أولية من propsالعرض على الخادمانتظار البيانات المحفوظة لمستندجرّبهمالكون خارج React

useRestateScope

تعرّف دالة المصنع المخازن وتعيدها. يحتفظ restate بالنتيجة بين عمليات العرض ويتلف النطاق بعد إزالة المكوّن. لا توجد دالة إغلاق أو effect تنظيف تكتبها.

لعنصري Document حالتان مستقلتان. لمشاركة مستند مع المكوّنات الأبناء، مرّر الخطّافات المُعادة عبر props أو سياقك الخاص.

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

function Document() {
  const { useDraft, useSelection } = useRestateScope((scope) => ({
    useDraft: restate('', { scope }),
    useSelection: restate(0, { scope }),
  }));
  const text = useDraft();
  const selection = useSelection();

  return (
    <section>
      <input value={text} onChange={(event) => useDraft.set(event.target.value)} />
      <button onClick={() => useSelection.set((n) => n + 1)}>Selection: {selection}</button>
    </section>
  );
}

قواعد دالة المصنع

قد يستدعي React دالة المصنع أكثر من مرة ويتجاهل نتائجها، لذا اجعلها متزامنة ونقية.

  • عرّف المخازن في دالة المصنع؛ واستدعِ الخطّافات المُعادة في المستوى الأعلى من المكوّن.
  • تُقرأ props الأولية مرة واحدة، كما في مُهيّئ useState.
  • أعطِ المكوّن key حين يحتاج مستند آخر إلى حالة جديدة.
  • من دون دالة مصنع، يعيد useRestateScope() نطاقًا ثابتًا للمخازن التي تنشئها لاحقًا في effect أو معالجات.

قيم أولية من props

استخدم props قيمًا أولية، وkey في React للبدء من جديد مع مستند آخر.

JavaScript / JSX
function Editor({ document }) {
  // The initial value is captured once, like a useState initializer.
  const useTitle = useRestateScope((scope) => restate(document.title, { scope }));
  const title = useTitle();
  return <input value={title} onChange={(event) => useTitle.set(event.target.value)} />;
}

// A different document gets fresh state.
<Editor key={document.id} document={document} />;

العرض على الخادم

حمّل البيانات في مسار الخادم ومرّرها كـ prop. وتوفّر القيمة الأولية أيضًا لقطة الخادم. في App Router في Next.js يوضع هذا الخطّاف في Client Component، وهو يُعرض على الخادم مع ذلك.

JavaScript / JSX
'use client';

import { restate, useRestateScope } from '@kkwaenggwari/restate';

export default function Profile({ user }) {
  const useProfile = useRestateScope((scope) => restate(user, { scope }));
  const profile = useProfile();
  return <p>{profile.name}</p>;
}

انتظار البيانات المحفوظة لمستند

تبدأ المخازن المحفوظة في نطاق بالاستعادة بعد تثبيت المكوّن على العميل، ولا تدخل ضمن restateManager.ready العام. انتظر manager.ready الخاص بالنطاق داخل حدّ تحميل.

JavaScript / JSX
import { useEffect, useState } from 'react';
import { persistedRestate, useRestateScope } from '@kkwaenggwari/restate';

function Document({ documentId }) {
  const { manager, useDraft } = useRestateScope((scope) => ({
    manager: scope.manager,
    useDraft: persistedRestate('', { scope, namespace: 'documents', key: documentId }),
  }));
  const [state, setState] = useState('loading');

  useEffect(() => {
    let active = true;
    manager.ready.then(
      () => active && setState('ready'),
      () => active && setState('error'),
    );
    return () => {
      active = false;
    };
  }, [manager]);

  if (state === 'error') return <p>Could not load this document.</p>;
  if (state === 'loading') return <p>Loading document…</p>;
  return <Editor useDraft={useDraft} />;
}

جرّبه

افتح المستندات وأغلقها وشاهد حالتها تبدأ من الصفر.

جارٍ تجهيز المثال…

مالكون خارج React

حين تخص الحالة خدمة أو طلبًا على الخادم، أنشئ النطاق بنفسك واستدعِ destroy() في النهاية. إتلاف النطاق لا يحذف السجلات المحفوظة أبدًا.

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

export function createDocument(documentId) {
  const scope = createRestateScope();
  const useDraft = persistedRestate('', {
    scope,
    namespace: 'documents',
    key: documentId,
  });
  return {
    useDraft,
    manager: scope.manager,
    save: () => scope.manager.saveAll(),
    destroy: () => scope.destroy(),
  };
}

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

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