restate / v1.0.0

Stanje koje pripada komponenti

Dajte svakom dokumentu, dijalogu ili zahtjevu vlastite storeove koji nastaju s komponentom i oslobađaju se nakon njezina demontiranja.

Na ovoj straniciuseRestateScopePravila za factoryPočetne vrijednosti iz propsRenderiranje na poslužiteljuČekanje spremljenih podataka dokumentaIsprobajteVlasnici izvan Reacta

useRestateScope

Factory deklarira storeove i vraća ih. restate čuva rezultat između renderiranja i uništava scope nakon demontiranja komponente. Nema funkcije zatvaranja ni effecta za čišćenje koje treba pisati.

Dva elementa Document imaju neovisna stanja. Da biste dokument podijelili s djecom, predajte vraćene hookove kroz props ili vlastiti kontekst.

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

Pravila za factory

React može pozvati factory više puta i odbaciti rezultate, pa neka bude sinkrona i čista.

  • Deklarirajte storeove u factoryju; vraćene hookove pozivajte na najvišoj razini komponente.
  • Početni props čitaju se jednom, kao u inicijalizatoru useState.
  • Dajte komponenti key kad drugi dokument treba svježe stanje.
  • Bez factoryja useRestateScope() vraća stabilan scope za storeove koje stvorite kasnije u effectima ili rukovateljima.

Početne vrijednosti iz props

Koristite props kao početne vrijednosti i Reactov key da biste počeli ispočetka s drugim dokumentom.

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

Renderiranje na poslužitelju

Učitajte podatke u ruti poslužitelja i predajte ih kao prop. Početna vrijednost ujedno daje snimku s poslužitelja. U Next.js App Routeru ovaj hook ide u Client Component, koji se ipak renderira na poslužitelju.

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

Čekanje spremljenih podataka dokumenta

Spremljeni storeovi u scopeu počinju vraćanje nakon što se komponenta committa na klijentu i nisu dio globalnog restateManager.ready. Pričekajte vlastiti manager.ready scopea unutar granice učitavanja.

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

Isprobajte

Otvarajte i zatvarajte dokumente i gledajte kako im stanje počinje ispočetka.

Priprema primjera…

Vlasnici izvan Reacta

Kad stanje pripada servisu ili zahtjevu na poslužitelju, sami stvorite scope i na kraju pozovite destroy(). Uništavanje scopea nikad ne briše spremljene zapise.

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

Pretraži dokumentaciju

Pretražujte naslove, opise i tekst svih vodiča.