0Pricing
Frontend Academy · درس

Redux Toolkit: createSlice وconfigureStore

عرّف شرائح الحالة باستخدام createSlice، وادمجها في configureStore، وأرسل الإجراءات من مكوّنات React باستخدام useDispatch وuseSelector.

Redux Toolkit: createSlice وconfigureStore درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

لماذا Redux Toolkit؟

يُعد Redux Toolkit (RTK) الأسلوب الرسمي ذي الرأي المحدد لكتابة منطق Redux. فهو يلغي الصياغة المتكررة في Redux العادي: فلا حاجة إلى سلاسل نصية يدوية لأنواع الإجراءات، أو reducers مطوّلة، أو إعداد معقّد للمخزن.

تثبيت Redux Toolkit

ثبّت RTK وارتباط React معًا.

npm install @reduxjs/toolkit react-redux

createSlice — الحالة وReducer والإجراءات

تنشئ createSlice جزءًا من الحالة مع reducer ومنشئات الإجراءات الخاصة به باستدعاء واحد. وهي تستخدم Immer داخليًا لإجراء تحديثات غير قابلة للتغيير.

import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: state => { state.value++; },     // Immer: mutate directly
    decrement: state => { state.value--; },
    reset: state => { state.value = 0; },
    incrementBy: (state, action) => { state.value += action.payload; }
  }
});

export const { increment, decrement, reset, incrementBy } = counterSlice.actions;
export default counterSlice.reducer;

configureStore — تجميع المخزن

تنشئ configureStore مخزن Redux بإعدادات افتراضية مناسبة: تفعيل Redux DevTools وإدراج middleware الخاص بـthunk.

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';
import cartReducer from './cartSlice';

export const store = configureStore({
  reducer: {
    counter: counterReducer,
    cart: cartReducer,
  }
});

// TypeScript types:
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

توفير المخزن

غلّف تطبيقك بـ<Provider store={store}> من react-redux.

import { Provider } from 'react-redux';
import { store } from './store';

ReactDOM.createRoot(document.getElementById('root')!).render(
  <Provider store={store}>
    <App />
  </Provider>
);

useSelector — قراءة الحالة

تقرأ useSelector(selector) من المخزن. وتعيد تصيير المكوّن عندما يتغيّر الجزء المحدد من الحالة.

import { useSelector } from 'react-redux';
import type { RootState } from './store';

function Counter() {
  const count = useSelector((state: RootState) => state.counter.value);
  return <p>Count: {count}</p>;
}

useDispatch — إرسال الإجراءات

تُعيد useDispatch() دالة dispatch الخاصة بالمخزن. استدعها مع منشئ إجراء لتفعيل تغيير في الحالة.

import { useDispatch } from 'react-redux';
import { increment, incrementBy } from './counterSlice';

function Controls() {
  const dispatch = useDispatch();
  return (
    <div>
      <button onClick={() => dispatch(increment())}>+1</button>
      <button onClick={() => dispatch(incrementBy(5))}>+5</button>
    </div>
  );
}

createAsyncThunk — الإجراءات غير المتزامنة

تتولى createAsyncThunk في RTK العمليات غير المتزامنة (مثل استدعاءات API)، وترسل إجراءات pending/fulfilled/rejected تلقائيًا.

import { createAsyncThunk } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk(
  'user/fetchById',
  async (userId: string) => {
    const res = await fetch(`/api/users/${userId}`);
    return res.json(); // becomes action.payload on fulfilled
  }
);

// In slice:
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => { state.loading = true; })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    });
}

RTK Query — جلب البيانات مضمّنًا

يوفّر RTK Query، وهو جزء من RTK، جلب البيانات وتخزينها مؤقتًا وإبطالها تلقائيًا. عرّف نقاط نهاية API واحصل على hooks مُنشأة تلقائيًا.

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const api = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  endpoints: (build) => ({
    getUsers: build.query<User[], void>({ query: () => 'users' }),
  })
});

// Generated hook:
const { data, isLoading, error } = api.useGetUsersQuery();

Immer في Reducers

يستخدم RTK مكتبة Immer داخليًا، لذلك يمكن لـreducers الخاصة بالـslice تعديل الحالة مباشرةً. تكتشف Immer التعديلات وتنتج كائن حالة جديدًا غير قابل للتغيير — فتحصل على سهولة التعديل مع أمان عدم قابلية التغيير.

Redux DevTools

تتيح إضافة Redux DevTools للمتصفح فحص كل إجراء مُرسل والحالة الناتجة، بل وتتيح أيضًا التنقّل الزمني: الانتقال إلى أي حالة سابقة. وهي لا تُقدَّر بثمن عند تصحيح تدفقات الحالة المعقّدة.

تحقّق سريعًا

ما الذي تُنشئه createSlice تلقائيًا في Redux Toolkit؟

مراجعة: Redux Toolkit

تجمع createSlice بين reducer والإجراءات في تعريف واحد. وتتيح Immer «تعديل» الحالة بأمان. ويجمع configureStore الـreducers مع DevTools وthunk. وتقرأ useSelector الحالة. وترسل useDispatch الإجراءات. ويُستخدم createAsyncThunk للتدفقات غير المتزامنة. أما RTK Query فيوفّر جلب البيانات كاملًا مع التخزين المؤقت.

الأسئلة الشائعة

هل درس «Redux Toolkit: createSlice وconfigureStore» مجاني؟

نعم — نص درس «Redux Toolkit: createSlice وconfigureStore» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «Redux Toolkit: createSlice وconfigureStore»؟

عرّف شرائح الحالة باستخدام createSlice، وادمجها في configureStore، وأرسل الإجراءات من مكوّنات React باستخدام useDispatch وuseSelector. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «Redux Toolkit: createSlice وconfigureStore»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Redux Toolkit: createSlice وconfigureStore
  2. Zustand لحالة React خفيفة
  3. Pinia لـ Vue: defineStore وstoreToRefs
  4. متى تستخدم الحالة العامة مقابل المحلية
← العودة إلى Frontend Academy