برنامه نویسی

React Context و Hooks: رویکرد مدرن به مدیریت دولتی 🚀

گذشت روزگار “حفاری پایه” و دیگ بخار مدیریت پیچیده. React's Context API، همراه با هوکس، نحوه مدیریت حالت را در برنامه های مدرن React متحول کرده است. در این غواصی عمیق، نحوه کار این ویژگی‌های قدرتمند را برای ایجاد کد تمیزتر و قابل نگهداری بیشتر بررسی خواهیم کرد.

مشکل: حفاری پایه

این را تصویر کنید: شما در حال ساخت یک تغییر دهنده تم برای برنامه خود هستید. موضوع باید توسط مؤلفه هایی در اعماق درخت مؤلفه شما قابل دسترسی باشد. به طور سنتی، شما این پایه تم را از طریق چندین مؤلفه میانی که حتی از آن استفاده نمی‌کنند عبور می‌دهید – عملی که به عنوان “حفاری پایه” شناخته می‌شود.

const App = () => {
  const [theme, setTheme] = useState('light');
  return (
    <Header theme={theme}>
      <Navigation theme={theme}>
        <UserProfile theme={theme} />
      Navigation>
    Header>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این رویکرد با رشد برنامه شما به سرعت غیرقابل نگهداری می شود. Context و Hooks را وارد کنید.

راه حل: زمینه + قلاب

1. ایجاد یک زمینه

ابتدا بیایید یک زمینه موضوعی ایجاد کنیم:

const ThemeContext = createContext({
  theme: 'light',
  toggleTheme: () => {},
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. الگوی ارائه دهنده

در مرحله بعد، یک مؤلفه ارائه دهنده ایجاد می کنیم که برنامه ما را بسته بندی می کند:

const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const toggleTheme = useCallback(() => {
    setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');
  }, []);

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    ThemeContext.Provider>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. قلاب سفارشی برای تجربه بهتر توسعه دهنده

بیایید یک قلاب سفارشی برای مصرف زمینه خود ایجاد کنیم:

const useTheme = () => {
  const context = useContext(ThemeContext);
  if (context === undefined) {
    throw new Error('useTheme must be used within a ThemeProvider');
  }
  return context;
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. قرار دادن همه چیز با هم

اکنون، هر جزء در درخت ما می تواند بدون حفاری پایه به حالت تم دسترسی داشته باشد:

const ThemedButton = () => {
  const { theme, toggleTheme } = useTheme();
  return (
    <button 
      onClick={toggleTheme}
      style={{ 
        background: theme === 'light' ? '#fff' : '#333',
        color: theme === 'light' ? '#333' : '#fff'
      }}
    >
      Toggle Theme
    button>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بهترین روش ها و نکات

1. ترکیب متن

همه چیز را در یک زمینه قرار ندهید. در عوض، زمینه های متعددی را برای نگرانی های مختلف بنویسید:

const AppProviders = ({ children }) => (
  <AuthProvider>
    <ThemeProvider>
      <UserPreferencesProvider>
        {children}
      UserPreferencesProvider>
    ThemeProvider>
  AuthProvider>
);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. بهینه سازی عملکرد

وقتی مقدار آن تغییر می کند، Context یک رندر مجدد را برای همه اجزای مصرف کننده ایجاد می کند. برای بهینه سازی عملکرد:

  • زمینه خود را به زمینه های کوچکتر و متمرکزتر تقسیم کنید
  • استفاده کنید useMemo برای مقادیر بافت پیچیده
  • پیاده سازی کنید React.memo برای مؤلفه هایی که به همه به روز رسانی های زمینه نیاز ندارند
const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const value = useMemo(() => ({
    theme,
    toggleTheme: () => setTheme(t => t === 'light' ? 'dark' : 'light'),
  }), [theme]);

  return (
    <ThemeContext.Provider value={value}>
      {children}
    ThemeContext.Provider>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. یکپارچه سازی TypeScript

افزودن TypeScript زمینه شما را قدرتمندتر می کند:

interface ThemeContextType {
  theme: 'light' | 'dark';
  toggleTheme: () => void;
}

const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

زمان استفاده از Context + Hooks

Context + Hooks برای:

  • مدیریت تم
  • وضعیت احراز هویت کاربر
  • ترجیحات زبان
  • پرچم های ویژه
  • هر حالت جهانی که مرتباً تغییر نمی کند

با این حال، برای مدیریت پیچیده ایالت با به روز رسانی های مکرر، ممکن است همچنان بخواهید راه حل هایی مانند Redux یا Zustand را در نظر بگیرید.

مثال دنیای واقعی: پشتیبانی از چند موضوع

بیایید یک سیستم تم پیشرفته تری را پیاده سازی کنیم:

const themes = {
  light: {
    primary: '#007AFF',
    background: '#FFFFFF',
    text: '#000000',
  },
  dark: {
    primary: '#0A84FF',
    background: '#000000',
    text: '#FFFFFF',
  },
  system: 'auto',
};

const ThemeContext = createContext({
  theme: themes.light,
  themeName: 'light',
  setThemeName: (name: 'light' | 'dark' | 'system') => {},
});

const useTheme = () => {
  const context = useContext(ThemeContext);
  if (!context) {
    throw new Error('useTheme must be used within ThemeProvider');
  }
  return context;
};

// Usage in components
const ThemedComponent = () => {
  const { theme, themeName, setThemeName } = useTheme();
  return (
    <div style={{ background: theme.background, color: theme.text }}>
      <select 
        value={themeName}
        onChange={(e) => setThemeName(e.target.value as 'light' | 'dark' | 'system')}
      >
        <option value="light">Lightoption>
        <option value="dark">Darkoption>
        <option value="system">Systemoption>
      select>
    div>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری:

React Context و قلاب یک راه حل قدرتمند و داخلی برای مدیریت حالت ارائه می دهد که برای بسیاری از موارد استفاده عالی است. با پیروی از بهترین شیوه ها و درک زمان استفاده از Context، می توانید برنامه های React قابل نگهداری و کارآمدتری ایجاد کنید.

زیبایی این روش در سادگی و انعطاف پذیری آن است. این گواهی بر تکامل React و تعهد آن به ایجاد ترکیب بندی اجزا و مدیریت حالت برای توسعه دهندگان است.

✨نکته حرفه ای: بهترین راه حل مدیریت دولتی اغلب ساده ترین راه حلی است که نیازهای شما را برآورده می کند. اگر Context و Hooks می توانند کار را انجام دهند، مسائل را بیش از حد پیچیده نکنید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا