restate / v1.0.0

Komponenshez tartozó állapot

Adjon minden dokumentumnak, párbeszédablaknak vagy kérésnek saját store-okat, amelyek a komponenssel jönnek létre, és leválasztása után felszabadulnak.

Ezen az oldalonuseRestateScopeA factory szabályaiKezdőértékek props-bólSzerveroldali renderelésEgy dokumentum mentett adatainak megvárásaPróbálja kiTulajdonosok a Reacten kívül

useRestateScope

A factory deklarálja és visszaadja a store-okat. A restate megőrzi az eredményt a renderelések között, és a komponens leválasztása után megsemmisíti a scope-ot. Nem kell bezáró függvényt vagy takarító effectet írni.

Két Document elemnek független állapota van. Ha egy dokumentumot meg szeretne osztani a gyermekekkel, adja át a visszaadott hookokat props-on vagy saját kontextuson keresztül.

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

A factory szabályai

A React többször is meghívhatja a factoryt, és eldobhatja az eredményt, ezért legyen szinkron és tiszta.

  • A store-okat a factoryban deklarálja; a visszaadott hookokat a komponens legfelső szintjén hívja meg.
  • A kezdeti props-ot egyszer olvassa be, mint a useState inicializálója.
  • Adjon key-t a komponensnek, ha egy másik dokumentumnak friss állapot kell.
  • Factory nélkül a useRestateScope() stabil scope-ot ad vissza a később effectekben vagy kezelőkben létrehozott store-okhoz.

Kezdőértékek props-ból

Használja a props-ot kezdőértékként, a React key-ét pedig arra, hogy egy másik dokumentummal újrakezdje.

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

Szerveroldali renderelés

Töltse be az adatokat a szerveroldali útvonalban, és adja át propként. A kezdőérték egyben a szerver pillanatképe. A Next.js App Routerben ez a hook egy Client Componentbe kerül, amely ettől még a szerveren is renderel.

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

Egy dokumentum mentett adatainak megvárása

A scope-ban lévő mentett store-ok akkor kezdik a helyreállítást, amikor a komponens commitol a kliensen, és nem részei a globális restateManager.ready-nek. Várjon a scope saját manager.ready-jére egy betöltési határon belül.

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

Próbálja ki

Nyisson meg és zárjon be dokumentumokat, és nézze meg, hogyan indul újra az állapotuk.

A példa előkészítése…

Tulajdonosok a Reacten kívül

Ha az állapot egy szolgáltatáshoz vagy szerverkéréshez tartozik, hozza létre maga a scope-ot, és a végén hívja meg a destroy() metódust. A scope megsemmisítése soha nem törli a mentett rekordokat.

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

Keresés a dokumentációban

Keresés az összes útmutató címében, leírásában és szövegében.