restate / v1.0.0
কম্পোনেন্টের নিজস্ব স্টেট
প্রতিটি ডকুমেন্ট, ডায়ালগ বা অনুরোধকে নিজস্ব স্টোর দিন, যা কম্পোনেন্টের সঙ্গে তৈরি হয় আর আনমাউন্ট হলে ছেড়ে দেওয়া হয়।
এই পাতায়
useRestateScopefactory-র নিয়মprops থেকে প্রাথমিক মানসার্ভার রেন্ডারিংডকুমেন্টের সংরক্ষিত ডেটার জন্য অপেক্ষাচালিয়ে দেখুনReact-এর বাইরের মালিকuseRestateScope
factory স্টোর ঘোষণা করে ফেরত দেয়। restate ফলাফল রেন্ডারের মধ্যে রাখে এবং কম্পোনেন্ট আনমাউন্ট হলে scope ধ্বংস করে। কোনো ক্লোজ ফাংশন বা পরিষ্কারের effect লিখতে হয় না।
দুটি Document এলিমেন্টের স্টেট আলাদা। ডকুমেন্ট সন্তানদের সঙ্গে ভাগ করতে ফেরত পাওয়া হুক props বা নিজের context দিয়ে দিন।
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-র নিয়ম
React factory কয়েকবার কল করে ফলাফল ফেলে দিতে পারে, তাই এটিকে সিঙ্ক্রোনাস আর বিশুদ্ধ রাখুন।
- স্টোর factory-তে ঘোষণা করুন; ফেরত পাওয়া হুক কম্পোনেন্টের শীর্ষ স্তরে কল করুন।
- প্রাথমিক props একবার পড়া হয়, useState-এর ইনিশিয়ালাইজারের মতো।
- অন্য ডকুমেন্টের নতুন স্টেট দরকার হলে কম্পোনেন্টকে key দিন।
- factory ছাড়া useRestateScope() একটি স্থির scope ফেরত দেয়, যেসব স্টোর আপনি পরে effect বা হ্যান্ডলারে তৈরি করেন তাদের জন্য।
props থেকে প্রাথমিক মান
props-কে প্রাথমিক মান হিসেবে ব্যবহার করুন, আর অন্য ডকুমেন্ট নিয়ে নতুন করে শুরু করতে React-এর key।
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} />;সার্ভার রেন্ডারিং
সার্ভার রুটে ডেটা লোড করে prop হিসেবে দিন। প্রাথমিক মানই সার্ভার স্ন্যাপশট। Next.js App Router-এ এই হুক Client Component-এ যায়, যা তবুও সার্ভারে রেন্ডার হয়।
'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>;
}ডকুমেন্টের সংরক্ষিত ডেটার জন্য অপেক্ষা
scope-এর সংরক্ষিত স্টোর ক্লায়েন্টে কম্পোনেন্ট commit হলে ফিরিয়ে আনা শুরু করে এবং গ্লোবাল restateManager.ready-র অংশ নয়। লোডিং সীমানার ভেতরে scope-এর নিজস্ব manager.ready-র জন্য অপেক্ষা করুন।
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} />;
}চালিয়ে দেখুন
ডকুমেন্ট খুলুন আর বন্ধ করুন, এবং দেখুন তাদের স্টেট কীভাবে নতুন করে শুরু হয়।
উদাহরণ প্রস্তুত হচ্ছে…
React-এর বাইরের মালিক
স্টেট যখন কোনো সার্ভিস বা সার্ভার অনুরোধের, তখন scope নিজে তৈরি করে শেষে destroy() কল করুন। scope ধ্বংস করলে সংরক্ষিত রেকর্ড কখনো মোছে না।
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(),
};
}