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 oldalon
useRestateScopeA factory szabályaiKezdőértékek props-bólSzerveroldali renderelésEgy dokumentum mentett adatainak megvárásaPróbálja kiTulajdonosok a Reacten kívüluseRestateScope
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.
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.
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.
'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.
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.
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(),
};
}