restate / v1.0.0

מצב ששייך לרכיב

תנו לכל מסמך, תיבת דו־שיח או בקשה מאגרים משלהם, שנוצרים עם הרכיב ומשתחררים אחרי ההסרה שלו.

בעמוד הזהuseRestateScopeכללי ה־factoryערכים התחלתיים מ־propsרינדור בשרתהמתנה לנתונים השמורים של מסמךנסו את זהבעלים מחוץ ל־React

useRestateScope

ה־factory מצהיר על מאגרים ומחזיר אותם. restate שומר את התוצאה בין רינדורים ומשמיד את ה־scope אחרי שהרכיב מוסר. אין פונקציית סגירה או effect ניקוי לכתוב.

לשני אלמנטים של Document יש מצבים עצמאיים. כדי לשתף מסמך עם רכיבים צאצאים, העבירו את ה־hooks שהוחזרו דרך props או context משלכם.

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>
  );
}

כללי ה־factory

React עשוי לקרוא ל־factory יותר מפעם אחת ולזרוק את התוצאות, אז שמרו אותו סינכרוני וטהור.

  • הצהירו על מאגרים ב־factory; קראו ל־hooks שהוחזרו ברמה העליונה של הרכיב.
  • props התחלתיים נקראים פעם אחת, כמו במאתחל של useState.
  • תנו לרכיב key כשמסמך אחר צריך מצב חדש.
  • בלי factory, useRestateScope() מחזיר scope יציב למאגרים שתיצרו מאוחר יותר ב־effects או במטפלים.

ערכים התחלתיים מ־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 ה־hook הזה נמצא ב־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>;
}

המתנה לנתונים השמורים של מסמך

מאגרים שמורים ב־scope מתחילים בשחזור אחרי שהרכיב מתבצע (commit) בצד הלקוח, ואינם חלק מ־restateManager.ready הגלובלי. המתינו ל־manager.ready של ה־scope עצמו בתוך גבול טעינה.

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

כשהמצב שייך לשירות או לבקשת שרת, צרו את ה־scope בעצמכם וקראו ל־destroy() בסוף. השמדת scope לעולם לא מוחקת רשומות שמורות.

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(),
  };
}

חיפוש בתיעוד

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