2020 में रिएक्ट फॉर्म बनाना

हाय, हैब्र। मैं आपको क्रिस्टोफर सेलबक द्वारा "2020 में प्रतिक्रिया में रूप बनाना" लेख का अनुवाद प्रस्तुत करता हूं

छवि


इनपुट फ़ील्ड पाठ क्षेत्रों। रेडियो बटन और चेकबॉक्स। यहाँ बातचीत के कुछ मुख्य बिंदु हैं जिन्हें हम, डेवलपर्स के रूप में, अपने उपयोगकर्ताओं के साथ रखते हैं। हम उन्हें साइट पर रखते हैं, उपयोगकर्ता उन्हें भरते हैं और यदि हम भाग्यशाली हैं, तो पूर्ण किए गए फॉर्म बिना सत्यापन त्रुटियों के हमारे पास आते हैं।

फॉर्म प्रोसेसिंग बड़ी संख्या में वेब एप्लिकेशन का एक अभिन्न हिस्सा है, और यह उन चीजों में से एक है जो रिएक्ट सबसे अच्छा करता है। आपको फॉर्म बनाने और प्रोसेस करने की बहुत स्वतंत्रता है। लेकिन क्या ऐसा करने का एक बेहतर तरीका है?

कृपया ध्यान दें कि इन सभी उदाहरणों में हम एक ईमेल और पासवर्ड फ़ील्ड के साथ एक लॉगिन फ़ॉर्म बनाएंगे, लेकिन इन विधियों का उपयोग अधिकांश प्रकार के रूपों के साथ किया जा सकता है।

अच्छे फॉर्म के नियमों को याद रखें


यद्यपि यह सीधे चर्चा के अधीन विषय से संबंधित नहीं है, मैं यह सुनिश्चित करना चाहता हूं कि आप अपने रूपों को सभी के लिए समझने योग्य नहीं भूल गए हैं। अपने इनपुट फ़ील्ड में टैग जोड़ें, उन मामलों के लिए सही aria विशेषताएँ सेट करें जहां इनपुट अमान्य है, और अपनी सामग्री को शब्दार्थ रूप से सही ढंग से संरचना करें। यह उपयोगकर्ताओं और डेवलपर्स दोनों के लिए आपके फ़ॉर्म का उपयोग करना आसान बनाता है।

राज्य हुक का उपयोग करते हुए प्रसंस्करण प्रपत्र


आरंभ करने के लिए, आइए देखें कि मैं आमतौर पर फॉर्म स्टेट के साथ कैसे काम करता हूं। मैं सभी क्षेत्रों को अलग राज्य तत्वों के रूप में सहेजता हूं और उन सभी को अलग-अलग अपडेट करता हूं, जो कुछ इस तरह दिखता है:

function LoginForm() {
  const [email, setEmail] = React.useState('');
  const [password, setPassword] = React.useState('');

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    api.login(email, password);
  };
  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor='email'>Email</label>
        <input type='email' id='email' value={email} onChange={(e) => setEmail(e.target.value)} />
      </div>
      <div>
        <label htmlFor='password'>Password</label>
        <input type='password' id='password' value={password} onChange={(e) => setPassword(e.target.value)} />
      </div>
    </form>
  );
}

सबसे पहले, मैं राज्य के दो अलग-अलग हिस्से बनाता हूं - उपयोगकर्ता नाम और पासवर्ड। इन दो चर को इस क्षेत्र के मान को निर्धारित करते हुए, संबंधित इनपुट फ़ील्ड में स्थानांतरित कर दिया जाता है। जब भी किसी क्षेत्र में कुछ बदलता है, तो हम राज्य मूल्य को अद्यतन करने के लिए सुनिश्चित होते हैं, जिससे हमारे आवेदन का एक नया स्वरूप बनता है।

यह फ़ॉर्म प्रसंस्करण ज्यादातर मामलों में ठीक काम करता है और सरल और प्रयोग करने और समझने में आसान है। हालांकि, हर बार इस तरह के निर्माण को लिखना थकाऊ होता है।

एक कस्टम हुक बनाना


आइए थोड़ा सा रिफ्लेक्ट करते हैं और अपना स्वयं का हुक बनाते हैं, जिससे हमारे कोड में थोड़ा सुधार होगा:

const useFormField = (initialValue: string = '') => {
  const [value, setValue] = React.useState(initialValue);
  const onChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => setValue(e.target.value), []);
  return { value, onChange };
};

export function LoginForm() {
  const emailField = useFormField();
  const passwordField = useFormField();

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    api.login(emailField.value, passwordField.value);
  };
  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor='email'>Email</label>
        <input type='email' id='email' {...emailField} />
      </div>
      <div>
        <label htmlFor='password'>Password</label>
        <input type='password' id='password' {...passwordField} />
      </div>
    </form>
  );
}

हम एक कस्टम उपयोग करते हैंFormField हुक जो हमारे लिए एक ऑनचेंज इवेंट हैंडलर बनाता है, और फॉर्म स्टेट में मूल्य भी संग्रहीत करता है। इस मामले में, हम सभी प्रकार के फ़ील्ड के साथ अपने हुक का उपयोग कर सकते हैं।

बड़ी संख्या में खेतों का प्रसंस्करण


इस दृष्टिकोण का नुकसान यह है कि यह आपके फॉर्म के बढ़ने के रूप में अच्छी तरह से स्केल नहीं करता है। लॉगिन जैसे छोटे रूपों के लिए, यह शायद अच्छा है, लेकिन जब आप उपयोगकर्ता प्रोफ़ाइल फ़ॉर्म बनाते हैं तो आपको बहुत सी जानकारी का अनुरोध करने की आवश्यकता हो सकती है! क्या हमें अपना हुक बार-बार बुलाना चाहिए?

जब भी मैं एक समान स्थिति का सामना करता हूं, तो मैं एक कस्टम हुक लिखना चाहता हूं जो मेरे सभी रूपों को एक बड़े टुकड़े में संग्रहीत करता है। यह इस तरह लग सकता है:

export function LoginForm() {
  const { formFields, createChangeHandler } = useFormFields({
    email: '',
    password: '',
  });

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    api.login(formFields.email, formFields.password);
  };
  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor='email'>Email</label>
        <input type='email' id='email' value={formFields.email} onChange={createChangeHandler('email')} />
      </div>
      <div>
        <label htmlFor='password'>Password</label>
        <input type='password' id='password' value={formFields.password} onChange={createChangeHandler('password')} />
      </div>
    </form>
  );
}

UseFormFields हुक के साथ, हम अपने घटक में जटिलता को जोड़े बिना खेतों को जोड़ना जारी रख सकते हैं। हम सभी फॉर्म स्टेट्स को एक ही स्थान पर एक्सेस कर सकते हैं, और हमारा कोड साफ-सुथरा और संक्षिप्त दिखता है। बेशक, आपको शायद कुछ स्थितियों के लिए सेटस्टेट का उपयोग करने की आवश्यकता है, लेकिन अधिकांश रूपों के लिए उपरोक्त तकनीक ठीक है।

वैकल्पिक दृष्टिकोण


इस प्रकार, राज्य हैंडलिंग ठीक काम करता है, और ज्यादातर मामलों में यह रिएक्ट में पसंदीदा दृष्टिकोण है। लेकिन क्या आप जानते हैं कि एक और तरीका है? यह पता चला है कि डिफ़ॉल्ट रूप से ब्राउज़र प्रपत्र की आंतरिक स्थिति को संसाधित करता है, और हम इसका उपयोग अपने कोड को सरल बनाने के लिए कर सकते हैं!

यहाँ एक ही फ़ॉर्म है, लेकिन ब्राउज़र को फ़ॉर्म की स्थिति को संभालने की अनुमति देता है:

export function LoginForm() {
  const handleSubmit = (e: React.FormEvent) => {
	e.preventDefault();
	const formData = new FormData(e.target as HTMLFormElement);
	api.login(formData.get('email'), formData.get('password'));
  };
  return (
	<form onSubmit={handleSubmit}>
  	<div>
    	<label htmlFor="email">Email</label>
    	<input
      	type="email"
      	id="email"
      	name="email"
    	/>
  	</div>
  	<div>
    	<label htmlFor="password">Password</label>
    	<input
      	type="password"
      	id="password"
      	name="password"
    	/>
  	</div>
  	<button>Log in</button>
	</form>
  );
}

देखो कितना आसान है! एक भी हुक का उपयोग नहीं किया गया था, कोई प्रारंभिक मूल्य सेटिंग नहीं है, कोई ऑनचेंज हैंडलर नहीं है। सबसे अच्छी बात यह है कि कोड अभी भी पहले की तरह काम करता है - लेकिन कैसे?

आपने देखा होगा कि हम हैंडलसुमिट फंक्शन में कुछ अलग कर रहे हैं। हम FormData नामक अंतर्निहित ब्राउज़र API का उपयोग करते हैं। FormData हमारे इनपुट फ़ील्ड से मान प्राप्त करने के लिए एक सुविधाजनक (और अच्छी तरह से समर्थित) तरीका है!

हमें सबमिट ईवेंट के लक्ष्य विशेषता के माध्यम से DOM में फ़ॉर्म का लिंक मिलता है और फॉर्मडाटा वर्ग का एक नया उदाहरण बनाता है। अब हम formData.get ("इनपुट फ़ील्ड नाम") पर कॉल करके उनके नाम विशेषता से सभी फ़ील्ड प्राप्त कर सकते हैं।

इस तरह, आपको फॉर्म की स्थिति को स्पष्ट रूप से संभालने की आवश्यकता नहीं है। यदि आपको डिफ़ॉल्ट मानों की आवश्यकता है (उदाहरण के लिए, यदि आप किसी डेटाबेस या स्थानीय संग्रहण से प्रारंभिक फ़ील्ड मान बदलते हैं), तो प्रतिक्रिया आपको इसके लिए एक सुविधाजनक defaultValue विकल्प प्रदान करती है।

प्रत्येक दृष्टिकोण का उपयोग कब करें


चूंकि प्रपत्र अधिकांश वेब अनुप्रयोगों का एक अभिन्न अंग हैं, इसलिए यह जानना महत्वपूर्ण है कि उन्हें कैसे संभालना है। और प्रतिक्रिया आपको ऐसा करने के कई तरीके प्रदान करती है।
उन सरल रूपों के लिए जिन्हें कठोर सत्यापन की आवश्यकता नहीं है (या जो HTML5 फॉर्म सत्यापन नियंत्रणों पर भरोसा कर सकते हैं ), मेरा सुझाव है कि आप केवल अंतर्निहित स्थिति से निपटने के लिए उपयोग करें जो DOM हमें डिफ़ॉल्ट रूप से प्रदान करता है। काफी कुछ चीजें हैं जो आप नहीं कर सकते हैं (उदाहरण के लिए, प्रोग्रामेटिक रूप से इनपुट मान या रीयल-टाइम चेक बदलें), लेकिन सरलतम मामलों में (उदाहरण के लिए, खोज फ़ील्ड या लॉगिन फ़ील्ड, जैसा कि ऊपर बताया गया है), आप संभवतः उपयुक्त पाएंगे। ब्राउज़र एपीआई का उपयोग करके हमारा वैकल्पिक दृष्टिकोण।

जब आप कोई कस्टम चेक करते हैं या आपको सबमिट करने से पहले कुछ फ़ॉर्म डेटा तक पहुंच की आवश्यकता होती है, तो आपको नियंत्रित घटकों का उपयोग करके राज्य को स्पष्ट रूप से संसाधित करने की आवश्यकता होती है। आप अपने कोड को थोड़ा सरल बनाने के लिए नियमित उपयोग कर सकते हैं।

यह ध्यान देने योग्य है कि रिएक्ट डेवलपर्स ज्यादातर मामलों में नियंत्रित घटकों (स्पष्ट रूप से घटक की स्थिति को संभालने) के उपयोग की सलाह देते हैं - क्योंकि यह दृष्टिकोण आपको भविष्य में अधिक लचीलापन देता है। मेरी राय में, डेवलपर्स अक्सर लचीलेपन के लिए सादगी का त्याग करते हैं, जिनकी उन्हें अक्सर आवश्यकता नहीं होती है।

आप जिस भी दृष्टिकोण का उपयोग करने का निर्णय लेते हैं, प्रतिक्रिया स्वरूप प्रसंस्करण उतना आसान नहीं है जितना कि आज है। आप ब्राउज़र को सरल रूपों को संभालने दे सकते हैं, जबकि उसी समय स्थिति की आवश्यकता होने पर रूपों की स्थिति को स्पष्ट रूप से संसाधित कर सकते हैं। मुझे उम्मीद है कि उपरोक्त विधियां उपयोगी होंगी और आपके कोड में लाइनों की संख्या को कम करके समस्या को हल करने में आपकी मदद करेगी।

All Articles