استایل نقشی حیاتی در ساخت اپلیکیشنهای وب جذاب و کاربرپسند دارد. در برنامههای React، راههای زیادی برای استایلدهی به کامپوننتها و المنتهای UI وجود دارد. در این مقاله قصد داریم تا چندین گزینه محبوب برای این کار را بررسی کنیم که عبارتند از:
ما ویژگیهای اصلی، مزایا و معایب هر مورد را بررسی میکنیم تا درنهایت بتوانیم مناسبترین روش استایلدهی برای پروژههای React خود را انتخاب کنیم.
pure CSS شامل نوشتن stylesheetها با استفاده از سینتکس استاندارد CSS و لینک دادن آنها به کامپوننتهای React است. این رویکرد ساده با پشتیبانی عالی، آن را به یک انتخاب بسیار خوب برای پروژههای با مقیاس کوچک تبدیل میکند. اما با رشد برنامه، مدیریت آن میتواند چالش برانگیز باشد.
import React from 'react'; import './MyComponent.css'; const MyComponent = () => { return ( <div className="my-component"> <h1 className="title">Hello, World!</h1> <p className="description">This is a styled React component.</p> <button className="btn">Click Me</button> </div> ); }; export default MyComponent;
در این مثال، کامپوننتی به نام MyComponent
داریم. برای اعمال استایلها با استفاده از pure CSS، یک فایل CSS خارجی به نام MyComponent.css
را import میکنیم. در ادامه فایل CSS را هم داریم:
.my-component { background-color: #f2f2f2; padding: 20px; border-radius: 5px; text-align: center; } .title { font-size: 24px; color: #333; margin-bottom: 10px; } .description { font-size: 16px; color: #777; } .btn { background-color: #007bff; color: #fff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; } .btn:hover { background-color: #0056b3; }
در این فایل CSS، استایلهایی را برای کلاسهای مختلفی که در کامپوننت مورد استفاده قرار گرفتهاند، تعریف میکنیم. کلاس my-component
به کانتینر div استایل میدهد، کلاس title
استایلدهی به heading را انجام میدهد، کلاس description
پاراگراف و کلاس btn
به باتن استایل میدهد.
هنگامی که MyComponent
رندر میشود، استایلهای تعریف شده اعمال میشوند. Div کانتینیر دارای بکگراند خاکستری روشن با padding و border-radius است. heading دارای سایز فونت بزرگتر و رنگ خاکستری تیره میباشد، در حالی که پاراگراف سایز فونت کوچکتر و رنگ خاکستری روشن دارد. باتن هم رنگ بکگراند آبی با متن سفید دارد که در حالت hover به آبی تیرهتر تبدیل میشود.
باید به این نکته توجه داشته باشیم که فایل CSS را به درستی import کنیم و مطمئن شویم که مسیر آن مطابق با ساختار پروژه ما باشد.
هدف ماژولهای CSS حل مسائل global scope و قابلیت استفاده مجدد از pure CSS است. آنها به ما اجازه میدهند تا stylesheetهای ماژولار بنویسیم، که در آنها نام کلاسها به کامپوننتهای خاصی محدود میشوند.
import React from 'react'; import styles from './MyComponent.module.css'; const MyComponent = () => { return ( <div className={styles.myComponent}> <h1 className={styles.title}>Hello, World!</h1> <p className={styles.description}>This is a styled React component.</p> <button className={styles.btn}>Click Me</button> </div> ); }; export default MyComponent;
در این مثال، ما یک فایل ماژول CSS خارجی به نام MyComponent.module.css
را import کرده و آن را به آبجکت styles
اختصاص میدهیم. آبجکت styles
شامل نگاشت class nameهای CSS به class nameهای منحصر به فرد تولید شده برای کامپوننت است. در ادامه فایل ماژول CSS را هم داریم:
.myComponent { background-color: #f2f2f2; padding: 20px; border-radius: 5px; text-align: center; } .title { font-size: 24px; color: #333; margin-bottom: 10px; } .description { font-size: 16px; color: #777; } .btn { background-color: #007bff; color: #fff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; } .btn:hover { background-color: #0056b3; }
در فایل ماژول CSS، استایلها را همانند CSS معمولی تعریف میکنیم، اما به جای استفاده از class nameهای global، از class nameهای local استفاده میکنید. این class nameهای local در محدوده کامپوننت قرار میگیرند و دارای نامهای منحصربهفردی هستند که در طول فرآیند ساخت، تولید میشوند.
هنگامی که MyComponent
رندر میشود، استایلهای ماژول CSS با استفاده از class nameهای مربوطه، از آبجکت styles
اعمال میشود. کانتینر div، heading، پاراگراف و باتن کامپوننت دارای استایلهای مربوطه هستند که بر روی آنها اعمال میشوند.
باید مطمئن شویم که از ویژگی className
استفاده کرده و به class nameهای ماژول CSS از آبجکت styles
در JSX کامپوننت خود ارجاع دهیم. سیستم ماژول CSS به طور خودکار این class nameها را به class nameهای منحصربهفرد تولید شده نگاشت میکند و از کپسولهسازی استایل و جلوگیری از تداخل class nameها اطمینان حاصل میکند.
توجه به این نکته ضروری است که فایل ماژول CSS باید دارای پسوند فایل .module.css
باشد تا ماژول به درستی کار کند.
preprocessorهای CSS مانند SASS، LESS یا Stylus ویژگیهای اضافی مانند متغیرها، nesting، mixins و موارد دیگر را ارائه میکنند. همینطور بهرهوری و قابلیت نگهداری کدهای CSS را هم افزایش میدهند.
در ادامه مثالی از نحوه استفاده از Sass برای استایل دادن به کامپوننت React را بررسی خواهیم کرد. ابتدا npm install node-sass
یا yarn add node-sass
را اجرا میکنیم تا مطمئن شویم که Sass را در پروژه خود نصب کردهایم.
import React from 'react'; import './MyComponent.scss'; const MyComponent = () => { return ( <div className="my-component"> <h1 className="title">Hello, World!</h1> <p className="description">This is a styled React component.</p> <button className="btn">Click Me</button> </div> ); }; export default MyComponent;
در این مثال، ما یک فایل SCSS خارجی به نام MyComponent.scss
را import میکنیم. توجه به این نکته لازم است که برای فایلهای Sass پسوند فایل .scss
باشد. در ادامه فایل SCSS را داریم:
.my-component { background-color: #f2f2f2; padding: 20px; border-radius: 5px; text-align: center; .title { font-size: 24px; color: #333; margin-bottom: 10px; } .description { font-size: 16px; color: #777; } .btn { background-color: #007bff; color: #fff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; &:hover { background-color: #0056b3; } } }
Tailwind CSS یک فریمورک utility-first برای CSS است که مجموعه گستردهای از کلاسهای utility از پیش تعریف شده را ارائه میدهد. استفاده از این فریمورک باعث توسعه سریعتر پروژه میشود.
ابتدا باید Tailwind CSS را در پروژه خود نصب کنیم. این کار را میتوانیم با کمک مستندات مربوط به Tailwind CSS انجام دهیم.
import React from 'react'; const MyComponent = () => { return ( <div className="bg-gray-200 p-4 rounded-lg text-center"> <h1 className="text-2xl text-gray-800 mb-2">Hello, World!</h1> <p className="text-base text-gray-600">This is a styled React component.</p> <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"> Click Me </button> </div> ); }; export default MyComponent;
در این مثال، ما هیچ فایل خارجی CSS یا SCSS را import نمیکنیم. در عوض، مستقیماً از کلاسهای utility تیلویند در JSX کامپوننت استفاده میکنیم. کلاسهای utility، استایلهای ready-to-use را برای قسمتهای مختلف کامپوننت ارائه میدهند.
کلاسهای utility مورد استفاده در این مثال (bg-gray-200
، p-4
، rounded-lg
، text-center
، text-2xl
، text-gray-800
، mb-2
، text-base
، text-gray-600
،bg-blue-500
، hover:bg-blue-700
، text-white
، font-bold
، py-2
، px-4
، rounded
) رنگ بکگراند، padding، border radius، text alignment، text size، text color، marginها، استایلهای باتن و موارد دیگر را تعیین میکنند.
وقتی MyComponent
رندر میشود، کلاسهای utility مربوطه از Tailwind CSS به المنتهای مربوطه اعمال شده و در نتیجه استایلهای مورد نظر ایجاد میشود.
البته باید مطمئن شویم که پروژه ما برای استفاده از Tailwind CSS به درستی پیکربندی شده باشد، از جمله import کردن stylesheetهای ضروری Tailwind CSS و اعمال فرآیند ساخت مورد نیاز، مانند اجرایnpm run build
یا yarn build
برای تولید فایل CSS آماده برای ساخت.
Tailwind CSS طیف گستردهای از کلاسهای utility را ارائه میکند که میتوانیم آنها را با هم ترکیب کرده و یک استایل دلخواه برای کامپوننت React خود ایجاد کنیم. برای اطلاعات بیشتر در مورد این کلاسها مطالعه مستندات رسمی Tailwind CSS میتواند مفید باشد.
کتابخانههای CSS-in-JS مانند Styled Components به توسعهدهندگان اجازه میدهد تا کدهای CSS را مستقیماً در کد جاوااسکریپت بنویسند، و به این ترتیب یک رویکرد منحصربهفرد برای استایلسازی ارائه میکنند. Styled Components راهی برای ایجاد استایلهایی با قابلیت استفاده مجدد در کامپوننتهای React ارائه میدهد.
ابتدا، با اجرای npm install styled-components
یا yarn add styled-components
، مطمئن میشویم که کتابخانه Styled Components را در پروژه خود نصب کردهایم.
import React from 'react'; import styled from 'styled-components'; const StyledDiv = styled.div` background-color: #f2f2f2; padding: 20px; border-radius: 5px; text-align: center; `; const StyledTitle = styled.h1` font-size: 24px; color: #333; margin-bottom: 10px; `; const StyledDescription = styled.p` font-size: 16px; color: #777; `; const StyledButton = styled.button` background-color: #007bff; color: #fff; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s ease; &:hover { background-color: #0056b3; } `; const MyComponent = () => { return ( <StyledDiv> <StyledTitle>Hello, World!</StyledTitle> <StyledDescription>This is a styled React component.</StyledDescription> <StyledButton>Click Me</StyledButton> </StyledDiv> ); }; export default MyComponent;
در این مثال، تابع styled
را از کتابخانه styled-components
import میکنیم. سپس با اختصاص دادن نتیجه فراخوانی styled
با المنتهای HTML مورد نظر به متغیرها (StyledDiv
، StyledTitle
، StyledDescription
، StyledButton
) styled components را ایجاد میکنیم.
در بکتیک (`) هر کامپوننت استایلدهی شده، CSSهای مختص آن کامپوننت را تعریف میکنیم.
هنگامی که MyComponent
رندر میشود، کامپوننتهایی که استایلها به آنها تعلق گرفته است، به جای المنتهای معمولی HTML مورد استفاده قرار میگیرند. استایلهای تعریف شده در کامپوننتهای استایل مربوطه، بر روی المنتهای مربوطه اعمال میشوند.
Styled Components این امکان را به ما میدهد تا CSS را مستقیماً در کد جاوااسکریپت خود بنویسیم و کپسوله کردن استایلها و ایجاد کامپوننتها با قابلیت استفاده مجدد را آسان میکند.
همچنین میتوانیم props را به Styled Component ارسال کنیم و از آنها برای ایجاد استایلهای داینامیک در CSS پویا استفاده نماییم.
البته باید مطمئن شویم که تابع styled
را از styled-components
import کردهایم و قبل از استفاده از آنها در کامپوننت مورد نظر، Styled Component خود را تعریف کنیم.
علاوه بر این، باید قبل از استفاده از Styled Componentها آن را را در پروژه خود نصب و پیکربندی کنیم.
کتابخانههای کامپوننت مانند Chakra UI، Material-UI، و Bootstrap کامپوننتهای React از پیش ساخته شده و استایلدهی شده را به همراه استایلهای همراه ارائه میدهند. این کتابخانهها یک زبان طراحی رابط کاربری منسجم را ارائه میدهند.
ابتدا، با اجرای npm install @mui/material
یا yarn add @mui/material
مطمئن میشویم که Material-UI را در پروژه خود نصب کردهایم.
import React from 'react'; import { styled } from '@mui/system'; import { Button, Paper, Typography } from '@mui/material'; const StyledPaper = styled(Paper)(({ theme }) => ({ backgroundColor: '#f2f2f2', padding: theme.spacing(2), borderRadius: theme.spacing(1), textAlign: 'center', })); const StyledTitle = styled(Typography)(({ theme }) => ({ fontSize: 24, color: '#333', marginBottom: theme.spacing(1), })); const StyledDescription = styled(Typography)(({ theme }) => ({ fontSize: 16, color: '#777', })); const StyledButton = styled(Button)(({ theme }) => ({ backgroundColor: '#007bff', color: '#fff', borderRadius: theme.spacing(1), padding: theme.spacing(1, 2), transition: 'background-color 0.3s ease', '&:hover': { backgroundColor: '#0056b3', }, })); const MyComponent = () => { return ( <StyledPaper> <StyledTitle variant="h1">Hello, World!</StyledTitle> <StyledDescription variant="body1">This is a styled React component.</StyledDescription> <StyledButton variant="contained">Click Me</StyledButton> </StyledPaper> ); }; export default MyComponent;
در این مثال، ما کامپوننتهای لازم یعنی Button
، Paper
و Typography
را از Material-UI و تابع styled
را از @mui/system
import میکنیم. سپس با استفاده از تابع styled
، styled component را ایجاد کرده و نتیجه را به متغیرها (StyledPaper
، StyledTitle
، StyledDescription
،StyledButton
) اختصاص میدهیم.
در تابعی که بهstyled
منتقل میشود، ما CSSها را برای هر styled component با استفاده از آبجکت (theme
) Material-UI برای قالببندی یکسان تعریف میکنیم.
وقتی MyComponent
رندر میشود، styled componentها بهجای کامپوننتهای معمولی Material-UI استفاده میشوند. استایلهای تعریف شده در کامپوننتهای استایل مربوطه به المنتهای مربوطه اعمال خواهند شد.
styled componentها در Material-UI از رویکردی مشابه Styled Components پیروی میکنند و این امکان را به ما میدهند تا با استفاده از تابع styled
و آبجکت تم Material-UI، استایلها را در کامپوننتهای خود کپسوله کنیم.
البته در ابتدا باید اطمینان حاصل کنیم که کامپوننتها و توابع لازم را از Material-UI وارد import کردهایم و قبل از استفاده از آنها در کامپوننتها، styled componentهای خود را تعریف کنیم.
همچنین به یاد داشته باشیم که Material-UI را قبل از استفاده، در پروژه خود نصب و پیکربندی کنیم.
در این مقاله سعی کردیم تا روشهای مختلف برای استایلدهی به یک برنامه React را باهم بررسی کنیم. طبق مطالبی که یاد گرفتیم، هر گزینه نقاط قوت و ضعف خاص مربوط به خود را دارد و ما میتوانیم با توجه به نیازهای پروژهای که داریم، هر یک از این موارد را انتخاب کنیم.