वर्ग बनाम कक्षा 16 में प्रतिक्रिया


84

मैंने देखा कि रिएक्ट 16 डोम के माध्यम से विशेषताओं को पारित करने की अनुमति देता है। तो, इसका मतलब है कि क्लासनेम के बजाय 'क्लास' का इस्तेमाल किया जा सकता है, है ना?

मैं सिर्फ सोच रहा हूँ कि वहाँ अभी भी वर्ग के नाम का उपयोग कर रहे हैं वर्ग के अलावा, प्रतिक्रिया के पिछले संस्करणों के साथ पीछे संगत किया जा रहा है।


className एकमात्र समर्थित विशेषता है, लेकिन v16 में "एक अलग विहित प्रतिक्रिया नाम के साथ ज्ञात विशेषताएँ" के लिए एक परिवर्तन हुआ। V15 में रिएक्ट चेतावनी देता है और उन्हें अनदेखा करता है, v16 में यह चेतावनी देता है लेकिन मूल्यों को तार में परिवर्तित करता है और उनके माध्यम से गुजरता है। प्रलेखन आपके प्रश्न का स्पष्ट उत्तर देता है: "हमेशा सभी समर्थित विशेषताओं के लिए विहित प्रतिक्रिया नामकरण का उपयोग करें"।
प्रतिक्रिया

जवाबों:


107

classजावास्क्रिप्ट में एक कीवर्ड है और JSX जावास्क्रिप्ट का एक विस्तार है। यही प्रमुख कारण है कि classNameइसके बजाय रिएक्ट का उपयोग क्यों किया जाता है class

उस संबंध में कुछ भी नहीं बदला है।

इसे थोड़ा और विस्तार देने के लिए। एक कीवर्ड का मतलब है कि एक भाषा वाक्यविन्यास में एक टोकन का एक विशेष अर्थ है। उदाहरण के लिए:

class MyClass extends React.Class {

टोकन classदर्शाता है कि अगला टोकन एक पहचानकर्ता है और निम्नानुसार एक वर्ग घोषणा है। जावास्क्रिप्ट कीवर्ड + आरक्षित शब्द देखें ।

यह तथ्य कि एक टोकन एक कीवर्ड है, जिसका अर्थ है कि हम इसका उपयोग कुछ अभिव्यक्तियों में नहीं कर सकते हैं, जैसे

// invalid in older versions on Javascript, valid in modern javascript
const props = {
  class: 'css class'
}

// valid in all versions of Javascript
const props = {
 'class': 'css class'
};

// invalid!
var class = 'css';

// valid
var clazz = 'css';

// invalid!
props.class = 'css';

// valid
props['class'] = 'css';

समस्याओं में से एक यह है कि कोई भी नहीं जान सकता है कि भविष्य में कुछ अन्य समस्या उत्पन्न नहीं होगी। प्रत्येक प्रोग्रामिंग भाषा अभी भी विकसित हो रही है और classवास्तव में कुछ नए परस्पर विरोधी सिंटैक्स में उपयोग की जा सकती है।

ऐसी कोई समस्या नहीं है className


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

1
@ डेविडए.फ्रेंच विस्तारित जवाब। कृपया अन्य उत्तर भी देखें।
सुल्तान

1
बहुत बहुत धन्यवाद सुल्तान! यह बहुत मददगार था।
डेविड ए। फ्रेंच

4
props.class = 'css' यह पूरी तरह से वैध है
daGo

31

प्रतिक्रिया टीम वास्तव में आगामी भविष्य ( स्रोत ) के class बजाय स्विच करने जा रही है :className

  • classNameclass( # 4331 , नीचे # 13525 (टिप्पणी) भी देखें)। यह अनगिनत बार प्रस्तावित किया गया है। हम पहले से ही प्रतिक्रियाशील 16 में DOM नोड के नीचे कक्षा पास करने की अनुमति दे रहे हैं। यह जो भ्रम पैदा कर रहा है वह सिंटैक्स सीमाओं के लायक नहीं है जो इसे बचाने की कोशिश कर रहा है।

स्विचिंग और सपोर्ट दोनों क्यों नहीं?

अगर हम बिना किसी चेतावनी के दोनों का समर्थन करते हैं, तो समुदाय अलग हो जाएगा, जिसका उपयोग करना है। एनपीएम पर प्रत्येक घटक जो एक क्लास प्रोप को स्वीकार करता है, उसे दोनों को अग्रेषित करना याद रखना होगा। बीच में भी एक घटक के साथ खेलने नहीं करता है और लागू केवल एक प्रोप, वर्ग खो जाए - या आप के साथ समाप्त जोखिम classऔर classNameनीचे एक दूसरे के साथ "असहमति" पर, कोई रास्ता नहीं के साथ के लिए कि संघर्ष को हल करने प्रतिक्रिया। इसलिए हम सोचते हैं कि यह यथास्थिति से भी बदतर होगा, और इससे बचना चाहते हैं।

इसलिए आपको संभलकर रहना चाहिए।
मैं तब भी उपयोग करूंगा classNameजब तक कि एपीआई को यह उम्मीद न हो।


4
अब ऐसा प्रतीत नहीं होता। देखें (का अंत): github.com/facebook/react/pull/10169
मशीनघोट

2
@machineghost # 13525 (परिवर्तन करें) 31 अगस्त, 2018 को खोला गया था। दूसरी ओर, # 10169 को 4 अगस्त, 2017 को बंद कर दिया गया था। इसलिए मुझे लगता है कि यह अभी भी प्रासंगिक है।
Maor Refaeli

3
यह प्रासंगिक नहीं है। उन्होंने महसूस classकिया कि इसका उपयोग कई अभिव्यक्तियों में नहीं किया जा सकता है क्योंकि इसका एक कीवर्ड है।
सुल्तान

16

बस पहले से दिए गए अन्य अच्छे उत्तरों के शीर्ष पर थोड़ा और प्रकाश डालना है:

आप देखेंगे कि प्रतिक्रिया पारंपरिक DOM वर्ग के बजाय क्लासनेम का उपयोग करती है। डॉक्स से, "चूंकि JSX जावास्क्रिप्ट है, वर्ग जैसे पहचानकर्ता और XML विशेषता नाम के रूप में हतोत्साहित किए जाते हैं। इसके बजाय, प्रतिक्रिया डोम घटक क्रमशः DOMName और htmlFor जैसे DOM संपत्ति के नाम की उम्मीद करते हैं।"

http://buildwithreact.com/tutorial/jsx

इसके अलावा, zpao (एक प्रतिक्रिया योगदानकर्ता / फेसबुक कर्मचारी) को उद्धृत करने के लिए

हमारे डोम घटक जेएस एपीआई का उपयोग करते हैं (ज्यादातर) इसलिए हमने जेएस प्रॉपर्टीज़ का उपयोग करने का विकल्प चुना है (नोड.क्लासनेम, नोड नहीं ।क्लास)।


8

रिएक्ट डॉक्स cannonical React attributeपारंपरिक जावास्क्रिप्ट नामकरण के बजाय नामों का उपयोग करने की सलाह देते हैं , इसलिए जब रिएक्ट डोम के माध्यम से विशेषताओं को पारित करने की अनुमति देता है, तो यह आपको चेतावनी देगा।

से डॉक्स:

Known attributes with a different canonical React name:

    <div tabindex="-1" />
    <div class="hi" />

React 15: Warns and ignores them.
React 16: Warns but converts values to strings and passes them through.
Note: always use the canonical React naming for all supported attributes.

1
हालांकि यह सिफारिश क्यों करता है?
डेविड ए। फ्रेंच

5

जून 2019 तक, क्लासनेम को कक्षा में बदलने की प्रक्रिया को रोक दिया गया है, इसे बाद में जारी रखा जा सकता है

यहाँ फेसबुक देव द्वारा पोस्ट क्यों समझा रहा हूँ

https://github.com/facebook/react/issues/13525


3

Class बनाम className in reactJS क्लास एक आरक्षित शब्द या कीवर्ड है, जो रिएक्टजेस में उतना ही है जितना कि फंक्शन जावास्क्रिप्ट में। यही कारण है कि हम वर्ग को संदर्भित करने के लिए "क्लासनेम" शब्द का उपयोग करते हैं।


2

इस पर रिएक्ट टीम द्वारा कोई वास्तविक स्पष्टीकरण नहीं है, लेकिन ईएस2015 + में इसकी शुरूआत के बाद से इसे जावास्क्रिप्ट में आरक्षित कीवर्ड "वर्ग" से विभेदित माना जाएगा।

यदि आप तत्व बनाते समय तत्व विन्यास में "वर्ग" का उपयोग करते हैं, तो भी यह कोई संकलन / प्रतिपादन त्रुटि नहीं करेगा।


2

ReactJS में, हम JSX के साथ काम कर रहे हैं न कि HTML के रूप में, जैसा कि आप सभी जानते हैं। JSX आपको क्लासनेम का उपयोग करना चाहता है क्योंकि यह एक अंतर्निहित जावास्क्रिप्ट डोम एपीआई है! जेएस में एक आरक्षित कीवर्ड होने का वर्ग प्राथमिक कारण नहीं है कि हम क्लास का उपयोग नहीं कर रहे हैं और इसके बजाय क्लासनेम का उपयोग कर रहे हैं। ऐसा इसलिए है क्योंकि हम उस DOM API की बात कर रहे हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.