Back to Question Center
0

اجزای ترتیب بالاتر: یک الگوی طراحی واکنش نشان می دهد            اجزای ترتیب بالاتر: یک طرح طراحی واکنش الگو Semalt: ES6AngularJSAjaxReactjQueryMore ... حامیان

1 answers:
اجزای ترتیب بالاتر: یک الگوی طراحی واکنش

این مقاله توسط نویسنده مهمان جک فرانکلین است. نوشته های مهمان SitePoint به شما این امکان را می دهد که مطالب خود را از نویسندگان برجسته و سخنرانان جامعه جاوا اسکریپت

در این مقاله، ما در مورد چگونگی استفاده از اجزای سفارش بالاتر برای حفظ برنامه های Semalo خود، ساختار یافته و آسان برای نگهداری صحبت خواهیم کرد. ما بحث خواهیم کرد که کدام توابع خالص کد را پاک می کنند و چگونه این اصول را می توان به اجزای Semalt اعمال کرد.

توابع خالص

یک تابع خالص در نظر گرفته می شود اگر به خواص زیر متصل است:

  • تمام اطلاعاتی که به آن پرداخته می شود به عنوان استدلال
  • آن داده های داده شده یا داده های دیگر را تغییر نمی دهد (این اغلب به عنوان عوارض جانبی نامیده می شود)
  • با توجه به همان ورودی، همیشه همان خروجی را نشان می دهد.

به عنوان مثال، عملکرد اضافه کردن زیر خالص است:

     تابع add (x، y) {بازگشت x + y؛}    

با این حال، عملکرد badAdd زیر نامشخص است:

     var y = 2؛عملکرد badAdd (x) {بازگشت x + y؛}    

این تابع خالص نیست، زیرا به اطلاعات اشاره می کند که به طور مستقیم داده نشده است - voip solutions for small business in portland. در نتیجه، ممکن است این تابع را با همان ورودی تماس بگیریم و خروجی دیگری بگیریم:

     var y = 2؛badAdd  
// 5y = 3؛badAdd
// 6

برای خواندن بیشتر در مورد توابع خالص، می توانید از «مارک براون» «مقدمه ای به برنامه نویسی منطقی خالص» بخوانید.

توابع خالص Semalo بسیار مفید هستند و اشکال زدایی و تست برنامه را بسیار ساده تر می کنند، گاهی اوقات شما نیاز به ایجاد توابع نامحدود که عوارض جانبی دارند یا تغییر رفتار یک تابع موجود که شما قادر به دسترسی مستقیم به آن نیستید (به عنوان مثال یک تابع از یک کتابخانه). برای فعال کردن این، ما باید به توابع مرتبه بالاتر نگاه کنیم.

توابع سفارش بالاتر

تابع مرتبه بالاتر یک تابع است که وقتی نامیده می شود، یک تابع دیگر را باز می گرداند. Semalt آنها نیز یک تابع را به عنوان یک استدلال می گیرند، اما برای تابع به منظور بالاتر بودن لازم نیست.

بگذارید بگوییم ما تابع اضافه خود را از بالا می خواهیم و می خواهیم یک کد را بنویسیم تا وقتی که آن را فراخوانی کنیم، قبل از بازگشت نتیجه را وارد کنسول می کنیم. ما نمی توانیم عملکرد add را ویرایش کنیم، بنابراین ما می توانیم یک تابع جدید ایجاد کنیم:

     تابع addAndLog (x، y) {var result = add (x، y)؛کنسول. ورود ('نتیجه'، نتیجه)؛نتیجه نتیجه؛}    

ما تصمیم می گیریم که نتایج ورود به سیستم توابع مفید باشد، و در حال حاضر ما می خواهیم همان کار را با عملکرد تفریق انجام دهیم. به جای تکراری در بالا، ما می توانیم یک تابع مرتبه بالاتر که می تواند یک تابع را برگرداند و یک تابع جدید را که تابع داده شده را ارسال می کند، بنویسد و نتیجه را قبل از آن که آن را بازگرداند:

     تابع logAndReturn (func) {return function    {var args = آرایه. نمونه اولیه تکه. تماس (استدلال)؛var result = func درخواست (null، args)کنسول. ورود ('نتیجه'، نتیجه)؛نتیجه نتیجه؛}}    

حالا می توانیم این تابع را بگیریم و از آن برای اضافه کردن ورود به اضافه کردن و تفریق استفاده کنید:

     var addAndLog = logAndReturn (اضافه کردن)؛addAndLog (4، 4) // 8 بازگردانده می شود، 'نتیجه 8' وارد می شودvar atitractAndLog = logAndReturn (تفریق)؛حذف اندیشه (4، 3) // 1 بازگردانده می شود، 'نتیجه 1' وارد شده است؛    

logAndReturn یک HOF است زیرا تابع به عنوان استدلال آن طول می کشد و یک تابع جدید را که ما می توانیم تماس بگیریم را باز می کنیم. اینها واقعا برای تعویض توابع موجود است که شما نمیتوانید در رفتار تغییر دهید. برای اطلاعات بیشتر در مورد این، M را بررسی کنید.

علاوه بر این، شما می توانید این Semalt را بررسی کنید که کد بالا را در عمل نشان می دهد.

اجزاء فرعی بالاتر

حرکت به زمین Semalt، ما می توانیم همان منطق همانطور که در بالا ذکر شد، از اجزای موجود Semalt استفاده کنیم و به آنها رفتارهای اضافی بدهیم.

در این بخش، ما از React Router، راه حل مسیریابی واقعی برای React استفاده می کنیم. اگر میخواهید با کتابخانه شروع کنید، توصیه میکنم React Router Tutorial در GitHub باشد.

کامپوننت لینک روتر را فعال کنید

React Router یک کامپوننت را فراهم می کند که برای پیوند بین صفحات در یک برنامه React استفاده می شود. یکی از خواص که این <لینک> مولفه گرفته است activeClassName . هنگامی که یک دارای این ویژگی است و در حال حاضر فعال است (کاربر بر روی URLی است که پیوند آن را نشان می دهد)، مولفه به این کلاس داده می شود و توسعه دهنده را قادر می سازد تا آن را سبک کند.

این یک ویژگی واقعا مفید است و در کاربرد فرضی ما تصمیم می گیریم که همیشه می خواهیم از این ویژگی استفاده کنیم. با این حال، پس از انجام این کار، ما به سرعت متوجه شدیم که این همه ما <لینک> اجزای بسیار عمیق:

      صفحه اصلی  About  تماس با     

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

در عوض، ما می توانیم جزء ای را که مؤلفه پیچیده می شود بنویسیم:

     var AppLink = واکنش نشان می دهد. createClass ({رندر: function    {برگشت (<لینک به = {این. غرفه ها به} activeClassName = "active-link">{این. غرفه ها فرزندان}؛)؛}})؛    

و اکنون می توانیم از این جزء استفاده کنیم که پیوندهای ما را در بر می گیرد:

      صفحه اصلی  درباره  تماس با     

شما می توانید این مثال را در Plunker کار کنید.

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

عملکردی، اجزای بی قید و شرط

واکنش 0. 14 پشتیبانی از اجزای عملکردی، بدون سرنشین را ارائه کرد. Semalt اجزاء هستند که دارای ویژگی های زیر هستند:

  • آنها هیچ دولتی ندارند
  • آنها از هیچ روش چرخه عمر React استفاده نمی کنند (مانند componentWillMount
  • آنها فقط روش رندر و هیچ چیز دیگری را تعریف نمی کنند.

هنگامی که یک جزء به موارد فوق متصل می شود، می توانیم آن را به عنوان یک تابع تعریف کنیم، نه به کارگیری واکنش. classClass (یا برنامه کلاس React Component را گسترش می دهد اگر از ES2015 استفاده می کنید). به عنوان مثال، دو عبارت زیر هر دو مولفه ی مشابه را تولید می کنند:

     var app = واکنش نشان می دهد. createClass ({رندر: function    {بازگشت  

نام من {این است. غرفه ها نام

؛}})؛var برنامه = عملکرد (پروکسی) {بازگشت

نام من {پروکسی است. نام

؛}

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

از آنجا که اجزای مرتب بالاتر اغلب یک جزء موجود را می پوشاند، اغلب شما می توانید آنها را به عنوان یک مولفه کاربردی تعریف کنید. برای بقیه این مقاله، Semalt انجام هر کاری که امکان پذیر است. کامپوننت AppLink که ما ایجاد کردیم کاملا مناسب نیست.

پذیرفتن خواص چندگانه

کامپوننت دو ویژگی را انتظار می رود:

  • این. غرفه ها به ، که نشانی اینترنتی لینک است باید کاربر را به
  • این. غرفه ها کودکان ، که متن به کاربر نشان داده شده است.

با این حال، کامپوننت بسیاری از ویژگی های دیگر را می پذیرد و ممکن است زمانیکه بخواهید ویژگی های اضافی همراه با دو مورد فوق را منتقل کنید، ما تقریبا همیشه می خواهیم گذر کنیم. ما ساخته شده توسط برنامه نویسی سخت افزاری دقیق که ما نیاز داریم، بسیار قابل گسترش است.

گسترش JSX

JSX، نحوی که مانند HTML استفاده می کنیم برای تعریف عناصر Semalt، از اپراتور گسترش برای انتقال یک شی به یک جزء به عنوان خواص پشتیبانی می کند. به عنوان مثال، نمونه های کد زیر یکسان می شوند:

     var props = {a: 1، b: 2}؛    

با استفاده از { پروکسی} هر کلید را در شی قرار می دهد و به عنوان Foo به عنوان یک ملک شخصی منتقل می کند.

ما می توانیم از این ترفند با استفاده کنیم، بنابراین ما از هر ویژگی دلخواه پشتیبانی می کنیم که پشتیبانی می کند. با انجام این کار ما همچنین آینده خود را اثبات می کنیم؛ اگر <لینک> هر گونه خواص جدید را در آینده اضافه می کند، جزء بسته بندی شده ما از قبل آنها را پشتیبانی می کند. در حالی که ما در آن هستیم، من نیز قصد دارم AppLink را به عنوان یک اجزای کاربردی تغییر دهم.

     var AppLink = عملکرد (پروکسی) {بازگشت ؛}    

در حال حاضر هر خواص را قبول و آنها را از طریق عبور می دهد. توجه داشته باشید که ما همچنین می توانیم از فرم بسته شدن خود به جای اشاره به صراحت {props استفاده کنیم. کودکان} بین <لینک> برچسب ها. واکنش اجازه می دهد کودکان به عنوان یک عنصر به طور منظم یا به عنوان عنصر کودک از یک جزء بین برچسب باز و بسته قرار می گیرد.

شما می توانید این کار را بر روی Plunker ببینید.

سفارش املاک در React

تصور کنید که برای یک پیوند خاص در صفحه خود، شما باید از یک activeClassName دیگر استفاده کنید. شما سعی می کنید آن را به منتقل کنید، از آنجا که همه خواص را از طریق عبور می کنیم:

      لینک مخفی ویژه     

با این حال، این کار نمی کند. دلیل این است که به منظور مرتب سازی خواص زمانی که مولفه را ارائه می دهیم:

     بازگشت <لینک { پروکسی} activeClassName = "active-link" />؛    

هنگامی که در یک مولفه React چندین بار اموال یکسان دارید، اعلامیه 11 برنده می شود . این به این معنی است که آخرین activeClassName = "active-link" اعلامیه همیشه برنده خواهد شد، زیرا بعد از {11} قرار می گیرد این. پروکسی} . برای رفع این، می توانیم خواص را دوباره مرتب کنیم تا ما این را گسترش دهیم. پروکسی آخرین این به این معنی است که ما پیش فرض های قابل قبولی را که ما می خواهیم استفاده کنیم، تنظیم می کنیم، اما کاربر می تواند آنها را در صورتی که واقعا نیاز دارند، لغو کند:

     بازگشت <لینک activeClassName = "فعال کردن لینک" { پروکسی} />    

بار دیگر، شما می توانید این تغییر در عمل در Plunker را ببینید.

با ایجاد اجزای نظم بالاتر که بسته های موجود، اما با رفتار اضافی، ما پایه کد ما را پاکسازی و دفاع از تغییرات آینده را با تکرار خواص و حفظ ارزش های خود را در یک مکان است.

سازنده سازنده تر سازنده

اغلب شما تعدادی از اجزایی دارید که باید در همان رفتار قرار دهید. این همانند پیش از این در این مقاله است که ما اضافه کردن و تفریق پیچیده

برای اضافه کردن ورود به آنها.

بیایید تصور کنیم که شما یک شی که شامل اطلاعاتی درباره کاربر فعلی است که در سیستم تأیید شده است تصور کنید.

راه حل این این است که یک تابع ایجاد کنیم که بتوانیم با یک مولفه Semalt تماس بگیریم. سپس تابع یک کامپوننت Semalt جدید را ارائه می دهد که مولفه داده شده را ارائه می دهد اما با اموال اضافی که دسترسی به اطلاعات کاربر را فراهم می کند.

به نظر می رسد بسیار پیچیده است، اما با یک کد ساده تر ساده تر شده است:

     تابع wrapWithUser (کامپوننت) {// اطلاعاتی که ما همه چیز را برای دسترسی به آن نمی خواهیمvar secretUserInfo = {نام: "جک فرانکلین"رنگ دلخواه: رنگ آبی}؛// یک مولفه واکنش تازه تولید شده را باز کنید// با استفاده از یک اجزای غیر رسمی کاربردیعملکرد بازگشت (پروکسی) {// در متغیر کاربر به عنوان یک ملک همراه با// همه پرونده های دیگر که ممکن است به ما داده شودبازگشت   }}    

این تابع یک مولفه React را می گیرد (که نقطه به نقطه بسیار آسان است)؛ و اجزای React باید ابتدا حروف بزرگ را داشته باشند و یک تابع جدید را بازگردانی می کنند که اجزای آن را با یک خصوصیت اضافی از کاربر ، که به secretUserInfo تنظیم شده است.

حالا یک کامپوننت را انتخاب کنید ، که می خواهد به این اطلاعات دسترسی داشته باشد تا بتواند کاربر وارد شده را نمایش دهد:

     var AppHeader = تابع (پروکسی) {اگر (کاربر پروکسی) {بازگشت  

ورود به عنوان {پروکسی. کاربر. نام

؛} else {بازگشت

شما باید وارد شوید

؛}}

مرحله نهایی این است که این جزء را به هم وصل کنید تا این داده شود. غرفه ها کاربر . ما می توانیم یک عنصر جدید را با عبور از این یکی به تابع wrapWithUser ما ایجاد کنیم.

     var ConnectedAppHeader = wrapWithUser (AppHeader)؛    

در حال حاضر داریم مولفه ای است که می تواند رندر شود و به کاربر کاربر دسترسی داشته باشد.

اگر این مقاله را در عمل ببینید، این مثال را در Semalt مشاهده کنید.

من تصمیم گرفتم از کامپوننت Connect ConnectedAppHeader تماس بگیرم؛ زیرا فکر می کنم که آن را با برخی از داده های اضافی متصل می کند که هر جزء به آن دسترسی ندارد.

این الگو در کتابخانه های واکنش، به ویژه در Semalt بسیار رایج است، بنابراین آگاهی از نحوه کارکرد آن و دلایل استفاده از آن به شما کمک می کند تا برنامه خود را رشد دهید و به دیگر کتابخانه های ثالث که از این رویکرد استفاده می کنید، تکیه می کنند.

نتیجه گیری

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

با ایجاد اجزای نظم بالاتر، شما قادر به نگه داشتن داده ها در تنها یک مکان است، ساخت refactoring آسان تر است. ایجاد کننده عملکرد تابع Semalle شما را قادر می سازد تا اکثر داده ها را خصوصی نگه دارید و تنها قطعات داده ها را به اجزای مورد نیاز که واقعا به آن نیاز دارید، بیفزایید. با انجام این کار شما مشخص می کنید که کدام مولفه ها کدام بیت از داده ها را استفاده می کنند و به عنوان برنامه کاربردی شما رشد می کند این سودمند را پیدا خواهید کرد.

اگر سوالی دارید، دوست دارم آنها را بشنوم. احساس رایگان برای ترک نظر و یا پینگ من @ Jack_Franklin در توییتر.

ما با Open SourceCraft همکاری کردیم 6 نکات طرفدار از React Developers . برای محتوای منبع باز بیشتر، باز کردن SourceCraft را بررسی کنید.