Professional Documents
Culture Documents
React JS
React JS
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
بسمه اهلل الرحمن الرحیم
2
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
تقديم به نائب امام عصر ,آيت اهلل خامنه ای که عصا زدنش ضرب آهنگ حيدری دارد.
تقديم به همه جويندگان علم که توان امکان و شرکت در کالس حضوری ندارند.
3
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
فهرست
21 . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
26 .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . پيش فرضProps
44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
46 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
48 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
49 . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
52 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Set State
54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Force Update
58 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
61 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
62 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
66 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
68 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
68 . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
70 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
71 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
73 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
80 . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . App.jsx
89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . main.js
10
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مقدمه
موسسه آموزشی تحليل داده ،با حضور جمعی از متخصصين مجرب در زمينه برنامه نويسی در نظر
دارد،مطالب آموزشی خود را در قالب کتاب های آموزشی و فيلم ،به صورت رايگان در دسترس عموم
قرار دهد تا حتی آن دسته از عزيزانی که بنا به داليل مالی،مسافت جغرافيايی و يا نداشتن وقت کافی ،
امکان شرکت در دوره های حضوری برای آنها ميسر نيست،از يادگيری بی بهره نمانند.
عالوه بر اين عالقه مندان می توانند ،با ثبت نام در انجمن سايت تحليل داده،سواالت خود را مطرح نموده
و مدرسين آموزشگاه و اعضای انجمن در اسرع وقت،پاسخ های خود را ،حتی االمکان به صورت فيلم ،در
دسترس عموم قرار دهند.
لذا از کليه فعاالن در اين زمينه دعوت می شود ،در اين حرکت جمعی در کنار ما باشند و با حضور فعال
خود در انجمن،گام موثری در بهبود سطح علمی جوانان کشور عزيزمان،ايران بردارند.
توجه :
برای دانلود سورس کد مثال های کتاب ,در بخش مقاالت سايت به آموزش ReactJSدر آدرس
www.tahlildadeh.comمراجعه فرماييد.
11
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
آموزش جامع React JS
Reactيک کتابخانه ی فرانت – اند بوده که توسط فيسبوک توسعه يافته است .با کمک آن می توان اليه
ی viewبرنامه های موبايل و وب را مديريت کرد .با کمک ReactJSمی توانيم اجزای رابط کاربری با
قابليت استفاده ی مجدد را ايجاد کنيم ReactJS .در حال حاضر يکی از محبوب ترين کتابخانه های جاوا
اسکريپت بوده و بنيان و جامعه ی عظيمی را به همراه دارد.
مخاطبان ReactJS
برنامه نويسان جاوا اسکريپتی که برای اولين بار با ReactJSسروکار دارند ،می توانند از اين آموزش
استفاده کنند .سعی خواهيم کرد که با نمايش نمونه کدهای ساده و قابل فهم به تمامی مفاهيم بپردازيم.
بعد از تمام کردن اين بخش ها شما بر ReactJSتسلط پيدا خواهيد کرد .اضافه بر آموزش خود به معرفی
عناصر بيشتری خواهيم پرداخت که در کنار ReactJSبه خوبی جواب می دهند تا بتوانيد با کمک آن ها
بهترين شيوه ها را فراگيريد و روندهای امروزی جاوا اسکريپت را دنبال کنيد.
اگر می خواهيد با ReactJSکار کنيد ،نياز است که دانش خوبی از جاوا اسکريپت HTML5 ،و CSS
داشته باشيد .با وجود اين که ReactJSاز HTMLاستفاده نمی کند JSX ،شبيه به HTMLاست،
بنابراين دانش HTMLشما به کمکتان خواهد آمد .در يکی از بخش ها به اين موضوع بيشتر خواهيم
پرداخت .همچنين از سينتکس EcmaScript 2015استفاده خواهيم کرد ،بنابراين هر دانشی که در اين
زمينه داريد ،برايتان مفيد خواهد بود.
12
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مروری بر مطالب
ReactJSيک کتابخانه ی جاوا اسکريپت است که می توان از آن جهت ساختن اجزای رابط کاربری با
قابليت استفاده ی مجدد استفاده کرد .در آموزش رسمی Reactتعريف زير برای آن بيان شده است:
Reactکتابخانه ای است که با کمک آن می توان رابط های کاربری قابل خواندن را ايجاد کرد .همچنين
اين کتابخانه ،ايجاد اجزای رابط کاربری قابل استفاده ی مجدد را تسهيل می کند؛ اجزايی که داده هايی را
نشان می دهند که در گذر زمان تغيير می کنند .بسياری از مردم مانند Vدر MVCاز Reactاستفاده
می کنند .انتزاع های DOM ،Reactرا از شما دور می کنند و مدل برنامه نويسی ساده تر و عملکرد
بهتری را برای شما فراهم می کنند .همچنين Reactمی تواند در سرور با استفاده از Nodeرندر شود و
می تواند با استفاده از React Nativeبرنامه های بومی را تقويت کند React .جريان داده ی واکنشی
يک طرفه را اجرا می کند .اين کار باعث می شود نياز به استفاده ی کدهای تکراری کاهش يابد و نسبت
به مقيدسازی سنتی داده درک کد آسان تر شود.
امکانات ReactJS
JSX: JSX افزونه ی سينتکس جاوا اسکريپت است .در برنامه نويسی ReactJSلزومی به
استفاده از JSXوجود ندارد ،اما توصيه می شود اين کار انجام شود.
اجزا ReactJS :پيرامون اجزا می چرخد .همه چيز را بايد به عنوان يک جزء در نظر بگيريد ،در
اين صورت می توانيد زمانی که بر روی پروژه های بزرگ تر کار می کنيد راحت تر از کد خود
نگهداری کنيد.
جريان داده ی يک طرفه و Flux : ReactJSاز جريان داده ی يک طرفه بهره می برد و به همين
دليل فهم برنامه را آسان تر می کند .فالکس الگويی است که با کمک آن می توانيد داده های
خود را يک طرفه نگه داريد.
13
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
اليسنس ReactJS :توسط شرکت فيسبوک اليسنس شده و آموزش آن تحت CC BY 4.0
اليسنس شده است.
مزايای ReactJS
استفاده از DOMمجازی که در واقع يک شیء جاوا اسکريپت است .از اين طريق می توانيد
عملکرد برنامه های خود را بهبود بخشيد .زيرا DOMمجازی جاوا اسکريپت سريع تر از DOM
معمولی است.
از ReactJSمی توانيد در هر دو سمت کالينت و سرور ،همچنين در فريمورک های ديگر استفاده
کنيد.
الگوهای داده و اجزا خوانايی برنامه ی شما را افزايش می دهند و از اين طريق می توانيد راحت
تر می توانيد از برنامه های بزرگ تر خود نگهداری کنيد.
در ReactJSتنها اليه ی viewبرنامه پوشش داده شده است .به همين دليل اگر می خواهيد
امکانات کامل برنامه نويسی را دريافت کنيد ،بايد از فناوری های ديگر استفاده کنيد.
در ReactJSاز قالب نويسی و JSXدرون خطی استفاده می شود که اين امر برای برخی از برنامه
نويسان ناخوشايند به نظر می رسد.
در اين بخش می خواهيم به چگونگی برپا کردن محيط جهت برنامه نويسی موفق در ReactJSبپردازيم.
توجه داشته باشيد که برای انجام اين کار مراحل زيادی نياز است ،اما اين کارها در آينده فرآيند برنامه
نويسی را سرعت می بخشند .برای انجام اين کار به NodeJSنياز خواهيم داشت .بنابراين اگر آن را
نصب نکرده ايد ،به لينک جدول زير مراجعه کنيد.
14
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
نرم افزار و توضيحات رديف
NodeJsو NPM
NodeJSپلتفرمی است که برای توسعه ی ReactJSبه آن نياز است .به برپا کردن محيط 1
NodeJSمراجعه کنيد.
پس از نصب موفق NodeJSمی توانيم با استفاده از React ،npmرا نصب کنيم .به دو صورت زير می
توانيد NodeJSرا نصب کنيد:
وب پک يک ماژول مجموعه ای است (ماژول های مستقل را مديريت کرده و آن ها را بارگيری می کند).
وب پک ماژول های وابسته را گرفته و آن ها را به يک فايل واحد کامپايل می کند .طی برنامه نويسی با
استفاده از خط فرمان يا با پيکربندی آن با استفاده از فايل webpack.configمی توانيد از وب پک
استفاده کنيد.
بابل يک کامپايلر و ترنسپايلر جاوا اسکريپت است Babel .در تبديل يک سورس کد به سورس کد ديگر
کاربرد دارد .با استفاده از اين قابليت می توانيد در کد خود از امکانات جديد ES6استفاده کنيد ،به گونه
ای که بابل اين امکانات را به ES5قديمی و ساده تبديل می کند تا بتوان از آن ها در تمامی مرورگرها
استفاده کرد.
15
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مرحله :1ايجاد پوشه ی اصلی برای ReactJS
در دسکتاپ پوشه ای با نام reactAppايجاد کنيد تا بتوانيد با استفاده از دستور mkdirفايل های مورد
نياز را نصب کنيد.
C:\Users\username\Desktop>mkdir reactApp
C:\Users\username\Desktop>cd reactApp
برای اين که بتوانيد هر ماژولی را ايجاد کنيد ،نياز است که فايل package.jsonرا توليد کنيد .بنابراين
پس از ايجاد اين پوشه ما بايد يک فايل package.jsonرا ايجاد کنيم .برای انجام اين کار از cmdدستور
npm initرا وارد کنيد.
C:\Users\username\Desktop\reactApp>npm init
اين دستور اطالعاتی در رابطه با ماژول را درخواست می کند؛ اطالعاتی مانند اسم بسته ،توضيحات ،ناشر
و . ...با استفاده از گزينه ی – yمی توانيد از اين مرحله عبور کنيد.
"version": "1.0.0",
"description": "",
"main": "index.js",
{ "scripts":
16
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
""test": "echo \"Error: no test specified\" && exit 1
},
"keywords": [],
"author": "",
}"license": "ISC
با توجه به اين که کار اصلی ما نصب ReactJSاست ،جهت نصب آن و بسته های DOMآن به ترتيب
از دستورات install reactو react-domمتعلق به npmاستفاده کنيد .می توانيد با گزينه ی save--
بسته هايی که ما نصب کرده ايم را به فايل package.jsonاضافه کنيد.
با توجه به اين که ما جهت توليد اين مجموعه در حال استفاده از وب پک هستيمwebpack-dev- ،
serverو webpack-cliرا نصب کنيد.
17
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
C:\Users\username\Desktop\reactApp>npm install webpack –save
C:\Users\username\Desktop\reactApp>npm install webpack-dev-server --save
C:\Users\username\Desktop\reactApp>npm install webpack-cli --save
، main.js ،App.js ،index.html جهت تکميل نصب بايد برخی از فايل های خاص را مانند
18
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
می توانيد اين فايل ها را يا به صورت دستی و يا با استفاده. ايجاد کنيمbabelrc. وWebpack.config.js
. ايجاد کنيدcmd از
می خواهيم نقطه ی ورودی وب. را باز کنيد و کد زير را به آن اضافه کنيدwebpack-config.js فايل
مسير خروجی جايی است که سرور به برنامه. شودmain.js پک را به گونه ای تنظيم کنيم که اين نقطه
.خدمات می رساند
اين پورت را می توانيد به صورت. تنظيم می کنيم8001 همچنين سرور برنامه نويسی را بر روی پورت
.دلخواه نيز انتخاب کنيد
webpack.config.js
entry: './main.js',
output: {
)'path: path.join(__dirname, '/bundle,
filename: 'index_bundle.js'
},
devServer: {
inline: true,
port: 8080 },
module: {
19
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['es2015', 'react']
}
}
]
}
, plugins:[
new HtmlWebpackPlugin({
template: './index.html'
})
]
}
" را از داخلtest" "echo \"Error: no test specified\" && exit 1" را باز کنيد وPackage.json
دليل پاک کردن اين خط اين است که ما در اين آموزش نيازی به آزمايش." پاک کنيدscripts" شیء
. را اضافه کنيمbuild وstart بياييد در عوض دستورات.نخواهيم داشت
" را به عنوان عنصر اصلی برنامه تنظيم میdiv id = "app . معمولی استHTML اين مرحله صرفا يک
کنيم و
<!DOCTYPE html>
<html lang = "en">
<head>
20
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
>"<meta charset = "UTF-8
><title>React App</title
></head
><body
>"<div id = "app
></div
>'<script src = 'index_bundle.js
></script
></body
></html
اين مرحله اولين جزء ری اکت را دربر می گيرد .در يکی از بخش های بعدی به صورت مفصل به اجزای
ری اکت خواهيم پرداخت .اين جزء باعث می شود Hello Worldرندر شود.
App.js
بايد اين جزء را ايمپورت کنيم و آن را در عنصر اصلی برنامه ی خود رندر کنيم تا بتوانيم آن را در
مرورگر ببينيم.
main.js
21
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
;'import React from 'react
;'import ReactDOM from 'react-dom
;'import App from './App.js
;))'ReactDOM.render(<App />, document.getElementById('app
نکته :هر زمان که بخواهيد از چيزی استفاده کنيد ،بايد آن را در مرحله ی اول ايمپورت کنيد .اگر می
خواهيد اين جزء در بخش های ديگر برنامه قابل استفاده باشد ،بايد آن را پس از ايجاد exportکنيد و
آن را در فايلی که می خواهيد از آن استفاده کنيد import ،کنيد .فايلی را با نام babelrc.ايجاد کنيد و
محتوای زير را در آن کپی کنيد.
{
]""presets":["env", "react
}
عمليات برپا کردن محيط تمام شده است و می توانيم با اجرای دستور زير سرور را راه اندازی کنيم.
C:\Users\username\Desktop\reactApp>npm start
با اجرای اين کار پورتی که ما می خواهيم در مرورگر باز شود ،نمايش داده می شود .اين پورت برای ما
http://localhost:8001/است .بعد از اين که اين پورت را باز کنيم ،نتيجه ی زير نمايش داده می شود.
22
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مرحله دهم :توليد نرم افزار
در نهايت برای آن که بتوانيد نرم افزار را توليد کنيد ،بايد دستور buildرا در cmdمانند زير اجرا کنيد.
اين کار باعث می شود اين نرم افزار مانند زير در پوشه ی فعلی توليد شود.
به جای استفاده از وب پک و بابل می توانيد به صورت ساده تری ReactJSرا با نصب create-react-
appنصب کنيد.
23
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
create-react-app نصب: 1 مرحله
. نصب کنيدCreate React App مانند زيرcmd به دسکتاپ برويد و با استفاده از
C:\Users\Tutorialspoint>cdC:\Users\Tutorialspoint\Desktop\
C:\Users\Tutorialspoint\Desktop>npx create-react-app my-app
ايجاد شود و تمامی فايل های مورد نياز درmy-app در دسکتاپ پوشه ای به نام،اين کار باعث می شود
.آن نصب شود
. توليد شده برويد و مانند زير تمامی فايل ها را حذف کنيدmy-app موجود در پوشه یsrc به پوشه ی
C:\Users\Tutorialspoint\Desktop>cd my-app/src
C:\Users\Tutorialspoint\Desktop\my-app\src>del *
C:\Users\Tutorialspoint\Desktop\my-app\src\*, Are you sure (Y/N)? y
. فايل ها را اضافه کنيدsrc موجود در پوشه یindex.js وindex.css با استفاده از نام های
24
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
مرحله : 4اجرای پروژه
npm start
ReactJSبه جای جاوا اسکريپت معمولی جهت قالب بندی از JSXاستفاده می کند .اجباری در استفاده
از آن وجود ندارد ،اما مزايای زير را به همراه دارد:
JSX سريع تر است؛ زيرا طی کامپايل کد به جاوا اسکريپت کار بهينه سازی را انجام می دهد.
اصطالحا type-safeاست و اغلب خطاها را می توان طی کامپايل شناسايی کرد.
نوشتن قالب ها به شرط آن که با HTMLآشنا باشيد را آسان تر و سريع تر می کند.
25
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
JSXدر بسياری از موارد شبيه به HTMLمعمولی است وقبال در بخش برپا کردن محيط از آن استفاده
کرده ايم .به کد App.jsxنگاه کنيد ،در اين کد divبرگشت داده می شود
App.jsx
{ )(render
( return
><div
!!!Hello World
></div
;)
}
با وجود اينکه JSXشبيه به HTMLاست ,اما اين دو تفاوت هايی دارند که در زمان کار با JSXبايد
آنها را در نظر داشت.
26
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
عناصر تو در تو
اگر می خواهيد عناصر بيشتری را برگشت دهيد ،نياز است که آن را با يک عنصر نگه دارنده بپوشانيد.
توجه کنيد که ما چگونه از divبه عنوان يک پوشاننده برای h2 ،h1و pاستفاده کرده ايم.
App.jsx
{ )(render
( return
><div
><h1>Header</h1
><h2>Content</h2
></div
;)
}
}
27
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
صفات مربوط ReactJS
عالوه بر ويژگی ها و صفت های HTMLمعمولی می توانيم از صفات اختصاصی مخصوص به خودمان نيز
استفاده کنيم .زمانی که می خواهيم صفات اختصاصی را اضافه کنيم بايد از پيشوند -dataاستفاده کنيم.
در مثال زير ما data-myattributeرا به عنوان صفتی برای عنصر pاضافه کرده ايم.
از اين عبارت ها می توان داخل JSXاستفاده کرد .تنها کافی است آن را داخل {} قرار دهيم .مثال زير
2را نمايش می دهد.
{ )(render
( return
><div
><h1>{1+1}</h1
></div
;)
}
}
داخل JSXنمی توانيم از دستورات if elseاستفاده کنيم ،در عوض می توانيم از عبارت های شرطی (بر
مبنای )3استفاده کنيم .در مثال زير متغير iبرابر با 1است .بنابراين مرورگر trueرا نمايش می دهد.
اگر مقدار اين متغير را تغيير دهيم ،مرورگر falseرا نمايش می دهد.
29
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
{ )(render
;var i = 1
( return
><div
></div
;)
}
}
سبک بندی
ReactJSتوصيه می کند از سبک های درون خطی استفاده شود .زمانی که می خواهيم اين نوع از سبک
ها را تنظيم کنيم ،نياز است از سينتکس camelCaseاستفاده کنيم ReactJS .نيز به صورت خودکار
pxرا پس از مقدار عددی عناصر مشخص می چسباند .در مثال زير چگونگی اضافه کردن myStyle
درون خطی به عنصر h1نشان داده شده است.
30
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
class App extends React.Component {
render() {
var myStyle = {
fontSize: 100,
color: '#FF0000'
return (
<div>
</div>
);
کامنت
31
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
اگر بخواهيم کامنت نويسی کنيم و بخواهيم اين کامنت ها را داخل بخش فرزند يک برچسب بنويسيم،
بايد از {} استفاده کنيم .بهتر است هميشه در زمان نوشتن کامنت ها از {} استفاده شود ،چرا که حفظ
ثبات طی برنامه نويسی مهم است.
{ )(render
( return
><div
><h1>Header</h1
></div
;)
}
}
هميشه در برچسب های HTMLاز اسم های برچسب با حروف کوچک استفاده می شود .اين در حالی
است که اجزای ReactJSبا حرف بزرگ آغاز می شوند.
32
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
نکته :بهتر است که به جای Classو forبه عنوان اسامی صفت XMLاز ClassNameو HtmlFor
استفاده شود.
اين مطلب در صفحه ی رسمی ReactJSبه صورت زير توضيح داده شده است:
با توجه به اين که JSXجاوا اسکريپت است ،بهتر است از شناساگرهايی مانند classو forبه عنوان
اسامی صفات XMLاستفاده نشود .در عوض بهتر است در اجزای DOM ReactJSبه ترتيب از ويژگی
هايی مانند classNameو htmlForاستفاده شود.
در اين بخش می خواهيم به چگونگی ترکيب اجزا بپردازيم ،به گونه ای که نگهداری از برنامه آسان تر
شود .با استفاده از اين روش می توانيم اجزای خود را بدون تحت تأثير قرار دادن بخش های باقی مانده
ی صفحه به روز رسانی کرده و تغيير دهيم.
اولين جزء ما درمثال زير Appاست .اين جزء مالک Headerو Contentاست .می خواهيم به صورت
مجزا Headerو Contentرا ايجاد کنيم و صرفا آن ها را داخل درخت JSXجزء Appخود اضافه کنيم.
تنها جزء Appبايد اکسپورت شود.
App.jsx
{ )(render
( return
33
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
<div>
<Header/>
<Content/>
</div>
);
render() {
return (
<div>
<h1>Header</h1>
</div>
);
}
}
class Content extends React.Component {
render() {
return (
<div>
<h2>Content</h2>
34
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
></div
;)
}
}
برای آن که بتوانيم نتيجه را در صفحه نمايش دهيم ،بايد اين کد را داخل فايل main.jsايمپورت کنيم و
)(reactDOM.renderرا فراخوانی کنيم .قبال اين کار را در بخش برپا کردن محيط انجام داده ايم.
main.js
35
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مثال با State
در اين مثال می خواهيم stateيا حالت جزء مالک ( )Appرا تنظيم کنيم .با توجه به اينکه جزء Header
هيچ حالتی ندارد ،آن را مانند مثال قبل اضافه می کنيم .به جای برچسب contentعناصر tableو tbody
را ايجاد می کنيم و از طريق آن ها به ازای هر شیء از آرايه ی TableRow ،dataرا به صورت پويا درج
می کنيم.
همان طور که مشخص است ،ما از سينتکس )>=( EcmaScript 2015 arrowاستفاده می کنيم .چرا که
اين سينتکس تميزتر از سينتکس قديمی جاوا اسکريپت به نظر می رسد .از اين طريق می توانيم عناصر
خود را با کدهای کمتری ايجاد کنيم .اين سينتکس به ويژه در مواقعی کاربرد دارد که بخواهيم ليستی را
با آيتم های بسياری ايجاد کنيم.
App.jsx
{ )(constructor
;)(super
this.state = { data:
[
{
"id":1,
"name":"Foo",
""age":"20
36
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
},
{
"id":2,
"name":"Bar",
""age":"30
},
{
"id":3,
"name":"Baz",
""age":"40
}
]
}
}
{ )(render
( return
><div
><Header/
><table
37
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
<tbody>
</tbody>
</table>
</div>
);
render() {
return (
<div>
<h1>Header</h1>
</div>
);
38
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
render() {
return (
<tr>
<td>{this.props.data.id}</td>
<td>{this.props.data.name}</td>
<td>{this.props.data.age}</td>
</tr>
);
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
از اين طريق.() استفاده می کنيمkey = {i} inside map توجه داشته باشيد که ما از تابع: نکته
به جای آن که زمانی که چيزی. راحت تر می تواند صرفا عناصر ضروری را به روز رسانی کندReactJS
39
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
تغيير می کند ،کل ليست را مجددا رندر کند .در صورتی که با تعداد زيادی از عناصری سروکار داشته
باشيم که به صورت پويا ايجاد شده اند ،اين کار باعث می شود عملکرد تا حد چشمگيری افزايش يابد.
Stateيا حالت مکانی است که داده ها از آن سرچشمه می گيرند .همواره بهتر است تا حد امکان حالت
خود را ساده در نظر بگيريم و تعداد اجزای حالت دار را به حداقل برسانيم .مثال اگر ده جزء داشته باشيم
که داده هايی را از حالتی نياز دارند ،بهتر است يک جزء نگهدارنده را ايجاد کنيم که اين حالت را برای
تمامی اين اجزا نگهداری کند.
استفاده از Props
در نمونه کد زير چگونگی ايجاد يک جزء حالت دار با استفاده از سينتکس EcmaScript2016نشان
داده شده است.
App.jsx
40
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
{ constructor(props) {
super(props);
this.state = {
render() {
return (
<div>
<h1>{this.state.header}</h1>
<h2>{this.state.content}</h2>
</div>
);
}
export default App;
main.js
تفاوت اصلی بين stateو propsاين است که propها تغيير ناپذير هستند .دليل اين امر اين است که
جزء نگهدارنده بايد حالتی را تعريف کند که بتوان آن را به روز رسانی کرده و تغيير داد .اين در حالی
است که اجزای فرزند تنها بايد داده ها را از حالت با استفاده از propsعبور دهند.
استفاده ازprops
اگر در جزء خود به داده های تغييرناپذيری نياز داريم ،می توانيم صرفا propsرا به تابع
)(reactDOM.renderموجود در main.jsاضافه کنيم و از آن داخل جزء خود استفاده کنيم.
App.jsx
42
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
render() {
return (
<div>
<h1>{this.props.headerProp}</h1>
<h2>{this.props.contentProp}</h2>
</div>
);
}
export default App;
main.js
43
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
پيش فرضProps
به جای آن که آن،می توانيد مقادير مشخصه ی پيش فرض را مستقيما در سازنده ی جزء تنظيم کنيد
. اضافه کنيدreactDom.render() را به عنصر
App.jsx
return (
<div>
<h1>{this.props.headerProp}</h1>
<h2>{this.props.contentProp}</h2>
</div>
);
App.defaultProps = {
44
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
headerProp: "Header from props...",
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
45
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
ReactJS مربوط بهState وProps
را در جزءstate ما. در برنامه نشان داده شده استprops وstate در مثال زير چگونگی ترکيب
وheaderProp . آن را به درخت جزء عبور داده ايمprops مادر تنظيم کرده ايم و با استفاده از
. تنظيم کرده ايمrender استفاده شده در اجزای فرزند را داخل تابعcontentProp
App.jsx
constructor(props) {
super(props);
this.state = {
render() {
return (
<div>
<Header headerProp = {this.state.header}/>
</div>
46
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
);
render() {
return (
<div>
<h1>{this.props.headerProp}</h1>
</div>
);
render() {
return
( <div>
<h2>{this.props.contentProp}</h2>
</div>
);
47
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
}
main.js
;))'ReactDOM.render(<App/>, document.getElementById('app
نتيجه باز هم تغييری نخواهد کرد و تنها چيزی که تغيير می کند ،منبع داده های ما است که در حال
حاضر از stateسرچشمه می گيرند .اگر بخواهيم اين برنامه را به روز رسانی کنيم ،بايد stateرا به روز
رسانی کنيم و به دنبال آن تمامی اجزای فرزند به روز رسانی خواهند شد .در بخش رويدادها بيشتر به
اين مطلب پرداخته شده است.
48
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
ارزيابی ويژگی ها ) ( Prop ValidationدرReactJS
ارزيابی ويژگی ها روشی مفيد جهت استفاده ی صحيح از اجزا به شمار می رود .از اين طريق می توانيم
طی برنامه نويسی از باگ ها و مشکالت آينده جلوگيری کنيم ،مخصوصا زمانی که برنامه به اندازه ی
کافی بزرگ می شود .همچنين اين قابليت خوانايی کد را افزايش می دهد ،زيرا از اين طريق می توانيم
ببينيم که چگونه از هر يک از اجزا بايد استفاده شود.
در اين مثال می خواهيم جزء Appرا به همراه تمام propهايی که نياز داريم ،ايجاد کنيم.
App.propTypesجهت ارزيابی ويژگی ها کاربرد دارد .اگر برخی از ويژگی ها از نوع صحيحی که ما
تعيين کرده ايم استفاده نکنند ،با هشدار کنسول مواجه می شويم .بعد از مشخص کردن الگوهای
ارزيابی App.defaultPropsرا تنظيم می کنيم.
App.jsx
;'import React from 'react
{ )(render
( return
><div
><h3>Array: {this.props.propArray}</h3
><h3>Func: {this.props.propFunc(3)}</h3
><h3>Number: {this.props.propNumber}</h3
49
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
<h3>String: {this.props.propString}</h3>
<h3>Object: {this.props.propObject.objectName1}</h3>
<h3>Object: {this.props.propObject.objectName2}</h3>
<h3>Object: {this.props.propObject.objectName3}</h3>
</div>
);
App.propTypes = {
propArray: React.PropTypes.array.isRequired,
propBool: React.PropTypes.bool.isRequired,
propFunc: React.PropTypes.func,
propNumber: React.PropTypes.number,
propString: React.PropTypes.string,
propObject: React.PropTypes.object
App.defaultProps = {
propArray: [1,2,3,4,5],
propBool: true,
50
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
propFunc: function(e){return e},
propNumber: 1,
propObject: {
objectName1:"objectValue1",
objectName2: "objectValue2",
objectName3: "objectValue3"
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
51
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
APIجزء ) ( API Componentدر ReactJS
در این بخش می خواهیم به بررسی APIجزء در ری اکت بپردازیم .برای این منظور به سه متد
setState(),forceUpdateو )( ReactDom.findDomNodeمی پردازیم .در کالس های جدید
ES6باید این apiرا به صورت دستی مقید کنیم .در این مثال از )this.method.bind(this
استفاده خواهیم کرد.
Set State
متد )( setStateمتدی است که در بروز رسانی حالت جزء کاربرد دارد .این متد جای حالت را
عوض نمی کند بلکه صرفا تغییراتی را بر حالت اصلی اعمال می کند.
{ )(constructor
;)(super
52
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
this.state = {
data: []
this.setStateHandler = this.setStateHandler.bind(this);
};
setStateHandler() {
myArray.push(item);
this.setState({data: myArray})
};
render() {
return (
<div>
</div>
);
53
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
;export default App
ما کار خود را با یک آرایه ی خالی آغاز کرده ایم .هر بار که بر روی دکمه کلیک کنیم ،حالت
مورد نظر ما به روز رسانی می شود .اگر 5بار بر روی دکمه کلیک کنیم در این صورت نتیجه
زیر را شاهد خواهیم بود.
Force Update
گاهی اوقات نیاز است که جزء خود را به صورت دستی به روز رسانی کنیم .برای انجام این کار
می توانیم از متد forceUpdateاستفاده کنیم.
{ )(constructor
;)(super
;)this.forceUpdateHandler = this.forceUpdateHandler.bind(this
;}
{ )(forceUpdateHandler
;)(this.forceUpdate
54
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
;}
{ )(render
( return
><div
></div
;)
}
}
;export default App
می خواهیم عددی تصادفی را تنظیم کنیم که هر بار که بر روی دکمه کلیک می کنیم به روز
شود.
55
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
import React from 'react';
constructor() {
super();
this.findDomNodeHandler = this.findDomNodeHandler.bind(this);
};
findDomNodeHandler() {
ReactDOM.findDOMNode(myDiv).style.color = 'green';
render() {
return (
<div>
<div id = "myDiv">NODE</div>
</div>
);
56
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
;export default App
بعد اينکه بر روی دکمه کليک می شود ,عنصر myDivبه رنگ سبز در می آيد.
از به روز رسانی , 0.14اغلب متدهای APIاجزای قديمی منسوخ يا حذف شده اند تا با ES6سازگار
شوند.
57
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
ComponentWillReceiveProps به محض به روز شدن ويژگی ها قبل از فراخوانی رندر
ديگر احضار می شود .ما اين متد را از setNewNumberو زمانی که حالت را به روز کرديم،
فعال کرديم.
ShouldComponentUpdate مقدار trueيا falseرا برگشت می دهد .اين متد به روز بودن
يا نبودن جزء را مشخص می کند و به صورت پيش فرض بر روی trueقرار دارد .اگر مطمئن
هستيد که جزء مورد نظر شما پس از به روز شدن حالت يا ويژگی ها نيازی به رندر ندارد ،می
توانيد مقدار falseرا برگشت دهيد.
ComponentWillUpdate درست قبل از رندر شدن فراخوانی می شود.
ComponentDidUpdate درست بعد از رندر شدن فراخوانی می شود.
ComponentWillUnmount پس از جدا شدن جزء از DOMفراخوانی می شود .ما جزء
خود را در main.jsاز DOMجدا می کنيم.
در مثال زير حالت اوليه ی تابع سازنده را مشخص کرده ايم .جهت به روز رسانی حالت از
setNewnumberاستفاده شده است .تمامی متدهای چرخه ی عمر داخل جزء Contentقرار دارند.
App.jsx
{ )constructor(props
;)super(props
{ = this.state
data: 0
}
58
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
this.setNewNumber = this.setNewNumber.bind(this)
};
setNewNumber() {
render() {
return (
<div>
</div>
);
componentWillMount() {
componentDidMount() {
59
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
console.log('Component DID MOUNT!')
componentWillReceiveProps(newProps) {
shouldComponentUpdate(newProps, newState) {
return true;
componentWillUpdate(nextProps, nextState) {
componentDidUpdate(prevProps, prevState) {
componentWillUnmount() {
}
render() {
return (
<div>
60
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
<h3>{this.props.myNumber}</h3>
</div>
);
}
export default App;
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
setTimeout(() => {
ReactDOM.unmountComponentAtNode(document.getElementById('app'));
}, 10000);
.پس از رندر اوليه نتيجه ی زير نمايش داده می شود
61
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
فرم ها ) ( Formsدر ReactJS
مثال ساده
در مثال زير می خواهيم يک فرم ورودی را به کمک }value = {this.state.dataتنظيم کنيم .از اين
طريق می توانيم هر زمان که مقدار ورودی تغيير می کند ،حالت را به روز رسانی کنيم .ما در اينجا از
رويداد onChangeاستفاده کرده ايم .اين رويداد تغييرات ورودی را زير نظر می گيرد و حالت را بر
اساس آن به روز رسانی می کند.
App.jsx
{ )constructor(props
;)super(props
{ = this.state
}
;)this.updateState = this.updateState.bind(this
;}
{ )updateState(e
;)}this.setState({data: e.target.value
62
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
}
render() {
return (
<div>
<h4>{this.state.data}</h4>
</div>
);
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
63
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
مثال پيچيده
در مثال زير چگونگی استفاده از فرم ها از جزء فرزند نشان داده شده است .متد onChangeبه روز
رسانی حالت را فعال می کند .سپس اين به روز رسانی به مقدار ورودی فرزند داده می شود و در صفحه
نمايش داده می شود .مثال مشابه در بخش رويدادها آورده شده است .هر زمان که نياز باشد حالت را از
جزء فرزند به روز رسانی کنيم ،بايد تابعی که به روز رسانی ( )updateStateرا به صورت يک ويژگی
( )updateStatePropمديريت می کند را عبور دهيم.
App.jsx
{ )constructor(props
;)super(props
{ = this.state
}
;)this.updateState = this.updateState.bind(this
;}
{ )updateState(e
64
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
this.setState({data: e.target.value});
render() {
return (
<div>
updateStateProp = {this.updateState}></Content>
</div>
);
render() {
return (
<div>
<h3>{this.props.myDataProp}</h3>
</div>
);
65
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
}
main.js
;))'ReactDOM.render(<App/>, document.getElementById('app
مثال ساده
اين مثال تا حدی ساده بوده و در آن می خواهيم تنها از يک جزء استفاده کنيم .در اين مثال از رويداد
onClickاستفاده شده است .اين رويداد پس از فشرده شدن دکمه تابع updateStateرا فعال می کند.
App.jsx
66
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
import React from 'react';
constructor(props) {
super(props);
this.state = {
this.updateState = this.updateState.bind(this);
};
updateState() {
render() {
return (
<div>
<h4>{this.state.data}</h4>
</div>
);
67
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
}
;export default App
main.js
;))'ReactDOM.render(<App/>, document.getElementById('app
رويدادهای فرزند
ما بايد حالت جزء مادر را از فرزند آن به روز رسانی کنيم .می توانيم مديريت کننده ی رويدادی را
( )updateStateدر جزء مادر ايجاد کنيم و آن را به عنوان يک ويژگی ( )updateStatePropبه جزء
فرزند عبور دهيم و در آن جا صرفا آن را فراخوانی کنيم.
App.jsx
;'import React from 'react
68
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
this.updateState = this.updateState.bind(this);
};
updateState() {
render() {
return (
<div>
updateStateProp = {this.updateState}></Content>
</div>
);
69
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
render() {
return (
<div>
<h3>{this.props.myDataProp}</h3>
</div>
);
ReactDOM.render(<App/>, document.getElementById('app'));
70
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
Refها مربوط بهReactJS
Refها در برگشت دادن مرجعی به عنصر کاربرد دارند .در اغلب مواقع بهتر است از refها پرهيز
کرد ،اما اگر به اندازه گيری DOMو يا به افزودن متدها به اجزا نياز داريم ref ،ها می توانند به ما
کمک کنند.
استفاده از Refها
در مثال زير چگونگی استفاده از refها جهت پاک کردن کادر ورودی نشان داده شده است .تابع
ClearInputبه کمک مقدار "ref = "myInputبه دنبال عنصر می گردد ،حالت را ريست می کند و پس
از فشرده شدن دکمه تمرکز را به آن وارد می کند.
App.jsx
{ )constructor(props
;)super(props
{ = this.state
'' data:
}
71
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
this.updateState = this.updateState.bind(this);
this.clearInput = this.clearInput.bind(this);
};
updateState(e) {
this.setState({data: e.target.value});
clearInput() {
this.setState({data: ''});
ReactDOM.findDOMNode(this.refs.myInput).focus();
render() {
return (
<div>
ref = "myInput"></input>
<h4>{this.state.data}</h4>
</div>
);
72
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
}
main.js
;))'ReactDOM.render(<App/>, document.getElementById('app
بعد از فشرده شدن دکمه ورودی پاک شده و تمرکز بر روی آن قرار می گيرد.
کليدهای ، ReactJSزمان کار با اجزايی که به صورت پويا ايجاد شده اند و يا در مواقعی که ليست های
شما توسط کاربران تغيير داده شده اند ،مفيد هستند .با تنظيم مقدار keyمی توانيد بعد از تغييرات
منحصر به فرد بودن اجزای خود را حفظ کنيد.
استفاده از کليدها
73
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
بياييد به صورت پويا عناصر Contentرا به همراه ايندکس منحصر به فرد ) (iايجاد کنيم .تابع mapسه
عنصر را از آرايه ی dataما ايجاد خواهد کرد .با توجه به اينکه مقدار keyبرای تمامی عناصر بايد منحصر
به فرد باشد ،برای هر يک از عناصر ايجاد شده iرا به عنوان يک کليد تعيين می کنيم.
App.jsx
{ )(constructor
;)(super
{ = this.state
[data:
{
component: 'First...',
id: 1
},
{
component: 'Second...',
id: 2
},
{
component: 'Third...',
74
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
id: 3
render() {
return (
<div>
<div>
</div>
</div>
);
render() {
return (
<div>
75
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
<div>{this.props.componentData.component}
</div>
<div>{this.props.componentData.id}</div>
</div>
);
main.js
ReactDOM.render(<App/>, document.getElementById('app'));
76
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
اگر در آينده برخی از عناصر را حذف کنيم ،آن ها را اضافه کنيم يا ترتيب عناصری که به صورت پويا
ايجاد شده اند را تغيير دهيم ReactJS ،برای حفظ ردگيری هر يک از عناصر از مقادير keyاستفاده
خواهد کرد.
ساده ترين راه برای نصب ReactJSروتر اجرای تکه کد زير در پنجره ی cmdاست.
در اين مرحله 4جزء را ايجاد خواهيم کرد .از جزء Appبه عنوان يک منوی تب استفاده خواهيم کرد.
3جزء ديگر ( ) )(About ،Homeو ( )Contactبعد از تغيير مسير رندر خواهند شد.
main.js
{ )(render
( return
77
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
<div>
<ul>
<li>Home</li>
<li>About</li>
<li>Contact</li>
</ul>
{this.props.children}
</div>
render() {
return (
<div>
<h1>Home...</h1>
</div>
)
78
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
render() {
return (
<div>
<h1>About...</h1>
</div>
}
export default About;
render() {
return (
<div>
<h1>Contact...</h1>
</div>
)
79
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
}
اين بار روتر، مانند مثال قبلApp به جای رندر کردن عنصر.حاال مسيرهايی را به برنامه اضافه می کنيم
. همچنين برای هر يک از مسيرها اجزايی را تنظيم می کنيم.رندر خواهد شد
main.js
ReactDOM.render((
</Route>
</Router>
), document.getElementById('app'))
80
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
پس از باز شدن برنامه 3لينک قابل کليک ظاهر می شوند که از طريق آن ها می توانيم تغيير مسير دهيم.
Fluxيک مفهوم برنامه نويسی بوده که طی آن داده در يک مسير حرکت می کند .اين داده به برنامه
وارد شده و تا زمانی که در صفحه نمايش داده شود ،در آن به جريان می افتد.
عناصر فالکس
در ادامه به توضيح ساده ای از مفهوم فالکس پرداخته شده است .در بخش بعد به چگونگی اجرای اين
مفهوم در برنامه خواهيم پرداخت.
81
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
مزايای فالکس
در اين بخش می خواهيم به چگونگی پياده سازی الگوی فالکس در برنامه های ReactJSبپردازيم.
برای انجام اين کار از فريمورک Reduxاستفاده می کنيم .هدف اين فصل ارائه ی ساده ترين مثال از
تمامی بخش های مورد نياز جهت اتصال Reduxو ReactJSاست.
مرحله – 1نصبRedux
82
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
component ها وreducer ، هاaction در اين بخش می خواهيم پوشه ها و فولدرهای مربوط به
. بعد از انجام اين کار ساختار پوشه ها به شکل زير درخواهد آمد.های خود را ايجاد کنيم
C:\Users\Tutorialspoint\Desktop\reactApp>mkdir actions
C:\Users\Tutorialspoint\Desktop\reactApp>mkdir components
C:\Users\Tutorialspoint\Desktop\reactApp>mkdir reducers
C:\Users\Tutorialspoint\Desktop\reactApp>type nul > actions/actions.js
C:\Users\Tutorialspoint\Desktop\reactApp>type nul > reducers/reducers.js
C:\Users\Tutorialspoint\Desktop\reactApp>type nul >
components/AddTodo.js C:\Users\Tutorialspoint\Desktop\reactApp>type
nul > components/Todo.js C:\Users\Tutorialspoint\Desktop\reactApp>type
nul > components/TodoList.js
هاAction – 3 مرحله
از ويژگیstore اکشن ها اشياء جاوا اسکريپتی هستند که جهت اطالع دادن به داده برای ارسال شدن به
اين عمل در اضافه کردن. را تعريف کنيمADD_TODO ما می خواهيم عمل. استفاده می کنندtype
ايجاد کننده ی عملی است که عمل ما را برگشت میaddTodo تابع.آيتم جديد به ليست کاربرد دارد
.دهد و برای هر يک از آيتم های ايجاد شده شناسه ای را تنطيم می کند
Actions/actions.js
83
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
'export const ADD_TODO = 'ADD_TODO
{ return
type: ADD_TODO,
id: nextTodoId++,
text
;}
}
در حالی که عمل ها تنها تغييرات را در برنامه فعال می کنند reducer ،ها اين تغييرات را مشخص می
کنند .ما برای جستجوی عمل ADD_TODOاز دستور switchاستفاده می کنيم reducer .تابعی است
که جهت محاسبه و برگشت يک حالت به روز شده دو پارامتر ( stateو )actionرا می گيرد.
تابع اول در ايجاد آيتم جديد و تابع دوم در ارسال اين آيتم به ليست کاربرد دارد .در همين راستا ما از
تابع کمکی combineReducersاستفاده می کنيم .در اين تابع می توانيم هر reducerجديدی را برای
روز مبادا اضافه کنيم.
Reducers/reducers.js
case ADD_TODO:
return {
id: action.id,
text: action.text,
default:
return state
switch (action.type) {
case ADD_TODO:
return [
...state,
todo(undefined, action)
default:
85
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
return state
todos
Store - 5 مرحله
ايجاد، هاreducer بعد از در اختيار داشتن. مکانی است که در آن حالت برنامه نگهداری می شودStore
عبور می دهيم که اين عنصر جزءprovider را به عنصرStore ما ويژگی. کار آسانی استStore يک
. ما را پوشش می دهدroute
main.js
86
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
let rootElement = document.getElementById('app')
render(
<App />
</Provider>,
rootElement
بخش مهمی که. آگاه باشدRedux تنها جزء اصلی بايد نسبت به. جزء اصلی برنامه است، App جزء
. کاربرد داردstore بهApp اين تابع جهت اتصال جزء اصلی. استconnect تابع،بايد به آن توجه کرد
گرفته و ويژگیstore حالت را ازselect تابع. را به عنوان يک آرگومان می گيردselect تابع،اين تابع
.) را برگشت می دهد که از آن ها می توانيم در اجزای خود استفاده کنيمvisibleTodos( هايی
App.jsx
render() {
return (
<div>
</div>
function select(state) {
return {
visibleTodos: state.todos
88
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
– اجزاء ديگر7 مرحله
Components/AddTodo.js
render() {
return (
<div>
Add
</button>
</div>
handleClick(e) {
this.props.onAddClick(text)
89
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
node.value = ''
Components/Todo.js
render() {
return (
<li>
{this.props.text}
</li>
Components/TodoList.js
90
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
{ )(render
( return
><ul
>= {this.props.todos.map(todo
<Todo
}key = {todo.id
}{...todo
>/
})
></ul
)
}
}
بعد از اجرای برنامه می توانيم آيتم هايی را به ليست خود اضافه کنيم.
91
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
انيميشن ها ) ) Animationدر ReactJS
در اين بخش می خواهيم به چگونگی متحرک کردن عناصر با استفاده از ReactJSبپردازيم.
اين برنامه افزونه ای برای ReactJSبوده که با کمک آن می توان انيميشن ها و گذارهای CSSاوليه را
ايجاد کرد .برای نصب آن از پنجره ی cmdکمک می گيريم.
برای اينکه بتوانيم در برنامه خود از اين فايل استفاده کنيم ,بايد آن را به عنصر هد index.htmlپيوند
دهيم.
><!DOCTYPE html
>"<html lang = "en
><head
>"<link rel = "stylesheet" type = "text/css" href = "./style.css
>"<meta charset = "UTF-8
><title>React App</title
></head
><body
><div id = "app"></div
><script src = 'index_bundle.js'></script
></body
92
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
</html>
عنصر از, کنيم را ايجاد ReactJS يک جزء ابتدايی می خواهيم حاال که
به عنوان پوشاننده ی جزئی که ما می خواهيم آن را متحرک کنيمReactCSSTransitionGroup
استفاده خواهيمtransitionAppearTimeout وtransitionAppear در اينجا از. استفاده می شود
. هستندfalse ،transitionLeave وtransitionEnter کرد در حالی که
App.jsx
render() {
return (
<div>
<h1>My Element...</h1>
</ReactCSSTransitionGroup>
</div>
93
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
);
main.js
Css/style.css
.example-appear {
opacity: 0.04;
.example-appear.example-appear-active {
opacity: 2;
94
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
.بعد از باز کردن برنامه عنصر مورد نظر ما محو می شود
از اين متحرک سازی ها می توانيم در زمانی استفاده کنيم که نياز است عناصری را از ليست حذف و يا
.به آن اضافه کنيم
App.jsx
constructor(props) {
super(props);
this.state = {
this.handleAdd = this.handleAdd.bind(this);
};
95
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
handleAdd() {
this.setState({items: newItems}); }
handleRemove(i) {
newItems.splice(i, 1);
this.setState({items: newItems});
render() {
return (
{item}
</div>
);
}.bind(this));
return (
<div>
96
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
<ReactCSSTransitionGroup transitionName = "example"
{items}
</ReactCSSTransitionGroup>
</div>
);
main.js
Css/style.css
.example-enter {
opacity: 0.04;
97
7 واحد- 561 پالک- جنب بانک صادرات- باال تر از خيابان ملک- خيابان شريعتی- تهران:آدرس
88146323 - 88446780 - 88146330
{ .example-enter.example-enter-active
;opacity: 5
}
{ .example-leave
;opacity: 1
}
{ .example-leave.example-leave-active
;opacity: 0.04
;transition: opacity 50s ease-in
}
پس از باز کردن برنامه و کليک کردن بر روی دکمه Add Itemپيام زير نمايش داده ميشود.
بعد از وارد کردن اسم و OKکردن ،عنصر جديد در حالت وارد شدن محو می شود.
98
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
حاال می توانيم با کليک کردن بر روی آيتم ها ،برخی از آن ها ( )...Item 3را حذف کنيم .اين کار
باعث می شود اين آيتم در حال خروج از ليست محو شود.
اين اجزا توابع جاوا اسکريپتی هستند که جهت افزودن قابليت های بيشتر به اجزای موجود کاربرد
دارند .اين توابع خالص هستند ،به اين معنی که داده ها را دريافت می کنند و بر اساس اين داده مقادير
را برگشت می دهند .اگر اين داده تغيير کند ،توابع با مرتبه ی باالتر با ورودی داده ی مختلف مجددا
اجرا می شوند .اگر بخواهيم جزء برگشتی خود را به روز رسانی کنيم ،نيازی نيست که اين اجزا را تغيير
دهيم .تنها کاری که بايد انجام دهيم اين است که داده ای که تابع ما در حال استفاده از آن است را
تغيير دهيم.
99
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
جزء با مرتبه ی باالتر ( )HOCجزء معمولی را پوشانده است و داده های ورودی بيشتری را فراهم می
کند .اين جزء در واقع تابعی است که يک جزء را می گيرد و جزء ديگری که جزء اصلی را می پوشاند
را برگشت می دهد.
بياييد برای درک بهتر اين مفهوم به مثال ساده ای نگاه کنيم MyHOC .تابع با مرتبه ی باالتری است
که تنها جهت عبور دادن داده به MyComponentکاربرد دارد .اين تابع MyComponentرا
دريافت می کند ،آن را به کمک newDataارتقا می دهد و جزء ارتقا يافته که در صفحه نمايش داده می
شود را برگشت می دهد.
{ = var newData
}
{ )(componentDidMount
{(this.setState
data: newData.data
;)}
}
{ )(render
100
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
}
;}
{ )(render
( return
><div
><h1>{this.props.data}</h1
></div
)
}
}
;)export default MyHOC(MyComponent
اگر برنامه را اجرا کنيم ،خواهيم ديد که اين داده بهMyComponentعبور داده شده است.
101
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
نکته:
از اجزای با مرتبه ی باالتر می توان برای کارايی های مختلفی استفاده کرد .اين توابع خالص اساس
برنامه نويسی تابعی را تشکيل می دهند .بعد از آن که به آن عادت کرديد ،خواهيد ديد که چقدر
نگهداری و ارتقاء برنامه برايتان راحت می شود.
در اين بخش می خواهيم ليستی از بهترين شيوه ها ،روش ها و تکنيک هايی که در برنامه نويسی به ما
کمک می کنند را ارائه کنيم.
:State تا حد امکان بايد از Stateيا حالت دوری کرد .جهت متمرکز کردن حالت و عبور دادن
آن به درخت اجزا به عنوان ويژگی اين روش ،روش مناسبی است .هر زمان که با گروهی از اجزا
سروکار داشته باشيم ،به گونه ای که اين اجزا به داده های يکسانی نياز داشته باشند ،بايد حول
آن ها يک عنصر نگهدارنده را تنظيم کنيم تا حالت را در خود نگهداری کند .الگوی فالکس برای
مديريت حالت در برنامه های ReactJSروش خوبی است.
PropType ها :هميشه بايد PropTypeها را تعريف کرد .از اين طريق می توانيم تمامی ويژگی
های برنامه را رديابی کنيم و راحت تر بر روی پروژه ی يکسان کار کنيم.
:Render منطق اغلب برنامه ها بايد داخل متد renderدر حرکت باشد .تا حد امکان بايد سعی
کنيم منطق متدهای چرخه ی عمر اجزا را به حداقل برسانيم و اين منطق را به متد رندر انتقال
دهيم .هرچه کمتر از حالت و ويژگی ها استفاده کنيم ،کدمان تميزتر می شود .هميشه بايد تا حد
امکان حالت را ساده کنيم .اگر می خواهيم چيزی را از حالت يا ويژگی ها محاسبه کنيم ،می توانيم
اين کار را داخل متد رندر انجام دهيم.
102
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330
:Composition گروه ReactJSپيشنهاد می کند که از اصل مسئوليت واحد استفاده شود .به اين
معنی که تنها يک جزء بايد مسئول يک کار باشد .اگر برخی از اجزا بيش از يک کار داشته باشند،
در اين صورت بايد آن ها را تجزيه کنيم و برای هر کار يک جزء جديد ايجاد کنيم.
اجزای با مرتبه ی باالتر ( :)HOCدر نسخه های قبلی ReactJSبرای مديريت کارهای با قابليت
استفاده ی مجدد ميکسين هايی پيش بينی شده بود .با توجه به اين که اين ميکسين ها در حال
حاضر منسوخ شده اند ،يکی از راه حل های جايگزين استفاده از HOCاست.
103
آدرس:تهران -خيابان شريعتی -باال تر از خيابان ملک -جنب بانک صادرات -پالک - 561واحد 7
88146323 - 88446780 - 88146330