State: एक कौम्पोनॅन्ट की मेमोरी
कोई भी इंटरेक्शन होने की वजह स कौम्पोनॅन्ट को अक्सर स्क्रीन पर क्या दिख रहा है उसको बदलना होता है। फॉर्म में टाइप करने पर इनपुट फील्ड अपडेट होने चाहिए, इमेज करौसेल के “next” को क्लिक करने पर करौसेल की इमेज बदलनी चाहिए, “buy” पर क्लिक करने पर एक प्रोडक्ट शॉपिंग कार्ट में ऐड होना चाहिए। कौम्पोनॅन्ट को चीजों को “याद रखना” चाहिए: इनपुट की अभी की वैल्यू, अभी की इमेज, शॉपिंग कार्ट। React में, इस प्रकार की कौम्पोनॅन्ट-स्पेसिफिक मेमोरी को State कहा जाता है।
You will learn
- state वेरिएबल को
useState
Hook के साथ कैसे ऐड करें useState
Hook कोनसे वैल्यूज की पेअर को रिटर्न करता है- एक से अधिक स्टेट वेरिएबल कैसे ऐड करें
- state को लोकल क्यों कहा जाता है
जब एक सामान्य वेरिएबल पर्याप्त नहीं है
यहाँ एक कौम्पोनॅन्ट है जो एक स्कल्पचर इमेज प्रस्तुत करता है। “Next” बटन पर क्लिक करने से इंडेक्स
को 1
, फिर 2
, और इसी तरह बदलकर अगली स्कल्पचर इमेज दिखाई देनी चाहिए। हालांकि, यह काम नहीं करेगा (आप इसे आज़मा सकते हैं!):
handleClick()
event handler एक लोकल वैरिएबल, इंडेक्स
को अपडेट कर रहा है। लेकिन दो चीजें उस बदलाव को दिखने से रोकती हैं
- लोकल वैरिएबल रेंडरर्स के बीच बने नहीं रहते हैं जब React इस कौम्पोनॅन्ट को दूसरी बार रेंडर करता है, यह इसे नए सिरे से रेंडर करता है—यह लोकल वैरिएबल में किसी भी परिवर्तन पर विचार नहीं करता है।
- लोकल वैरिएबल में बदलाव करने से रेंडर ट्रिगर नहीं होंगे. React को एहसास नहीं होता है कि उसे नए डेटा के साथ कौम्पोनॅन्ट को फिर से रेंडर करने की आवश्यकता है।
किसी कौम्पोनॅन्ट को नए डेटा से अपडेट करने के लिए, दो चीज़ें होनी चाहिए:
- रेंडरर्स के बीच डेटा को बनाए रखें।
- कौम्पोनॅन्ट को नए डेटा (री-रेंडरिंग) के साथ रेंडर करने के लिए React को ट्रिगर करे।
यह दोनों चीज़े useState
हुक की सहायता से की जा सकती है::
- एक state वैरिएबल रेंडरर्स के बीच डेटा को बनाए रखे।
- एक state setter फंक्शन वैरिएबल अपडेट करने के लिए और कौम्पोनॅन्ट को फिर से रेंडर करने के लिए React को ट्रिगर करें।
एक state वैरिएबल ऐड करना
एक state वैरिएबल ऐड करने के लिए, फाइल से सबसे ऊपर useState को React से इम्पोर्ट करें:
import { useState } from 'react';
फिर, इस लाइन को बदलें:
let index = 0;
इस लाइन के साथ
const [index, setIndex] = useState(0);
index
एक state वैरिएबल है और setIndex
एक सेटर फ़ंक्शन है।
यहाँ पर
[
और]
सिंटेक्स को ऐरे डेस्ट्रक्टरिंग कहा जाता हे और यह आपको array की वैल्यू पढ़ने देता है।useState
द्वारा रिटर्न किये गए array हमेशा दो आइटम्स होते है।
इस तरह वे handleClick()
में एक साथ काम करते हैं :
function handleClick() {
setIndex(index + 1);
}
अब “Next” बटन पर क्लिक करने से करंट स्कल्पचर बदल जाती है:
अपने पहले हुक से मिलें
React में, useState
, या ”use
,” से शुरू होने वाला कोई अन्य फ़ंक्शन को हुक कहा जाता है।
हुक विशेष फ़ंक्शन हैं जो केवल React के रेंडरिंग (जिसके बारे में और डिटेल में हम अगले पेज पर जानेंगे) के दौरान उपलब्ध हैं। वे आपको विभिन्न React फीचर्स में “हुक इन” करने देते हैं।
State उन फीचर्स में से एक है, लेकिन आप दूसरे हुक से बाद में मिलेंगे।
useState
का विश्लेषण
जब आप useState
को कॉल करते हैं, आप React को बता रहे हैं कि आप चाहते हैं कि यह कौम्पोनॅन्ट कुछ याद रखे:
const [index, setIndex] = useState(0);
इस मामले में, आप चाहते हैं कि React index
को याद रखे।
कन्वेंशनल तरीके से आप इस पेअर को ऐसे लिखेंगे :
const [something, setSomething]
। वैसे तो आप जो चाहे वो नाम इसे दे सकते हे, लेकिन पारंपरिक तरीके से लिखने पर, आपका कोड बाकि लोगो को भी आसानी से समझ आता है।
useStateकेवल एक ही आर्गुमेंट लेता है और वह है **इनिशियल वैल्यू** आपके state वेरिएबल का। इस उदाहरण में,
indexकी इनिशियल वैल्यू है
0क्युकी
useState(0)` लिखा गया है।
जब भी आपका कौम्पोनॅन्ट रेंडर होता है, useState
आपको एक array देता है जिसमें दो वैल्यूज होते हैं:
- state वेरिएबल (
index
) आपके द्वारा स्टोर की गयी वैल्यू के साथ। - state सेटर फंक्शन (
setIndex
) जो state वेरिएबल की वैल्यू बदल सकता है और कौम्पोनॅन्ट को फिर से रेंडर करने के लिए React को ट्रिगर कर सकता है।
देखिये यह कैसे होता है :
const [index, setIndex] = useState(0);
- आपका कौम्पोनॅन्ट पहली बार रेंडर होता है। क्युकी आपने
useState
को0
वैल्यूindex
की इनिशियल वैल्यू के तौर पर दी थीं, वह[0, setIndex]
रिटर्न करेगा। React0
को नई state वैल्यू के तौर पर याद रखेगा। - आप state को अपडेट करें। जब कोई यूजर, बटन पर क्लिक करता है, यह
setIndex(index + 1)
को कॉल करता है।index
अभी0
है, तोsetIndex(1)
हो जायेगा। यह React को याद रखने के लिए कहता है किindex
अब1
है और एक और रेंडर ट्रिगर करता है। - आपके कौम्पोनॅन्ट का दूसरा रेंडर. React अभी भी देखता है
useState(0)
, लेकिन क्योंकि React को याद है की आपनेindex
को1
सेट किया था , वह[1, setIndex]
रिटर्न करता है। - और इसी तरह आगे भी होता रहता है!
एक कौम्पोनॅन्ट को कई state वेरिएबल देना
आपके पास एक कौम्पोनॅन्ट में जितने चाहें उतने प्रकार के state वेरिएबल हो सकते हैं। इस कौम्पोनॅन्ट में दो state वेरिएबल हैं, एक number index
और एक boolean showMore
जिसकी वैल्यू तब बदलती है जब आप “Show details” को क्लिक करते है :
यदि state वेरिएबल्स रिलेटेड नहीं है, तो कई state वेरिएबल होना एक अच्छा विचार है, जैसे इस उदाहरण में index
और showMore
। लेकिन अगर आप पाते हैं कि आप अक्सर दो state वेरिएबल एक साथ बदलते हैं तो उन्हें एक में करना बेहतर हो सकता है। उदाहरण के लिए, यदि आपके पास कई फ़ील्ड्स के साथ एक फॉर्म है, तो हर फील्ड के लिए अलग state वेरिएबल रखने से बेहतर होगा की आप एक state वेरिएबल रखे जो एक ऑब्जेक्ट है। State स्ट्रक्चर चुनना में इसके बारे में और टिप्स है।
Deep Dive
आपने देखा होगा कि useState
कॉल को स्टेट वेरिएबल के बारे में कोई जानकारी नहीं मिलती है। कोई “आइडेंटिफायर” नहीं है जो useState
को पास किया जाता है, तो उसे कैसे पता चलता है कि किस state वेरिएबल को वापस करना है? क्या यह आपके फ़ंक्शन को पार्स करने जैसे किसी जादू पर निर्भर करता है? इसका जवाब है नहीं।
इसके बजाय, उनके संक्षिप्त सिंटैक्स को सक्षम करने के लिए, Hooks ** एक ही कौम्पोनॅन्ट के प्रत्येक रेंडर पर स्थिर कॉल ऑर्डर पर भरोसा करते है।** अगर आप ऊपर दिए गए नियम का पालन करते हैं (“हुक को केवल टॉप लेवल पर करें”), तो यह अक्सर अच्छा काम करता है, Hooks को हमेशा उसी क्रम में बुलाया जाएगा। और, एक linter plugin बाकी की ज़्यादातर गलतियाँ पकड़ता है।
आंतरिक रूप से, React प्रत्येक कौम्पोनॅन्ट के लिए state एक पेअर का एक array रखता है। यह अभी के पेअर के इंडेक्स को भी बनाए रखता है, जो रेंडर करने से पहले 0
पर सेट है। हर बार जब आप useState
कॉल करते हैं , React आपको अगला स्टेट पेअर देता है और इंडेक्स को इन्क्रीमेंट करता है। आप इसके के बारे में अधिक React Hooks: Not Magic, Just Arrays में पढ़ सकते हैं।
यह उदाहरण React का उपयोग नहीं करता है, लेकिन यह आपको समझाता है कि useState
आंतरिक रूप से कैसे काम करता है:
React का उपयोग करने के लिए आपको इसे समझने की आवश्यकता नहीं है, लेकिन आपको यह उपयोगी साबित हो सकता है।
State अलग और प्राइवेट है
State स्क्रीन पर दिखने वाले कॉम्पोनेन्ट के इंस्टैंस के लिए लोकल है। दूसरे शब्दों में, यदि आप एक ही कौम्पोनॅन्ट को दो बार रेंडर करते हैं, तो हर कॉपी में पूरी तरह से अलग state होगा! उनमें से एक को बदलने से दूसरे पर कोई प्रभाव नहीं पड़ेगा।
इस उदाहरण में, पहले के Gallery
कौम्पोनॅन्ट को इसके लॉजिक में बिना किसी बदलाव के दो बार रेंडर किया गया है। प्रत्येक Gallery के अंदर बटन क्लिक करने का प्रयास करें। ध्यान दें कि उनका state एक दूसरे से अलग है:
आप स्टेट वेरिएबल्स को अपने मॉड्यूल के शीर्ष पर घोषित कर सकते हैं, यही बात स्टेट वेरिएबल को आम वेरिएबल से विपरीत करती है। State किसी विशेष फ़ंक्शन कॉल या कोड में स्थान से बंधा नहीं है, किंतु यह स्क्रीन पर स्पेसिफिक स्थान पर “लोकल” है। आपने दो <Gallery />
कौम्पोनॅन्ट को रेंडर किया, इसलिए उनका state अलग से स्टोर किया जाता है।
यह भी देखें कि कैसे Page
कौम्पोनॅन्ट Gallery
के state के बारे में कुछ भी नहीं “जानता”, उसे तोह यह भी नहीं पता की Gallery
कौम्पोनॅन्ट के पास कोई state है। props के विपरीत, state इसे घोषित करने वाले कौम्पोनॅन्ट के लिए पूरी तरह से प्राइवेट है। पैरेंट कौम्पोनॅन्ट state को बदल नहीं सकता है। इससे आप किसी भी कौम्पोनॅन्ट में state ऐड कर सकते हैं या बाकी कौम्पोनॅन्ट को प्रभावित किए बिना उसे हटा सकते हैं।
यदि आप चाहें कि दोनों galleries अपने state सिंक में रखें तो? React में इसे करने का सही तरीका यह है कि चाइल्ड कौम्पोनॅन्ट से state निकालें और इसे दोनों के निकटतम शेयर्ड पैरेंट कौम्पोनॅन्ट में ऐड करें। अगले कुछ पेजेज़ एक कौम्पोनॅन्ट के state को ओर्गनइजे करने पर ध्यान केंद्रित करेंगे, लेकिन हम इस विषय पर कई कौम्पोनॅन्ट के बीच state शेयर करना में वापस आएंगे।
Recap
- जब किसी कौम्पोनॅन्ट को रेंडरर्स के बीच कुछ जानकारी “याद” रखने की आवश्यकता हो, तो state वेरिएबल का उपयोग करें।
- स्टेट वेरिएबल को
useState
हुक कॉलकर कर डिक्लेअर किया जाता है। - हुक विशेष फंक्शन हैं जो
use
से शुरू होते हैं। वे आपको state जैसी React के फीचर्स को “हुक इन” करने देते हैं। - हुक आपको इम्पोर्ट्स की याद दिला सकते हैं: उन्हें बिना किसी कंडीशन के बुलाया जाना चाहिए। हुक्स को बुलाना, जिसमें
useState
शामिल है, केवल एक कौम्पोनॅन्ट या किसी अन्य हुक के शीर्ष स्तर पर करना सही है। useState
हुक वैल्यूज की एक जोड़ी देता है: अभी का state और इसे अपडेट करने के लिए फंक्शन।- आपके पास एक से अधिक state वेरिएबल हो सकते हैं। आंतरिक रूप से, React उनके क्रम से उनको मैच करता है।
- State कौम्पोनॅन्ट के लिए प्राइवेट है। यदि आप इसे दो स्थानों पर रेंडर करते हैं, तो हर कॉपी को अपना state मिलता है।
Challenge 1 of 4: Gallery कम्पलीट करें
जब आप अंतिम स्कल्पचर पर “Next” बटन दबाते हैं, तो कोड क्रैश हो जाता है। इस क्रैश को रोकने के लिए लॉजिक को ठीक करें। आप ईवेंट हैंडलर में एक्स्ट्रा लॉजिक ऐड कर के ऐसा कर सकते हैं या एक्शन पॉसिबल न होने पर बटन को डिसएबल करके।
इस क्रैश को ठीक करने के बाद, एक “Previous” बटन ऐड करें जो पिछला स्कल्पचर दिखाता है। यह पहले स्कल्पचर पर क्रैश नहीं होना चाहिए।