restate / v1.0.0

Komponentui priklausanti būsena

Kiekvienam dokumentui, dialogui ar užklausai suteikite savus store, kurie sukuriami kartu su komponentu ir atlaisvinami jį atjungus.

Šiame puslapyjeuseRestateScopefactory taisyklėsPradinės reikšmės iš propsServerio atvaizdavimasDokumento išsaugotų duomenų laukimasIšbandykiteSavininkai už React ribų

useRestateScope

factory aprašo store ir juos grąžina. restate išlaiko rezultatą tarp perpiešimų ir sunaikina scope po komponento atjungimo. Nereikia rašyti uždarymo funkcijos ar valymo effect.

Du Document elementai turi nepriklausomą būseną. Norėdami bendrinti dokumentą su vaikais, perduokite grąžintus hook per props arba savo 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>
  );
}

factory taisyklės

React gali iškviesti factory daugiau nei kartą ir atmesti rezultatus, todėl ji turi būti sinchroninė ir gryna.

  • store aprašykite factory viduje; grąžintus hook kvieskite komponento viršutiniame lygyje.
  • Pradiniai props perskaitomi vieną kartą, kaip useState inicializatoriuje.
  • Suteikite komponentui key, kai kitam dokumentui reikia naujos būsenos.
  • Be factory useRestateScope() grąžina stabilų scope store, kuriuos sukursite vėliau effect ar apdorojimo funkcijose.

Pradinės reikšmės iš props

Naudokite props kaip pradines reikšmes, o React key – kad pradėtumėte iš naujo su kitu dokumentu.

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

Serverio atvaizdavimas

Įkelkite duomenis serverio maršrute ir perduokite juos kaip prop. Pradinė reikšmė kartu yra ir serverio momentinė kopija. Next.js App Router šis hook priklauso Client Component, kuris vis tiek atvaizduojamas serveryje.

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

Dokumento išsaugotų duomenų laukimas

Scope išsaugoti store pradeda atkūrimą, kai komponentas kliente atlieka commit, ir nėra globalaus restateManager.ready dalis. Palaukite paties scope manager.ready įkėlimo ribose.

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

Išbandykite

Atidarykite ir uždarykite dokumentus ir pažiūrėkite, kaip jų būsena prasideda iš naujo.

Ruošiamas pavyzdys…

Savininkai už React ribų

Kai būsena priklauso paslaugai ar serverio užklausai, sukurkite scope patys ir pabaigoje iškvieskite destroy(). Sunaikinus scope išsaugoti įrašai niekada neištrinami.

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

Ieškoti dokumentacijoje

Ieškokite visų vadovų pavadinimuose, aprašymuose ir tekste.