در این مقاله قصد داریم تا در مورد یک مفهوم مهم در React یعنی props صحبت کنیم. در ادامه یاد میگیریم که چگونه میتوانیم از آنها برای پویا نگه داشتن جریان داده در برنامه خود استفاده کنیم.
در React برای انتقال دادهها از یک کامپوننت (کامپوننت parent) به کامپوننت دیگر (کامپوننت child) از props استفاده میکنیم. props یک راه کوتاهتر برای بیان ویژگیها است. آنها زمانی که میخواهیم جریان داده در برنامه ما به شکل پویا باشد، اهمیت زیادی پیدا میکنند و بسیار مفید هستند.
کامپوننت App.js
ما به صورت زیر است:
function App() { return ( <div className="App"> </div> ) } export default App
اکنون کامپوننت دیگری به نام Tool.js
ایجاد میکنیم. این فایل شامل اطلاعاتی در مورد ابزار مورد علاقه طراح محصول است. بدون props، کد مورد نظر ما شبیه مثال زیر خواهد بود:
function Tool() { return ( <div> <h1>My name is Ihechikara.</h1> <p>My favorite design tool is Figma.</p> </div> ); } export default Tool
اکنون این کامپوننت را در کامپوننت App
که داریم import میکنیم. یعنی:
import Tool from "./Tool" function App() { return ( <div className="App"> <Tool/> </div> ) } export default App
فرض کنید که کامپوننت Tool
برای توصیف طراحان مختلف و ابزارهای مورد علاقه آنها به کار برده میشود که قابلیت استفاده مجدد در کامپوننتهای مختلف را دارد.
در حالی که React امکان import کردن منطق یک کامپوننت را بدون بازنویسی کد برای ما آسانتر کرده است، این کامپوننت خاص قبلاً دادههای خود را به صورت ثابت کدگذاری میکند. این مفهوم به این معنی است که یا باید آن منطق را برای هر کامپوننت دیگر بازنویسی کنیم و یا این که از props برای تغییر دادههای کامپوننتهای مختلف استفاده کنیم.
اگر هنوز این مفهوم برای شما مبهم است باید بگوییم که props به ما اجازه میدهد تا از منطق یک کامپوننت به صورت پویا استفاده مجدد کنیم. یعنی این که دادههای کامپوننت ثابت نخواهد بود. بنابراین هر کامپوننت دیگری میتواند از آن منطق استفاده کند و دادههای آن را مطابق با نیازهایی که دارد تغییر دهد.
در این قسمت با دو روش استفاده از props آشنا میشویم: یکی بدون destructuring و دیگری با destructuring.
برای استفاده از props، باید آن را به عنوان آرگومان در تابع خود ارسال کنیم. این مفهوم شبیه به انتقال آرگومانها بین توابع در جاوااسکریپت معمولی است. به عنوان مثال:
function Tool(props) { const name = props.name; const tool = props.tool; return ( <div> <h1>My name is {name}.</h1> <p>My favorite design tool is {tool}.</p> </div> ); } export default Tool
اکنون تمام آنچه را که در مثال بالا اتفاق میافتد را مرحله به مرحله باهم بررسی میکنیم.
ما ارسال props به عنوان آرگومان را در خط اول و در کد function Tool(props){}
انجام دادیم. این کار به طور خودکار این امکان را به ما میدهد تا از props در کامپوننتهای دیگر برنامه React خود استفاده کنیم.
در کامپوننت Tool.js
متغیرهای مورد نظرمان را تعریف میکنیم:
const name = props.name; const tool = props.tool;
همانطور که میبینید، این متغیرها با متغیرهای معمولی متفاوت هستند، زیرا دادههای موجود در آنها به props مربوط میشوند.
اگر تمایلی به ایجاد متغیر برای propsها نداشته باشیم میتوانیم به صورت مستقیم از آنها استفاده کنیم، مثلا : <h1> My name is {props.name} </h1>
.
اکنون که متغیرهای مورد نظر خود را تعریف کردهایم میتوانیم از آنها در هر قسمتی از کد استفاده کنیم. مثلا:
return ( <div> <h1>My name is {name}.</h1> <p>My favorite design tool is {tool}.</p> </div> );
ما ساختن props را تمام کردهایم، بنابراین گام بعدی این است که دادهها را به آنها منتقل کنیم. قبلا کامپوننت Tool
را import کردهایم و در حال حاضر در مرورگر نمایش داده میشود که خروجی به شکل زیر است:
My name is . My favorite design tool is .
همچنین میتوانیم دادههای پیشفرضی را برای propsها ایجاد کنیم تا در هنگام تعریف کردن آنها خالی نباشند. نحوه انجام این کار را در بخش آخر خواهیم دید.
state فعلی کامپوننت App
به صورت زیر است:
import Tool from "./Tool" function App() { return ( <div className="App"> <Tool/> </div> ) } export default App
اکنون ممکن است تعجب کنید که دادهها دقیقاً به کجا ارسال میشوند. برای انجام این کار دادهها را همانند ویژگیها مقداردهی میکنیم. مثلا:
import Tool from "./Tool" function App() { return ( <div className="App"> <Tool name="Ihechikara" tool="Figma"/> </div> ) } export default App
به تغییری که اتفاق افتاد توجه کنید. <Tool/>
به <Tool name="Ihechikara" tool="Figma"/>
تبدیل شده است و این موضوع باعث ایجاد خطا نمیشود زیرا این ویژگیها به propsهای ایجاد شده در کامپوننت Tool
متصل هستند.
اکنون خروجی در مرورگر به شکل زیر خواهد بود:
My name is Ihechikara. My favorite design tool is Figma.
باید به این موضوع توجه داشته باشیم که نام متغیر به خودی خود prop نیست. اگر یک متغیر به شکل const myPropName = props.name
ایجاد میکردیم و آن را به صورت <h1>My name is {myPropName}</h1>
بهکار میبردیم باز هم کد ما، همانند زمانی که به شکل <Tool name="Ihechikara" tool="Figma"/>
نوشتیم، به درستی کار میکرد.
اکنون با استفاده از منطق تعریف شده در کامپوننت Tool
میتوانیم دادهها را به صورت پویا برای هر کامپوننت دیگری ایجاد کنیم.
در مرحله بعد، نحوه استفاده از propsها با destructuring را بررسی خواهیم کرد.
کد نویسی این بخش به غیر از روش تعریف props، کاملاً مشابه بخش آخر است. اگر با چگونگی استفاده از destructuring در جاوااسکریپت آشنا نیستید، پیشنهاد میکنیم این مقاله را بررسی کنید.
در بخش قبل، ما props را به شکل زیر تعریف کردیم:
const name = props.name; const tool = props.tool;
اما همراه با destructuring نیازی به انجام این کار نیست. به این ترتیب میتوانیم به سادگی از روش زیر استفاده کنیم:
function Tool({name, tool}) { return ( <div> <h1>My name is {name}.</h1> <p>My favorite design tool is {tool}.</p> </div> ); } export default Tool
تنها تفاوت در خط اول کد است. به جای اینکه props را به عنوان آرگومان ارسال کنیم، متغیرها را به عنوان آرگومان تابع destruct کرده و ارسال میکنیم. بقیه موارد همانند قبل است.
باید به این نکته توجه داشته باشیم که فقط به متغیرهای منفرد به عنوان دادههای props محدود نمیشویم بلکه میتوانیم توابع و یا حتی دادهها را از آبجکتها نیز ارسال کنیم.
اگر نمیخواهیم دادههای props هنگام ایجاد آنها خالی باشد، میتوانیم مقادیر پیشفرضی را برای آنها درنظر بگیریم. در این بخش نحوه انجام این کار بررسی میکنیم. مثلا:
function Tool({name, tool}) { return ( <div> <h1>My name is {name}.</h1> <p>My favorite design tool is {tool}.</p> </div> ); } Tool.defaultProps = { name: "Designer", tool: "Adobe XD" } export default Tool
در مثال بالا در قسمت انتهایی کد قبل از اینکه کامپوننت export شود، مقادیر پیش فرض را برای props تعریف کردیم. این کار را با نام کامپوننت، یک .
و defaultProps که هنگام ایجاد یک برنامه React ساخته میشود، شروع کردیم. سپس مقداردهی اولیه را انجام دادیم.
اکنون هر جا که این کامپوننت را import کنیم، آن مقادیر به جای خالی بودن، دارای مقادیر اولیه و پیشفرض خواهند بود. هنگامی که دادهها را مانند بخشهای قبلی به کامپوننت child ارسال میکنیم، مقادیر جدید این مقادیر پیشفرض را لغو کرده و جایگزین آنها میشوند.
در این مقاله همه مفاهیمی که برای شروع استفاده از propsها و انتقال دادهها به صورت پویا در کامپوننتهای خود نیاز داریم را مورد بررسی قرار دادیم. اما باید به خاطر داشته باشیم که بهترین راه برای درک این مفاهیم، تمرین و تکرار و ساختن برنامههای مختلف با آنها است.
دیدگاهها: