restate / v1.0.0

Stanje, ki pripada komponenti

Vsakemu dokumentu, pogovornemu oknu ali zahtevi dajte lastne storeje, ki nastanejo s komponento in se po njenem odklopu sprostijo.

Na tej straniuseRestateScopePravila za factoryZačetne vrednosti iz propsUpodabljanje na strežnikuČakanje na shranjene podatke dokumentaPreizkusiteLastniki zunaj Reacta

useRestateScope

Factory deklarira storeje in jih vrne. restate hrani rezultat med upodobitvami in po odklopu komponente uniči scope. Ni treba pisati nobene zapiralne funkcije ali effecta za čiščenje.

Dva elementa Document imata neodvisni stanji. Če želite dokument deliti z otroki, podajte vrnjene hooke prek props ali lastnega konteksta.

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 lahko factory pokliče večkrat in rezultate zavrže, zato naj bo sinhrona in čista.

  • Storeje deklarirajte v factoryju; vrnjene hooke kličite na najvišji ravni komponente.
  • Začetni props se preberejo enkrat, kot v inicializatorju useState.
  • Komponenti dajte key, ko drug dokument potrebuje sveže stanje.
  • Brez factoryja useRestateScope() vrne stabilen scope za storeje, ki jih ustvarite pozneje v effectih ali obravnavah.

Začetne vrednosti iz props

Props uporabite kot začetne vrednosti, key Reacta pa za začetek znova z 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} />;

Upodabljanje na strežniku

Podatke naložite v strežniški poti in jih podajte kot prop. Začetna vrednost je hkrati tudi posnetek s strežnika. V Next.js App Routerju ta hook spada v Client Component, ki se vseeno upodobi na strežniku.

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

Čakanje na shranjene podatke dokumenta

Shranjeni storeji v scopu začnejo obnovo, ko se komponenta na odjemalcu potrdi (commit), in niso del globalnega restateManager.ready. Počakajte na lastni manager.ready scopa znotraj meje nalaganja.

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

Preizkusite

Odpirajte in zapirajte dokumente in glejte, kako se njihovo stanje začne znova.

Pripravljanje primera …

Lastniki zunaj Reacta

Ko stanje pripada storitvi ali zahtevi na strežniku, scope ustvarite sami in na koncu pokličite destroy(). Uničenje scopa nikoli ne izbriše shranjenih zapisov.

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

Iskanje po dokumentaciji

Iščite po naslovih, opisih in besedilu vseh vodnikov.