restate / v1.0.0
Bileşene ait durum
Her belgeye, iletişim kutusuna ya da isteğe kendi store'larını verin; bileşenle oluşturulsun ve ayrıldıktan sonra serbest bırakılsın.
Bu sayfada
useRestateScopeFactory kurallarıprops'tan başlangıç değerleriSunucu tarafı renderBelgenin kayıtlı verilerini beklemekDeneyinReact dışındaki sahipleruseRestateScope
Factory store'ları bildirip döndürür. restate sonucu render'lar arasında tutar ve bileşen ayrıldıktan sonra scope'u yok eder. Kapatma fonksiyonu ya da temizlik effect'i yazmak gerekmez.
İki Document öğesinin bağımsız durumu vardır. Bir belgeyi alt öğelerle paylaşmak için döndürülen hook'ları props ya da kendi context'iniz üzerinden iletin.
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 kuralları
React factory'yi birden çok kez çağırıp sonuçları atabilir; bu yüzden onu senkron ve saf tutun.
- Store'ları factory içinde bildirin; döndürülen hook'ları bileşenin en üst düzeyinde çağırın.
- Başlangıç props'ları, useState başlatıcısında olduğu gibi bir kez okunur.
- Başka bir belge taze bir duruma ihtiyaç duyduğunda bileşene bir key verin.
- Factory olmadan useRestateScope(), sonradan effect'lerde ya da işleyicilerde oluşturacağınız store'lar için sabit bir scope döndürür.
props'tan başlangıç değerleri
props'u başlangıç değeri olarak, React key'ini ise başka bir belgeyle yeniden başlamak için kullanın.
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} />;Sunucu tarafı render
Verileri sunucu rotasında yükleyip prop olarak iletin. Başlangıç değeri aynı zamanda sunucu anlık görüntüsüdür. Next.js App Router'da bu hook, yine de sunucuda render edilen bir Client Component içinde yer alır.
'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>;
}Belgenin kayıtlı verilerini beklemek
Scope içindeki kayıtlı store'lar, bileşen istemcide commit edildiğinde geri yüklemeye başlar ve genel restateManager.ready'nin parçası değildir. Bir yükleme sınırı içinde scope'un kendi manager.ready'sini bekleyin.
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} />;
}Deneyin
Belgeleri açıp kapatın ve durumlarının nasıl yeniden başladığını görün.
Örnek hazırlanıyor…
React dışındaki sahipler
Durum bir servise ya da sunucu isteğine ait olduğunda scope'u kendiniz oluşturun ve sonunda destroy() çağırın. Bir scope'u yok etmek kayıtlı kayıtları asla silmez.
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(),
};
}