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 می توانند کار را انجام دهند، مسائل را بیش از حد پیچیده نکنید!