TanStackAdvanced
Optimistic Update
সার্ভার response-এর আগেই UI আপডেট — snapshot, rollback ও settle pattern — বাংলায়।
7টি অংশবাংলা ভাষায়
Optimistic update মানে সার্ভারের জবাবের অপেক্ষা না করে UI-কে আগে বদলে ফেলা — আর অপব্যবহার হলে rollback করা। Delete-তে এটি খুব কার্যকর (UI lag disappears)।
Optimistic deletets
ts
export function useDeleteProductOptimistic() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => deleteProduct(id),
// 1) UI আগেই বদলে ফেলি
onMutate: async (id) => {
await queryClient.cancelQueries({ queryKey: productKeys.all });
// পুরনো সব list entries snapshot করে রাখি
const previousEntries = queryClient.getQueriesData({
queryKey: productKeys.lists(),
});
// সব list cache থেকে item সরিয়ে ফেলি
queryClient.setQueriesData<ProductListResponse>(
{ queryKey: productKeys.lists() },
(old) => {
if (!old) return old;
return {
...old,
items: old.items.filter((p) => p.id !== id),
total: old.total - 1,
};
}
);
return { previousEntries };
},
// 2) ব্যর্থ হলে রোলব্যাক
onError: (_error, _id, context) => {
context?.previousEntries.forEach(([key, data]) => {
queryClient.setQueryData(key, data);
});
toast.error("মুছতে ব্যর্থ — আবার চেষ্টা করুন");
},
// 3) শেষে সার্ভার-সত্যে মিলিয়ে নিই
onSettled: () => {
queryClient.invalidateQueries({ queryKey: productKeys.all });
},
});
}তিনটি ধাপের গুরুত্ব
| ধাপ | কাজ |
|---|---|
onMutate | cache cancel, snapshot, optimist UI |
onError | snapshot ফিরিয়ে rollback + toast |
onSettled | সবসময় invalidate → server-সত্য আসে |
কেন cancelQueries আগে
আগে চলা refetch আমাদের optimistic পরিবর্তনকে ওভাররাইট করতে পারে। cancelQueries সেগুলো বাতিল করে — তাই যতোক্ষণ না mutation শেষ, cache সেই জায়গায় stable থাকে।
সংযমে ব্যবহার
Optimistic সব জায়গায় নয় — যেখানে UI delay স্পষ্ট (delete, toggle) আর rollback সহজ। Create-তে সার্ভার id-এর প্রয়োজন, তাই সাধারণত নন-optimistic + invalidate-এই ভালো।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।