restate / v1.0.0

Komponentille kuuluva tila

Anna jokaiselle dokumentille, dialogille tai pyynnölle omat storet, jotka luodaan komponentin mukana ja vapautetaan sen irrottamisen jälkeen.

Tällä sivullauseRestateScopeFactoryn säännötAlkuarvot propseistaPalvelinrenderöintiDokumentin tallennettujen tietojen odottaminenKokeileOmistajat Reactin ulkopuolella

useRestateScope

Factory määrittelee storet ja palauttaa ne. restate säilyttää tuloksen renderöintien välillä ja tuhoaa scopen komponentin irrottamisen jälkeen. Sulkemisfunktiota tai siivous-effectiä ei tarvitse kirjoittaa.

Kahdella Document-elementillä on itsenäinen tila. Jos haluat jakaa dokumentin lapsille, välitä palautetut hookit propseina tai omalla kontekstillasi.

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

Factoryn säännöt

React voi kutsua factorya useammin kuin kerran ja hylätä tuloksia, joten pidä se synkronisena ja puhtaana.

  • Määrittele storet factoryssa; kutsu palautettuja hookeja komponentin ylimmällä tasolla.
  • Alkuperäiset propsit luetaan kerran, kuten useStaten alustajassa.
  • Anna komponentille key, kun toinen dokumentti tarvitsee tuoreen tilan.
  • Ilman factorya useRestateScope() palauttaa vakaan scopen storeille, jotka luot myöhemmin effecteissä tai käsittelijöissä.

Alkuarvot propseista

Käytä propseja alkuarvoina ja Reactin keytä aloittaaksesi alusta toisella dokumentilla.

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

Palvelinrenderöinti

Lataa data palvelimen reitillä ja välitä se propsina. Alkuarvo on myös palvelimen tilannekuva. Next.js App Routerissa tämä hook kuuluu Client Componentiin, joka renderöidään silti palvelimella.

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

Dokumentin tallennettujen tietojen odottaminen

Scopen tallennetut storet aloittavat palautuksen, kun komponentti commitoidaan asiakkaalla, eivätkä ne kuulu globaaliin restateManager.ready-arvoon. Odota scopen omaa manager.ready-arvoa latausrajan sisällä.

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

Kokeile

Avaa ja sulje dokumentteja ja katso, miten niiden tila alkaa alusta.

Valmistellaan esimerkkiä…

Omistajat Reactin ulkopuolella

Kun tila kuuluu palvelulle tai palvelinpyynnölle, luo scope itse ja kutsu lopuksi destroy(). Scopen tuhoaminen ei koskaan poista tallennettuja tietueita.

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

Hae dokumentaatiosta

Hae kaikkien oppaiden otsikoista, kuvauksista ja sisällöstä.