Back to Question Center
0

उच्च क्रम घटक: एक प्रतिक्रिया अनुप्रयोग डिझाईन पॅटर्न            उच्च क्रम घटक: एक प्रतिक्रिया अनुप्रयोग डिझाईन पटलसंबंधित Semalt: ES6 ANngularJSAjaxReactjQuery अधिक ... प्रायोजक

1 answers:
उच्च मागणी घटक: एक प्रतिक्रिया अर्ज डिझाईन पॅटर्न

हा लेख अतिथी लेखक आहे जॅक फ्रँकलिन . साइटपॉईंट अतिथी पोस्ट्सचा उद्देश आहे की आपल्याला जावास्क्रिप्ट समुदायाच्या प्रमुख लेखक आणि स्पीकर्समधील सामग्री मिळवून देण्यासाठी

या लेखात, आम्ही आपले सममूल्य अनुप्रयोग व्यवस्थित ठेवण्यासाठी उच्च मागणी घटकांचा वापर कसा करावा यावर चर्चा करू. शुद्ध कामे कोड स्वच्छ ठेवण्याबद्दल आम्ही चर्चा करू आणि हीच तत्त्वे साम्बाळ घटकांवर कशी लागू केली जाऊ शकतात.

शुद्ध कार्ये

खालील गुणधर्मांचे पालन केल्यास एक फंक्शन शुद्ध मानले जाते:

  • हा डेटा ज्यास हाताळला जातो तो वितर्क म्हणून घोषित केला जातो
  • हे देण्यात आलेली माहिती किंवा इतर कोणताही डेटा बदलला नाही (ह्याला सहसा साइड इफेक्ट्स )
  • म्हटले जाते - backlink submission sitesi.
  • समान इनपुट दिले, तो नेहमी समान आउटपुट परत करेल.

उदाहरणार्थ, खाली फंक्शन जोडा शुद्ध आहे:

     फलन जोडा (एक्स, वाय) {परतावा x + y;}    

तथापि, फंक्शन खाली खराब अॅड अपवित्र आहे:

     var y = 2;फंक्शन badAdd (x) {परतावा x + y;}    

हा फंक्शन शुद्ध नाही कारण तो डेटा थेट दिलेला नाही. परिणामी, या फंक्शनला समान इनपुटसह कॉल करणे शक्य आहे आणि भिन्न आउटपुट मिळू शकते:

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

शुद्ध कार्यांविषयी अधिक वाचण्यासाठी आपण मार्क ब्राउन द्वारे "संभाव्य शुद्ध प्रोग्रामिंगची ओळख" वाचू शकता.

नमदा शुद्ध कार्य अतिशय उपयुक्त आहेत आणि ऍप्लिकेशनचे डीबगिंग आणि चाचणी अधिक सोपी करते, कधीकधी आपल्याला अशुभ फंक्शन्स तयार करण्याची गरज पडते ज्यांचे दुष्परिणाम असतात, किंवा अस्तित्वात असलेल्या फंक्शनचे वर्तन बदला ज्यामुळे तुम्ही थेट प्रवेश करू शकणार नाही (उदाहरणार्थ ग्रंथालयाचा एक फंक्शन). हे सक्षम करण्यासाठी, आम्ही उच्च ऑर्डर फंक्शन्स पाहण्याची आवश्यकता आहे.

उच्च ऑर्डर कार्य

उच्च ऑर्डर फंक्शन म्हणजे एक फंक्शन असते, जे म्हणतात, दुसर्या फंक्शनची परत करते. सममूल्य ते देखील एक वादविवाद म्हणून कार्य करतात, परंतु एखाद्या कार्यासाठी उच्च क्रम मानले जाणे आवश्यक नसते.

चला आपण आपल्या वरुन फंक्शन जोडा असे म्हणूया, आणि आम्हाला काही कोड लिहायचा आहे, जेणेकरुन आपण त्याचे कॉल केल्यावर परिणाम परत करण्यापूर्वी आपण त्याचा निकाल कन्सोलवर लॉग करे. आम्ही अॅड फंक्शन संपादित करण्यास अक्षम आहोत म्हणून त्याऐवजी आम्ही एक नवीन फंक्शन तयार करू शकतो:

     फंक्शन addAndLog (x, y) {var परिणाम = जोड (एक्स, वाय);कन्सोल लॉग ('परिणाम', परिणाम);परतावा परिणाम;}    

आम्ही निर्णय घेतो की फंक्शन्सच्या लॉगिंग परिणाम उपयुक्त आहेत, आणि आता आपण वजाबाकी फंक्शनने हेच करायचे आहे. वरील दुप्पट करण्याऐवजी, आम्ही उच्च ऑर्डर फंक्शन लिहू शकतो ज्यामुळे फंक्शन घेता येते आणि नवीन फंक्शन मिळते जे त्यास दिलेल्या फंक्शनला कॉल करते आणि परिणाम परत येण्यापूर्वी परिणाम लॉग करते:

     कार्य लॉगआंद्रात्रन (फंक) {परतावा कार्य    {var आर्गस = अॅरे नमुना काप कॉल (वितर्क);var परिणाम = फंक. लागू (नल, आर्गस);कन्सोल लॉग ('परिणाम', परिणाम);परतावा परिणाम;}}    

आता आपण हे कार्य घेऊ आणि लॉगिंग जोडण्यासाठी ते वापरू आणि वजाबाकी :

     var addAndLog = logAndReturn (जोडा);addAndLog (4, 4) // 8 परत झाले आहे, 'Result 8' लॉग केले आहेvar सबटाॅक्टऔंडलोग = लॉग अँड्रेटन (वजाबाकी);वजाबास अँडलॉग (4, 3) // 1 परत आला आहे, 'निकाल 1' लॉग झाला आहे;    

(3 9) लॉग अँड्रेटन हा एचओएफ आहे कारण त्याची कार्यपद्धती त्याच्या मताप्रमाणे कार्य करते आणि आपण एक नवीन कार्य परत करू शकतो. आपण वर्तन मध्ये बदलू शकत नाही की विद्यमान फंक्शन्स ओघ साठी हे खरोखर उपयुक्त आहेत. याबद्दल अधिक माहितीसाठी एम तपासा.

याव्यतिरिक्त, आपण हे सेमिलेट तपासू शकता, जे उपरोक्त कोड क्रिया दर्शविते.

उच्च ऑर्डर घटक

मिमल जमिनीत जाणे, आम्ही उपरोक्त समान घटक वापरण्यासाठी उपरोक्त समान तर्कशास्त्र वापरू शकतो आणि त्यांना काही अतिरिक्त आचरण देऊ शकतो.

या विभागात, आम्ही प्रतिक्रिया रूटरचा उपयोग करणार आहोत, रिटॅक्टसाठी डे फॅक्टो रूटिंग सोल्यूशन. आपण ग्रंथालयासह प्रारंभ करू इच्छित असल्यास, मी GitHub वरील प्रतिक्रिया रूटर प्रशिक्षणाची शिफारस करतो.

राऊटरचा दुवा घटक

प्रतिक्रिया रूटर एक (3 9) <दुवा> घटक प्रदान करते ज्याचा उपयोग रिऍक्ट ऍप्लिकेशन मध्ये पृष्ठांदरम्यान जोडण्यासाठी केला जातो. यापैकी एक <दुवा> घटक लागतो activeClassName . जेव्हा एक <दुवा> ही प्रॉपर्टी आहे आणि सध्या ती सक्रिय आहे (वापरकर्ता एका URL वर आहे ज्याला दुवा निर्देश करते), घटक हा वर्ग दिला जाईल, विकसकाने ते शैलीमध्ये सक्षम केले जाईल

हे खरोखर उपयुक्त वैशिष्ट्य आहे आणि आमच्या काल्पनिक अर्जामध्ये आपण हे ठरविण्याचा प्रयत्न करतो की आम्ही नेहमी या मालमत्तेचा वापर करू इच्छितो. तथापि, असे केल्याने आम्हाला त्वरेने शोधते की हे सर्व आमच्या <दुवा> घटक अतिशय क्रियापद बनवत आहे:

     <लिंक्स = "/" activeClassName = "active-link"> होम <दुवा = "/ about" activeClassName = "active-link"> बद्दल <दुवा = "/ संपर्क" activeClassName = "सक्रिय-दुवा"> संपर्क साधा     

सममूल्य म्हणजे आम्हाला प्रत्येक वेळी वर्ग नाव गुणधर्म पुन्हा सांगावी लागणार आहे. हे केवळ आमच्या घटकांना वर्बोज बनवत नाही तर याचा अर्थ असा होतो की जर आपण क्लासचे नाव बदलण्याचे ठरवले तर आम्हाला अनेक ठिकाणी हे करणे आवश्यक आहे.

त्याऐवजी, आपण <दुवा> घटक:

ओघाने एक घटक लिहू शकतो.
     var ऐपलिंक = प्रतिक्रिया createClass ({रेंडर: फंक्शन    {परत (<दुवा = {हे. प्रॉप्स to} activeClassName = "active-link">{हे. प्रॉप्स मुले};);}});    

आणि आता आम्ही हा घटक वापरु शकतो, जे आमच्या दुवेसंपादन करते:

      मुख्यपृष्ठ  बद्दल>  संपर्क     

आपण प्लंकरवर काम करताना हे उदाहरण पाहू शकता.

प्रतिक्रिया पर्यावरणातील, हे घटक उच्च ऑर्डर घटक म्हणून ओळखले जातात, कारण ते विद्यमान घटक घेतात आणि थोडे बदल करतात विद्यमान घटक न बदलता . आपण यापैकी आवरण घटकांबद्दल विचार करू शकता, परंतु आपल्याला रिटॅक्ट-आधारित सामग्रीमध्ये सामान्यतः उच्च ऑर्डर घटक म्हणून ओळखले जाईल.

कार्यात्मक, स्थावर मालमत्ता

प्रतिक्रिया 0. कार्यशील, स्टेटलेस घटकांकरिता 14 स्वरूपात समर्थन. मिमल म्हणजे खालील घटक आहेत:

  • त्यांच्याकडे राज्य नाही
  • ते जीवनचक्राच्या कोणत्याही पद्धतींचा वापर करीत नाहीत (जसे की घटकवॉलमाउंट )
  • ते केवळ रेंडर पद्धत आणि आणखी काहीही परिभाषित करतात.

जेव्हा एखादा घटक वरील गोष्टींचा पालन करतो तेव्हा आपण त्याचा वापर करण्याऐवजी प्रतिक्रिया वापरुन फंक्शन म्हणून परिभाषित करू शकतो. createClass (किंवा (3 9) क्लास ऍप रिटॅक्ट वाढवा. घटक जर आपण ES2015 क्लासेस वापरत असाल). उदाहरणार्थ, खालील दोन समीकरणांमधून समान घटक उत्पन्न करतात:

     var ऐप = प्रतिक्रिया. createClass ({रेंडर: फंक्शन    {परत  

माझे नाव हे आहे प्रॉप्स नाव}

;}});var ऍप = फंक्शन (प्रॉप्स) {परतावा

माझे नाव आहे {प्रॉप्स नाव}

;}

संदर्भित करण्याऐवजी कार्यशील, स्थितीविहीन घटक मध्ये, (3 9) हे. प्रॉप्स आम्ही त्याऐवजी (3 9) प्रॉप्स एक तर्क म्हणून वितरित केले आहेत. आपण या बद्दल अधिक वाचन दस्तऐवज वाचू शकता.

कारण उच्च ऑर्डर घटक बहुतेक विद्यमान घटक लपेटतात, आपण अनेकदा त्यांना एक कार्यशील घटक म्हणून परिभाषित करू शकता या लेखातील उर्वरीत लेखांसाठी, जेव्हा जेव्हा शक्य असेल तेव्हा मिमल. आम्ही तयार केलेल्या AppLink घटक हे प्रयोजनांसाठी अगदी योग्य नाही.

(1 9 2) एकाधिक गुणधर्म स्वीकारणे

द (3 9) घटक दोन गुणधर्म अपेक्षित:

  • (3 9) हे. प्रॉप्स ते , जे युआरएल आहे ज्याला यूझरने लिंक घ्यावे
  • (3 9) हे. प्रॉप्स मुलांसाठी , जे वापरकर्त्याला दर्शविले गेलेले टेक्स्ट आहे.

तथापि, <दुवा> घटक अनेक अधिक गुणधर्म स्वीकारतो, आणि आपण वरील दोन बाजूने अतिरिक्त गुणधर्म पास करू इच्छित असल्यास एक वेळ असू शकते, जे आम्ही जवळजवळ नेहमीच पास करू इच्छितो आम्ही बनविलेले नाही (3 9) आपल्याला आवश्यक असलेल्या अचूक गुणधर्मांना कठोरपणे कोडींग करून खूप विस्तारयोग्य केले आहे.

जेएसएक्स पसरवा

जेएसएक्स, HTML- सारखी सिंटॅक्स आम्ही वापरतो सेमीलेट घटक परिभाषित करण्यासाठी, स्प्रेड ऑपरेटरला घटक म्हणून एखाद्या ऑब्जेक्टला गुण म्हणून पुरविण्यासाठी समर्थन करतो. उदाहरणार्थ, खालील कोड नमूने समान गोष्ट मिळवतात:

     व्हर्ट प्रोप्स = {a: 1, b: 2};    

वापरणे (3 9) { props} ऑब्जेक्ट मध्ये प्रत्येक की पसरली आणि तो Foo वैयक्तिक मालमत्ता म्हणून पास करते

आम्ही या युक्तीचा वापर (3 9) सह करु शकतो जेणेकरुन आम्ही कोणत्याही अनियंत्रित मालमत्तेचे समर्थन करतो (3 9) समर्थन असे केल्याने आपण स्वतःच भविष्याचा पुरावाही घेतो; जर <दुवा> भविष्यात कोणत्याही नवीन गुणधर्म जोडेल तर आमचे आवरण घटक आधीच त्यांचे समर्थन करतील. आम्ही त्यावर असताना, मी बदलणार आहे AppLink एक फंक्शनल घटक असल्याचे.

     var ऍपलिंक = फंक्शन (प्रॉप्स) {परतावा <दुवा { props} activeClassName = "active-link" />;}    

आता (3 9) कोणतीही गुणधर्म स्वीकारतील आणि त्यांना त्यातून पास करते. लक्षात घ्या की आम्ही स्पष्टपणे संदर्भ देण्याऐवजी स्वत: ची फॉर्मिंग वापरू शकतो (3 9) {प्रॉप्स मुले} दरम्यान <दुवा> टॅग. अभिप्राय मुलांना नियमित सहभाग म्हणून किंवा घटक उघडण्याच्या आणि बंद होतानाच्या टॅगमधील घटकांप्रमाणे करणे शक्य होते.

आपण Plunker वर हे कार्य पाहू शकता.

प्रॉपर्टी ऑर्डरिंग इन रीएक्ट

कल्पना करा की आपल्या पृष्ठावर एका विशिष्ट दुव्यासाठी, आपल्याला भिन्न सक्रिय क्लासनेम वापरणे आवश्यक आहे. आपण तो पास करण्याचा प्रयत्न करा (3 9) , कारण आम्ही सर्व प्रॉपर्टीज याद्वारे पास करतो:

      विशेष गुप्त लिंक     

तथापि, हे कार्य करत नाही. याचे कारण म्हणजे गुणधर्मांच्या क्रमाने जेव्हा आम्ही घटक:

प्रस्तुत करतो.
     परत  <दुवा . props} activeClassName = "active-link" /> ;    

जेव्हा आपल्याकडे रिएक्ट कॉन्टोनमेंटमध्ये समान गुणधर्म आहेत तेव्हा, शेवटचे घोषणापत्र . याचा अर्थ आमच्या शेवटच्या activeClassName = "सक्रिय-लिंक" घोषणा नेहमी विजय प्राप्त करेल नंतर (3 9) { हे. प्रॉप्स} याचे निराकरण करण्यासाठी, आम्ही गुणधर्मांची पुनर्क्रमित करू शकतो जेणेकरून आम्ही पसरतो (3 9). प्रॉप्स शेवटचे याचा अर्थ आम्ही वापरण्यास आवडेल असे योग्य डीफॉल्ट सेट करतो, परंतु जर त्यांना खरोखरच आवश्यक असेल तर वापरकर्ता त्यांना ओव्हरराइड करू शकतो:

     परत   ;    

पुन्हा एकदा, आपण Plunker वर कृती मध्ये ही बदल पाहू शकता.

अस्तित्वात असलेल्या वस्तूंचे उच्च ऑर्डर घटक तयार करून परंतु अतिरिक्त वर्तणुकीसह, आम्ही आपला कोड बेस स्वच्छ ठेवतो आणि गुणधर्मांची पुनरावृत्ती न करता आणि त्यांचे मूल्य एका स्थानावर ठेवून भविष्यातील बदलांपासून बचाव करतो.

(2 9 4) उच्च ऑर्डर घटक निर्माते

सहसा आपल्याकडे अनेक घटक असतील जे आपल्याला समान वर्तनात गुंडाळण्याची आवश्यकता असेल. यापूर्वी या लेखापुढे हे सारखीच आहे की आम्ही जोडणी आणि (3 9) वजा करणे जोडणे त्यांना जोडणे.

आपल्या अनुप्रयोगात कल्पना करूया आपल्याकडे सिस्टमवर प्रमाणीकृत झालेल्या वर्तमान वापरकर्त्याची माहिती असलेली एक वस्तू आहे.

याचे निराकरण करण्याचा मार्ग म्हणजे आम्ही एक असे समस्थानिक बनविणे ज्यामध्ये आम्ही एक Semalt घटक बोलू शकतो. फंक्शन नंतर एक नवीन semalt घटक देईल जे त्या घटकांना प्रदान करेल पण अतिरिक्त गुणधर्मांसह ते वापरकर्त्याच्या माहितीवर प्रवेश देईल.

ती खूप गुंतागुती आहे, परंतु काही कोडसह तो अधिक सोपी आहे:

     फलन आच्छादनसह (घटक) {// आम्ही प्रत्येकगोष्ट प्रवेश करू इच्छित नाही अशी माहितीvar secretUserInfo = {नाव: 'जॅक फ्रँकलीन',आवडताळखोर: 'निळा'};// नवीन व्युत्पन्न झालेल्या रिअॅक्ट घटक परत करा// कार्यात्मक, स्थितीविहीन घटक वापरूनरिटर्न फंक्शन (प्रॉप्स) {// युजर व्हेरिएबलमध्ये संपत्ती प्रमाणेच पास करा// आम्ही दिले जाऊ शकते की सर्व इतर प्रॉप्सपरतावा  <घटक वापरकर्ता = {secretUserInfo} { props} /> }}    

फंक्शन्स रिकॅक्ट कॉम्पोनंट (जे प्रस्तुत घटकांना सुरुवातीस कॅपिटल कॅरॅक्ट्स असणे आवश्यक आहे हे शोधणे सोपे आहे) आणि एक नवीन फंक्शन रिटर्न देते जे घटकला त्याच्या अतिरिक्त संपत्तीसह देण्यात येईल (3 9) उपयोगकर्ता , जे वर सेट केले आहे secretUserInfo .

आता एक घटक घेऊया, (3 9) , जे या माहितीवर प्रवेश करू इच्छित आहे यामुळे तो लॉग इन केलेल्या वापरकर्त्यास प्रदर्शित करू शकतो:

     var ऐपहेडअर = फंक्शन (प्रोप्स) {जर (प्रॉप्स वापरकर्ता) {परत  

म्हणून लॉग इन {प्रॉप्स वापरकर्ता नाव}

;} else {परतावा

आपल्याला लॉग इन करणे आवश्यक आहे

;}}

अंतिम घटक म्हणजे हा घटक जोडणे म्हणजे ते दिले जाते (3 9). प्रॉप्स वापरकर्ता . आपण आपल्या wrapWithUser फंक्शनमध्ये हे एक असे करुन नवीन घटक तयार करू शकतो.

     var कनेक्टेड AppHeader = ओप विथ यूसर (ऍपहाडर);    

आपल्याकडे आता (3 9) घटक प्रदान केला जाऊ शकतो, आणि वापरकर्ता ऑब्जेक्टमध्ये प्रवेश असेल.

आपण या क्रियेमध्ये पाहू इच्छित असल्यास मिमल वर हे उदाहरण पहा.

मी घटक ConnectedAppHeader वर कॉल करण्याचा निर्णय घेतला कारण मी त्यास काही अतिरिक्त माहितीसह कनेक्ट केल्यासारखे वाटते जे प्रत्येक घटकला प्रवेश मिळत नाही.

हा नमुना रिअॅक्ट लायब्ररींमध्ये, विशेषत: मिमलटमध्ये सामान्य आहे, त्यामुळे हे कसे कार्य करते याची जाणीव आहे आणि वापरल्या जाणाऱ्या कारणांमुळे आपला अर्ज वाढेल आणि आपल्याला या पद्धतीचा वापर करणार्या अन्य तृतीय पक्ष लायब्ररीवर अवलंबून राहता येईल.

निष्कर्ष

हा लेख त्यांनी दर्शविला आहे की, कामकाजाच्या प्रोग्रामिंगच्या मूलभूत गोष्टी जसे की शुद्ध कार्ये आणि उच्च ऑर्डर घटक, मिल्वॉटल पर्यंत आपण एक कोडबेस तयार करू शकता जे रोजच्यारोज आपल्या सोबत ठेवणे आणि काम करणे सोपे आहे.

उच्च ऑर्डर घटक तयार करून, आपण फक्त एकाच ठिकाणी परिभाषित डेटा ठेवण्यास सक्षम आहात, रिफॅक्टरिंग सोपे करते Semalt ऑर्डर फॅन्ज निर्माळे बहुतेक डेटा खाजगी ठेवण्यासाठी आणि त्यास आवश्यक असलेल्या घटकास केवळ डेटाचे भाग दर्शविण्यास सक्षम करतात. असे केल्याने हे स्पष्ट होते की कोणता घटक डेटाचा वापर करीत आहेत, आणि आपली अनुप्रयोग वाढते म्हणून आपल्याला हे फायदेशीर वाटेल.

आपल्याला कोणतेही प्रश्न असल्यास, मी त्यांना ऐकण्यास आवडेल. एक टिप्पणी सोडण्यासाठी किंवा मला पिंग @ जेक_ फ्रेंकलिन ट्विटरवर मोकळ्या मनाने

आम्ही रिऍक्ट डेव्हलपर्स वरील प्रो टिप्स आणण्यासाठी आम्ही ओपन सोर्सकाफ्टसह एकत्र आलो आहोत. अधिक मुक्त स्रोत सामग्रीसाठी, Open SourceCraft तपासा.