State Management مع Zustand — مقدمة React
State Management مع Zustand
Zustand هي مكتبة خفيفة وسهلة لإدارة الحالة في React.
التثبيت
npm install zustandإنشاء Store
import { create } from 'zustand';
const useStore = create((set, get) => ({
// الحالة
count: 0,
user: null,
// الإجراءات
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
reset: () => set({ count: 0 }),
setUser: (user) => set({ user }),
logout: () => set({ user: null }),
// يمكن الوصول للحالة داخل الإجراءات
doubleCount: () => {
const currentCount = get().count;
set({ count: currentCount * 2 });
},
}));
export default useStore;الاستخدام في المكونات
function Counter() {
// استخدام جزء من الحالة
const count = useStore((state) => state.count);
const increment = useStore((state) => state.increment);
return (
<div>
<p>العدد: {count}</p>
<button onClick={increment}>زيادة</button>
</div>
);
}
function UserInfo() {
const user = useStore((state) => state.user);
const logout = useStore((state) => state.logout);
if (!user) return <p>مرحباً زائر</p>;
return (
<div>
<p>مرحباً {user.name}</p>
<button onClick={logout}>تسجيل خروج</button>
</div>
);
}Persist (حفظ في localStorage)
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
const useSettingsStore = create(
persist(
(set) => ({
theme: 'light',
language: 'ar',
setTheme: (theme) => set({ theme }),
setLanguage: (language) => set({ language }),
}),
{
name: 'settings-storage', // اسم المفتاح في localStorage
}
)
);import { create } from 'zustand';
// Cart Store للتسوق
const useCartStore = create((set, get) => ({
items: [],
addItem: (product) => set((state) => {
const existing = state.items.find(i => i.id === product.id);
if (existing) {
return {
items: state.items.map(i =>
i.id === product.id
? { ...i, quantity: i.quantity + 1 }
: i
)
};
}
return { items: [...state.items, { ...product, quantity: 1 }] };
}),
removeItem: (productId) => set((state) => ({
items: state.items.filter(i => i.id !== productId)
})),
clearCart: () => set({ items: [] }),
get total() {
return get().items.reduce((sum, item) =>
sum + item.price * item.quantity, 0
);
}
}));
// الاستخدام
function Cart() {
const items = useCartStore((s) => s.items);
const total = useCartStore((s) => s.total);
const clearCart = useCartStore((s) => s.clearCart);
return (
<div>
{items.map(item => (
<div key={item.id}>{item.name} × {item.quantity}</div>
))}
<p>المجموع: {total} ريال</p>
<button onClick={clearCart}>إفراغ السلة</button>
</div>
);
}اختبر فهمك