restate / v1.0.0
শুধু যা দরকার তাতে সাবস্ক্রাইব করুন
প্রতিটি কম্পোনেন্ট স্টোরের কোন অংশের ওপর নির্ভর করে তা বাছুন, shallow দিয়ে অবজেক্ট তুলনা করুন, batch দিয়ে পরিবর্তন জড়ো করুন আর বাইরের ইভেন্ট জুড়ুন।
এই পাতায়
selector দিনচালিয়ে দেখুনshallow দিয়ে কয়েকটি ফিল্ড বাছানিজের তুলনাbatch দিয়ে পরিবর্তন জড়ো করাReact-এর বাইরে সাবস্ক্রাইববাইরের ইভেন্ট জোড়াselector দিন
কম্পোনেন্টের যা দরকার তা বাছে এমন ফাংশন দিয়ে হুক কল করুন। প্রতিটি পরিবর্তনের পরে restate selector চালায় এবং ফলাফল আগেরটির সঙ্গে Object.is দিয়ে তুলনা করে। দুটি সমান হলে কম্পোনেন্ট রেন্ডার হয় না।
কার্ড বদলায়। ItemCount কি রেন্ডার হয়?
না। তার selector এখনো একই সংখ্যক পণ্য ফেরত দেয়, তাই বাছাই সমান এবং React-কে রেন্ডার করতে বলা হয় না।
const useCart = restate({ items: ['Book'], coupon: '', note: '' });
function ItemCount() {
// Re-renders only when the number of items changes.
const count = useCart((cart) => cart.items.length);
return <p>{count} items</p>;
}চালিয়ে দেখুন
ফিল্ড বদলান আর রেন্ডার কাউন্টার দেখুন। প্রতিবার নতুন অবজেক্ট ফেরত দেওয়া selector দেখতে shallow বন্ধ করুন।
উদাহরণ প্রস্তুত হচ্ছে…
shallow দিয়ে কয়েকটি ফিল্ড বাছা
selector যখন অবজেক্ট তৈরি করে, তখন প্রতিবার নতুন একটি ফেরত দেয়, তাই Object.is সবসময় পরিবর্তন দেখে। দ্বিতীয় আর্গুমেন্ট হিসেবে shallow দিন: এটি অবজেক্টের নিজের ফিল্ডগুলো এক স্তর গভীর পর্যন্ত তুলনা করে।
shallow এক স্তর গভীর পর্যন্ত অ্যারে, Map আর Set-এর উপাদানও তুলনা করে।
import { restate, shallow } from '@kkwaenggwari/restate';
function CartSummary() {
const { count, coupon } = useCart(
(cart) => ({ count: cart.items.length, coupon: cart.coupon }),
shallow,
);
return (
<p>
{count} items · {coupon || 'no coupon'}
</p>
);
}নিজের তুলনা
দ্বিতীয় আর্গুমেন্ট হিসেবে যেকোনো (left, right) => boolean ফাংশন চলে। shallow যথেষ্ট না হলে এটি ব্যবহার করুন, যেমন id দিয়ে তালিকা তুলনা করতে।
const ids = useCart(
(cart) => cart.items.map((item) => item.id),
(left, right) => left.length === right.length && left.every((id, index) => id === right[index]),
);batch দিয়ে পরিবর্তন জড়ো করা
প্রতিটি set সঙ্গে সঙ্গে সাবস্ক্রাইবারদের জানায়। একটি কাজ যখন কয়েকটি স্টোর বদলায়, তখন সেটি batch-এ মুড়ে দিন: মেমরি সঙ্গে সঙ্গে হালনাগাদ হয়, আর callback-এর পরে সাবস্ক্রাইবার একবার চলে।
import { batch } from '@kkwaenggwari/restate';
function checkout() {
batch(() => {
useCart.set((cart) => ({ ...cart, items: [] }));
useOrder.set((order) => ({ ...order, status: 'paid' }));
});
// Subscribers run once, after both stores changed.
}React-এর বাইরে সাবস্ক্রাইব
subscribeSelector শুধু বাছাই করা মান বদলালে আপনাকে কল করে, একই ঐচ্ছিক তুলনা ফাংশন সহ।
const stop = useCart.subscribeSelector(
(cart) => cart.items.length,
(count, previous) => analytics.track('cart-size', { count, previous }),
);বাইরের ইভেন্ট জোড়া
restate-এর দ্বিতীয় আর্গুমেন্ট একটি updater হতে পারে। প্রথম কম্পোনেন্ট বা সাবস্ক্রাইবার শোনা শুরু করলে এটি চলে, আর শেষজন থামলে এর পরিষ্কারকরণ চলে, তাই ব্রাউজার ইভেন্ট, সকেট বা সেন্সর শুধু দরকারের সময়টুকুই যুক্ত থাকে।
হাতে নিয়ন্ত্রণের জন্য start() আর stop() ব্যবহার করুন।
import { restate } from '@kkwaenggwari/restate';
// Listens while at least one component or subscriber uses the store.
export const useOnline = restate(true, ({ setState }) => {
const update = () => setState(navigator.onLine);
window.addEventListener('online', update);
window.addEventListener('offline', update);
update();
return () => {
window.removeEventListener('online', update);
window.removeEventListener('offline', update);
};
});