StyleSheet — چیست، ایجاد سبک‌ها در React Native

نویسنده: IT Sectr منتشر شده: 2026-07-06 زمان مطالعه: 10 دقیقه

StyleSheet — API React Native برای ایجاد و مدیریت سبک‌های کامپوننت‌ها، مشابه برگه‌های سبک CSS در توسعه وب. StyleSheet.create عملکرد را بهینه می‌کند، اشیاء سبک را به شناسه‌های عددی تبدیل کرده و انتقال داده را از طریق پل JavaScript-Native کاهش می‌دهد. برخلاف سبک‌های درون‌خطی، ایجاد از طریق create یک بار هنگام مقداردهی اولیه ماژول انجام می‌شود. درباره API بیشتر در مستندات متا بخوانید.

نکات اصلی

  • StyleSheet — API برای ایجاد اعلانی سبک‌ها با بهینه‌سازی از طریق شناسه‌های عددی
  • StyleSheet.create شیء سبک را به ID تبدیل می‌کند، داده‌های ارسالی از طریق پل JS-Native را کاهش می‌دهد
  • سبک‌های درون‌خطی در هر رندر اشیاء جدید ایجاد می‌کنند، StyleSheet.create — یک بار هنگام بارگذاری ماژول
  • Flexbox — اساس چیدمان در React Native: flexDirection، alignItems، justifyContent و flex
  • سازماندهی مدولار خروج سبک‌ها به فایل‌های جداگانه با ترکیب از طریق StyleSheet.flatten را فرض می‌کند

StyleSheet چیست؟

StyleSheet — API داخلی React Native برای تعریف سبک‌های کامپوننت‌ها. برخلاف CSS در توسعه وب، RN از اشیاء JavaScript برای توصیف سبک‌ها استفاده می‌کند. StyleSheet.create — روش کلیدی که یک شیء با سبک‌ها دریافت کرده و یک شیء با شناسه‌های عددی برمی‌گرداند.

StyleSheet بخشی از هسته React Native است و نیاز به نصب بسته‌های اضافی ندارد. طبق داده‌های متا (2026)، 95% پروژه‌های React Native از StyleSheet.create برای سبک‌های ایستا استفاده می‌کنند. جایگزین‌ها: styled-components، Emotion، NativeWind (Tailwind برای RN) — اما StyleSheet داخلی استاندارد هسته باقی می‌ماند.

تاریخچه و تکامل

در نسخه‌های اولیه React Native (2015) سبک‌ها منحصراً با اشیاء درون‌خطی تعریف می‌شدند. StyleSheet.create در RN 0.4 به عنوان یک بهینه‌سازی ظاهر شد. مفهوم از CSS گرفته شده است: سبک‌ها را برای خوانایی و عملکرد از منطق جدا کنید. با گذشت سال‌ها API گسترش یافت: absoluteFill، hairlineWidth، flatten اضافه شدند.

StyleSheet.create در مقابل سبک‌های درون‌خطی

تفاوت بین StyleSheet.create و سبک‌های درون‌خطی برای عملکرد حیاتی است. سبک درون‌خطی — یک شیء معمولی JavaScript است که در هر رندر کامپوننت ایجاد می‌شود. StyleSheet.create — شیئی که یک بار هنگام بارگذاری ماژول ایجاد شده و به ID عددی تبدیل می‌شود.

هنگام ارسال سبک درون‌خطی، React Native هر بار کل شیء را از طریق پل JavaScript-Native ارسال می‌کند. برای یک کامپوننت با سبک‌های پیچیده، این ده‌ها ویژگی است که در هر رندر ارسال می‌شود. StyleSheet.create فقط یک شناسه عددی ارسال می‌کند و بار پل را کاهش می‌دهد.

js
// StyleSheet.create — رویکرد بهینه
const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 16,
    backgroundColor: '#f5f5f5',
    borderRadius: 8,
  },
  title: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#333',
  },
});

// Inline style — در هر رندر یک شیء جدید ایجاد می‌کند
<View style={{
  flex: 1,
  padding: 16,
  backgroundColor: '#f5f5f5',
  borderRadius: 8,
}} />

<Text style={styles.title}>Title</Text>

چه زمانی از درون‌خطی استفاده کنیم: برای سبک‌های پویا وابسته به حالت (pressed, selected, active). برای سبک‌های ایستا همیشه از StyleSheet.create استفاده کنید. قانون: ایستا → create، پویا → تابع درون‌خطی.

چیدمان Flexbox از طریق StyleSheet

Flexbox — تنها مکانیزم چیدمان در React Native (CSS Grid پشتیبانی نمی‌شود و float وجود ندارد). StyleSheet.create برای توصیف کانتینرهای فلکس و عناصر فرزند آنها استفاده می‌شود. ویژگی‌های اصلی: flex (ضریب پرکنندگی)، flexDirection (row | column)، justifyContent، AlignItems.

به طور پیش‌فرض flexDirection در React Native — column است (در CSS — row). این اولین چیزی است که هنگام انتقال از توسعه وب باید به خاطر بسپارید. تمام Viewها به طور پیش‌فرض کانتینرهای فلکس هستند. برای مرکز کردن یک Element از AlignItems: 'center' + justifyContent: 'center' استفاده کنید.

js
const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    justifyContent: 'center',
    alignItems: 'center',
    padding: 20,
  },
  row: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    width: '100%',
  },
  box: {
    width: 50,
    height: 50,
    backgroundColor: 'blue',
  },
});

مهم: در React Native همه اندازه‌ها بدون واحد تعیین می‌شوند (فقط عدد). درصدها کار می‌کنند، اما فقط برای width و height نسبت به والد. margin و padding اعداد را می‌پذیرند. برای تطبیق‌پذیری به جای درصد از flex استفاده کنید — این در صفحه‌های مختلف مطمئن‌تر است.

API StyleSheet: create, flatten, hairlineWidth, absoluteFill

API StyleSheet شامل چند روش غیر از create است. StyleSheet.flatten آرایه‌ای از سبک‌ها را در یک شیء ترکیب می‌کند — برای ترکیب و ارسال سبک‌ها به کامپوننت‌های شخص ثالث مفید است. StyleSheet.hairlineWidth حداقل عرض قابل مشاهده خط را در دستگاه برمی‌گرداند.

StyleSheet.absoluteFill — سبک از پیش تعریف شده { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }. برای لایه‌های روکش، پنجره‌های مودال و موقعیت‌یابی مطلق در کل صفحه استفاده می‌شود. StyleSheet.absoluteFillObject — همان، اما به صورت شیء برای گسترش.

js
// flatten — ادغام سبک‌ها
const base = StyleSheet.create({
  button: { padding: 12, borderRadius: 8 },
  primary: { backgroundColor: 'blue' },
});

const combined = StyleSheet.flatten([base.button, base.primary]);
// { padding: 12, borderRadius: 8, backgroundColor: 'blue' }

// hairlineWidth — حداقل خط
const styles = StyleSheet.create({
  separator: {
    height: StyleSheet.hairlineWidth,
    backgroundColor: '#ccc',
  },
  overlay: {
    ...StyleSheet.absoluteFillObject,
    backgroundColor: 'rgba(0,0,0,0.5)',
  },
});

StyleSheet.hairlineWidth برای جداکننده‌ها و حاشیه‌ها مفید است — بدون توجه به تراکم صفحه، همیشه مانند 1 پیکسل فیزیکی به نظر می‌رسد. در نمایشگرهای Retina این 0.5 نقطه منطقی است، در معمولی — 1 نقطه. از hairlineWidth برای عناصری که باید اندازه دقیق مشخصی داشته باشند استفاده نکنید.

چیدمان تطبیقی با Dimensions API

Dimensions API همراه با StyleSheet برای چیدمان تطبیقی با اندازه‌های مختلف صفحه استفاده می‌شود. Dimensions.get('window') عرض و ارتفاع پنجره را برمی‌گرداند. برای به‌روزرسانی واکنشی هنگام چرخش صفحه از هوک useWindowDimensions از React Native استفاده کنید.

اگرچه StyleSheet.create مانند CSS از کوئری‌های رسانه پشتیبانی نمی‌کند، می‌توانید مقادیر را بر اساس Dimensions در داخل create محاسبه کنید یا از سبک‌های پویا از طریق تابع استفاده کنید. برای نقاط شکست، سبک‌های جداگانه برای محدوده‌های مختلف عرض ایجاد کنید.

js
import { useWindowDimensions } from 'react-native';

const ResponsiveCard = () => {
  const { width } = useWindowDimensions();
  const isLarge = width > 768;

  return (
    <View style={[styles.card, isLarge && styles.cardLarge]}>
      <Text>Responsive card</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  card: {
    width: '100%',
    padding: 16,
  },
  cardLarge: {
    width: '50%',
    alignSelf: 'center',
  },
});

useWindowDimensions به طور خودکار هنگام چرخش صفحه و تغییر اندازه پنجره در تبلت‌های دارای Split View به‌روزرسانی می‌شود. برای SSR (React Native Web) مطمئن شوید که Dimensions.get پس از نصب کامپوننت فراخوانی می‌شود تا از ناهماهنگی بین سرور و کلاینت جلوگیری شود.

سازماندهی سبک‌ها در پروژه

سازماندهی StyleSheet در پروژه بر قابلیت نگهداری و استفاده مجدد کد تأثیر می‌گذارد. سه رویکرد: سبک‌های محلی در داخل کامپوننت (styles.js در کنار کامپوننت)، سبک‌های سراسری (theme.js با ثابت‌های رنگ‌ها، فاصله‌ها، تایپوگرافی) و سبک‌های مدولار از طریق ترکیب.

ساختار توصیه شده: theme.js با ثابت‌های رنگ‌ها، اندازه‌ها و تایپوگرافی؛ Component.styles.js در کنار هر کامپوننت برای سبک‌های خاص آن؛ StyleSheet.flatten برای ترکیب سبک‌های پایه و خاص. برای پروژه‌های بزرگ از Design System با تولید تم استفاده کنید.

js
// theme.js — ثابت‌های سراسری
export const colors = {
  primary: '#6200EE',
  background: '#FFFFFF',
  text: '#1C1B1F',
  surface: '#F5F5F5',
};

export const spacing = {
  xs: 4, sm: 8, md: 16, lg: 24, xl: 32,
};

export const typography = {
  h1: { fontSize: 24, fontWeight: 'bold', lineHeight: 32 },
  body: { fontSize: 16, lineHeight: 24 },
};

// Button.styles.js
import { colors, spacing, typography } from './theme';

export default StyleSheet.create({
  button: {
    backgroundColor: colors.primary,
    paddingVertical: spacing.sm,
    paddingHorizontal: spacing.lg,
    borderRadius: 8,
  },
  text: {
    ...typography.body,
    color: '#FFFFFF',
    textAlign: 'center',
  },
});

مزایای سازماندهی مدولار: منبع واحد حقیقت برای رنگ‌ها و فاصله‌ها، ساده‌سازی بازآفرینی (primary را تغییر دادید — همه دکمه‌ها به‌روز شدند)، استفاده مجدد از سبک‌ها از طریق flatten، خوانایی و قابلیت پیش‌بینی کد. برای پروژه‌های TypeScript از طریق declare module به تم تایپ اضافه کنید.

سوالات متداول

آیا می‌توان از StyleSheet.create به صورت پویا استفاده کرد؟

StyleSheet.create برای سبک‌های پویا طراحی نشده است — یک بار هنگام بارگذاری ماژول فراخوانی می‌شود. برای سبک‌های وابسته به props یا حالت، از اشیاء درون‌خطی یا تابعی که آرایه‌ای از سبک‌ها برمی‌گرداند استفاده کنید.

تفاوت بین StyleSheet.create و object چیست؟

StyleSheet.create عملکرد را بهینه می‌کند: سبک‌ها به IDهای عددی تبدیل شده و از طریق پل JS-Native به عنوان اعداد ارسال می‌شوند. اشیاء معمولی هر بار در رندر ارسال می‌شوند. برای سبک‌های ایستا همیشه از create استفاده کنید.

چگونه سبک‌ها را در React Native به ارث ببریم؟

ارث‌بری مستقیم وجود ندارد. از StyleSheet.flatten برای ترکیب آرایه‌های سبک یا عملگر گسترش برای گسترش سبک پایه استفاده کنید. برای Text، سبک‌های والد توسط عناصر فرزند به ارث نمی‌رسند — هر Text نیاز به سبک‌های صریح دارد.

آیا StyleSheet از کوئری‌های رسانه پشتیبانی می‌کند؟

خیر، StyleSheet از media queries CSS پشتیبانی نمی‌کند. برای تطبیق‌پذیری از useWindowDimensions یا Dimensions API و سبک‌های شرطی استفاده کنید. کتابخانه react-native-responsive با نقاط شکست کمک می‌کند.

آیا می‌توان از فریم‌ورک‌های CSS با React Native استفاده کرد؟

StyleSheet از CSS پشتیبانی نمی‌کند. برای سینتکس مشابه Tailwind از NativeWind استفاده کنید. برای styled-components react-native-adaptation وجود دارد. برای اکثر پروژه‌ها، StyleSheet داخلی برای ایجاد UI با کیفیت کافی است.

خلاصه

  • StyleSheet — API داخلی React Native برای تعریف سبک‌ها از طریق اشیاء JavaScript با بهینه‌سازی از طریق شناسه‌های عددی
  • StyleSheet.create برای داده‌های ایستا بر سبک‌های درون‌خطی ترجیح دارد: سبک‌ها یک بار ایجاد می‌شوند، نه در هر رندر
  • Flexbox — اساس چیدمان در RN با flexDirection پیش‌فرض: column (برخلاف CSS)
  • StyleSheet.flatten آرایه‌های سبک را ترکیب می‌کند، absoluteFill کانتینر والد را پر می‌کند، hairlineWidth 1 پیکسل فیزیکی می‌دهد
  • useWindowDimensions تطبیق‌پذیری با صفحه‌های مختلف و چرخش‌های دستگاه را فراهم می‌کند
  • سازماندهی مدولار با theme.js و Component.styles.js قابلیت نگهداری کد را افزایش می‌دهد
  • StyleSheet.hairlineWidth برای جداکننده‌ها ضروری است — با تراکم پیکسل دستگاه سازگار می‌شود

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید