0Pricing
React Academy · درس

كتابة قصص CSF3

صدّر كائن meta افتراضيًا وقصصًا مسماة باستخدام Component Story Format 3.

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

ما هو CSF3؟

تنسيق قصص المكوّنات 3 (CSF3) هو تنسيق القصص الحالي في Storybook. القصص عبارة عن كائنات JavaScript أو TypeScript عادية، ولا تحتاج إلى دالة عرض في الحالات البسيطة.

تصدير Meta

يجب أن يحتوي كل ملف قصص على تصدير افتراضي، وهو كائن Meta، يصف المكوّن ويضبط تهيئة القصص المشتركة.

import type { Meta } from '@storybook/react';
import { Button } from './Button';

const meta: Meta<typeof Button> = {
  title: 'UI/Button',     // Storybook sidebar path
  component: Button,
  tags: ['autodocs'],     // enables auto-generated docs page
};

export default meta;

تصديرات القصص المُسمّاة

كل تصدير مُسمّى من الملف يمثل قصة. في CSF3، القصة كائن يحتوي على الخاصية args، وهي خصائص المكوّن.

import type { StoryObj } from '@storybook/react';

type Story = StoryObj<typeof Button>;

export const Primary: Story = {
  args: { label: 'Click me', variant: 'primary' },
};

export const Secondary: Story = {
  args: { label: 'Cancel', variant: 'secondary' },
};

export const Disabled: Story = {
  args: { label: 'Unavailable', disabled: true },
};

وراثة القصص

ترث القصص قيم args من كائن meta. اضبط القيم الافتراضية المشتركة في meta.args، وتجاوزها لكل قصة عند الحاجة.

const meta: Meta<typeof Button> = {
  component: Button,
  args: {
    onClick: fn(), // from @storybook/test
    disabled: false,
  },
};

export const Large: Story = {
  args: { size: 'large', label: 'Large Button' }, // merges with meta args
};

تجاوز دالة العرض

وفّر دالة render في القصة للحالات المعقدة التي تحتاج إلى تغليف مخصص بـ JSX أو إلى مثيلات متعددة.

export const WithIcon: Story = {
  render: (args) => (
    <div style={{ display: 'flex', gap: 8 }}>
      <Button {...args} icon={<StarIcon />} />
      <Button {...args} icon={<HeartIcon />} />
    </div>
  ),
  args: { label: 'Action' },
};

المزيّنات في القصص الفردية

أضف مصفوفة decorators إلى قصة لإحاطتها بموفّرات أو تخطيط إضافي خاص بتلك القصة وحدها.

export const InsideCard: Story = {
  decorators: [
    (Story) => (
      <div style={{ padding: 24, background: '#f5f5f5' }}>
        <Story />
      </div>
    ),
  ],
  args: { label: 'Card Button' },
};

المعلمات في القصص

استخدم parameters لتهيئة الإضافات لكل قصة، مثل ضبط الخلفية أو إطار العرض لحالة محددة.

export const DarkMode: Story = {
  parameters: {
    backgrounds: { default: 'dark' },
  },
  args: { label: 'Dark Button', variant: 'primary' },
};

الوسم autodocs

تؤدي إضافة tags: ['autodocs'] إلى meta إلى إنشاء صفحة توثيق تلقائية تحتوي على جدول الخصائص وأمثلة مباشرة من جميع القصص المُسمّاة.

قصة لكل حالة

اكتب قصة لكل حالة ذات معنى للمكوّن: فارغ، وقيد التحميل، وخطأ، وعنصر واحد، وعناصر متعددة، وتخطيط RTL، وغير ذلك.

export const Loading: Story = { args: { isLoading: true } };
export const Error: Story = { args: { error: 'Failed to load' } };
export const Empty: Story = { args: { items: [] } };
export const WithData: Story = { args: { items: mockUsers } };

اصطلاحات التسمية

استخدم أسماء قصص بصيغة PascalCase تصف الحالة. تجنّب الأسماء العامة مثل Default، وكن محددًا، مثل PrimaryDisabled وSecondaryWithIcon.

تجميع القصص باستخدام title

يستخدم title في meta تدوين الشرطات المائلة لإنشاء مجموعات متداخلة في الشريط الجانبي لـ Storybook: ينشئ 'Forms/Input' مجموعة Forms مع مجموعة فرعية باسم Input.

const meta: Meta<typeof TextInput> = {
  title: 'Forms/TextInput',
  component: TextInput,
};
// Sidebar: Forms → TextInput → Primary, Error, Disabled...

إعادة استخدام القصص في الاختبارات

قصص CSF3 كائنات عادية، لذا يمكنك استيرادها وتركيبها في اختبارات الوحدات أو في قصص أخرى.

import { Primary } from './Button.stories';

test('renders primary button', () => {
  render(<Button {...Primary.args} />);
  expect(screen.getByText('Click me')).toBeInTheDocument();
});

تحقق سريع

في CSF3، كيف تحدد خصائص القصة أو حالتها؟

خلاصة

قصص CSF3 كائنات محددة الأنواع تحتوي على args. اضبط القيم الافتراضية المشتركة في meta.args، وتجاوزها لكل قصة، واستخدم render لكتابة JSX مخصص، وأضف tags: ['autodocs'] لإنشاء التوثيق تلقائيًا. اكتب قصة لكل حالة ذات معنى للمكوّن.

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

هل درس «كتابة قصص CSF3» مجاني؟

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

ماذا ستتعلم في «كتابة قصص CSF3»؟

صدّر كائن meta افتراضيًا وقصصًا مسماة باستخدام Component Story Format 3. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «كتابة قصص CSF3»؟

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

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

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

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

  1. إعداد Storybook في مشروع React
  2. كتابة قصص CSF3
  3. Args وControls وإضافة Actions
  4. اختبار Storybook والانحدار البصري
← العودة إلى React Academy