React.js में सरणी बच्चों के लिए अद्वितीय कुंजियों को समझना


655

मैं एक रिएक्ट घटक का निर्माण कर रहा हूं जो JSON डेटा स्रोत को स्वीकार करता है और एक छांटने योग्य तालिका बनाता है।
डायनेमिक डेटा पंक्तियों में से प्रत्येक के पास एक विशिष्ट कुंजी है, लेकिन मुझे अभी भी एक त्रुटि मिल रही है:

एक सरणी में प्रत्येक बच्चे के पास एक अद्वितीय "कुंजी" प्रोप होना चाहिए।
TableComponent की रेंडर विधि की जाँच करें।

मेरा TableComponentरेंडर मेथड रिटर्न:

<table>
  <thead key="thead">
    <TableHeader columns={columnNames}/>
  </thead>
  <tbody key="tbody">
    { rows }
  </tbody>
</table>

TableHeaderघटक एक ही पंक्ति है और यह भी यह करने के लिए आवंटित एक अद्वितीय कुंजी है।

प्रत्येक rowमें rowsएक अद्वितीय कुंजी के साथ एक घटक से बनाया गया है:

<TableRowItem key={item.id} data={item} columns={columnNames}/>

और TableRowItemइस तरह दिखता है:

var TableRowItem = React.createClass({
  render: function() {

    var td = function() {
        return this.props.columns.map(function(c) {
          return <td key={this.props.data[c]}>{this.props.data[c]}</td>;
        }, this);
      }.bind(this);

    return (
      <tr>{ td(this.props.item) }</tr>
    )
  }
});

अद्वितीय कुंजी प्रोप त्रुटि का कारण क्या है?


7
जेएस सरणी में आपकी पंक्तियों में अद्वितीय keyसंपत्ति होनी चाहिए । यह ReactJS को उपयुक्त DOM नोड्स के संदर्भ खोजने और मार्क-अप के अंदर केवल सामग्री अपडेट करने में मदद करेगा, लेकिन पूरे टेबल / पंक्ति को फिर से प्रस्तुत नहीं करेगा।
किरील

तुम भी rowsसरणी या अधिक अधिमानतः एक jsfiddle साझा कर सकते हैं ? तुम keyपर theadऔर tbodyजिस तरह से एक संपत्ति की जरूरत नहीं है ।
निलगुन

मैंने मूल प्रश्न @nilgun में पंक्ति घटक जोड़ा।
ब्रेट डेवुडी

3
क्या यह संभव है कि कुछ वस्तुओं में एक आईडी नहीं है या एक ही आईडी नहीं है?
निलगुन

जवाबों:


621

आपको प्रत्येक बच्चे के साथ-साथ बच्चों के अंदर प्रत्येक तत्व के लिए एक कुंजी जोड़ना चाहिए ।

इस तरह से React न्यूनतम DOM परिवर्तन को संभाल सकता है।

आपके कोड में, प्रत्येक <TableRowItem key={item.id} data={item} columns={columnNames}/>कुंजी के बिना कुछ बच्चों को उनके अंदर प्रस्तुत करने का प्रयास कर रहा है।

चेक इस उदाहरण

डिव के अंदर तत्व key={i}से हटाने की कोशिश करें <b></b>(और कंसोल की जांच करें)।

नमूने में, अगर हम के लिए एक महत्वपूर्ण नहीं देते <b>तत्व और हम अद्यतन करना चाहते केवलobject.city , प्रतिक्रिया करने के लिए की जरूरत बनाम सिर्फ तत्व पूरी पंक्ति फिर से प्रस्तुत करना।

यहाँ कोड है:

var data = [{name:'Jhon', age:28, city:'HO'},
            {name:'Onhj', age:82, city:'HN'},
            {name:'Nohj', age:41, city:'IT'}
           ];

var Hello = React.createClass({

    render: function() {

      var _data = this.props.info;
      console.log(_data);
      return(
        <div>
            {_data.map(function(object, i){
               return <div className={"row"} key={i}> 
                          {[ object.name ,
                             // remove the key
                             <b className="fosfo" key={i}> {object.city} </b> , 
                             object.age
                          ]}
                      </div>; 
             })}
        </div>
       );
    }
});

React.render(<Hello info={data} />, document.body);

नीचे दिए गए @Chris द्वारा पोस्ट किया गया उत्तर इस उत्तर की तुलना में बहुत अधिक विवरण में है। कृपया https://stackoverflow.com/a/43892905/2325522 पर एक नज़र डालें

सामंजस्य में कुंजी के महत्व पर प्रतिक्रिया प्रलेखन: कुंजी


5
मैं उसी त्रुटि में भाग रहा हूं। क्या यह चैट के बाद हल किया गया था? यदि हां, तो क्या आप इस प्रश्न के लिए एक अद्यतन पोस्ट कर सकते हैं।
डेके

1
जवाब काम करता है, Deke। बस यह सुनिश्चित करें कि keyप्रत्येक आइटम के लिए प्रोप का मूल्य अद्वितीय है और आप keyउस घटक को प्रोप डाल रहे हैं जो सरणी सीमाओं के सबसे करीब है। उदाहरण के लिए, रिएक्ट नेटिव में, पहले मैं कंपोनेंट keyको प्रोप डालने की कोशिश कर रहा था <Text>। हालाँकि मुझे इसे <View>घटक के लिए रखना था जो कि माता-पिता है <Text>। अगर एरे == [(देखें> पाठ), (देखें> पाठ)] आपको इसे देखने की आवश्यकता है। पाठ नहीं।
डरावना

238
अद्वितीय कुंजी उत्पन्न करने के लिए रिएक्ट के लिए इतना कठिन क्यों है?
लूसिक

13
@DavorLucic, यहाँ एक चर्चा है: github.com/facebook/react/issues/1342#issuecomment-39230939
koddo

5
उपरोक्त लिंक चैट में बने नोट पर यह आधिकारिक रूप से बहुत अधिक शब्द है: कुंजी एक सेट के एक सदस्य की पहचान के बारे में है और एक मनमाने ढंग से चलने वाले से बाहर निकलने वाली वस्तुओं के लिए कुंजी की ऑटो-जनरेशन की प्रतिक्रिया के भीतर संभवतः प्रदर्शन निहितार्थ हैं। पुस्तकालय।
वही 22

522

सरणियों पर चलने के दौरान सावधान रहें !!

यह एक आम गलत धारणा है कि एरे में तत्व के सूचकांक का उपयोग करना उस त्रुटि को दबाने का एक स्वीकार्य तरीका है जिससे आप संभवतः परिचित हैं:

Each child in an array should have a unique "key" prop.

हालांकि, कई मामलों में यह नहीं है! यह एंटी-पैटर्न है जो कुछ स्थितियों में अवांछित व्यवहार को जन्म दे सकता है ।


keyप्रोप को समझना

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

कहा जा रहा है, किसी को हमेशा उपरोक्त को लागू करने की आवश्यकता नहीं है, बशर्ते कि यह ज्ञात हो कि सरणी पूरी तरह से स्थिर है। हालांकि, जब भी संभव हो, सर्वोत्तम प्रथाओं को लागू करने को प्रोत्साहित किया जाता है।

इस GitHub मुद्दे में एक रिएक्टर डेवलपर ने कहा :

  • कुंजी वास्तव में प्रदर्शन के बारे में नहीं है, यह पहचान के बारे में अधिक है (जो बदले में बेहतर प्रदर्शन की ओर जाता है)। बेतरतीब ढंग से सौंपा और बदलते मूल्यों की पहचान नहीं है
  • हम यह जानकर कि आपका डेटा कैसे बनाया जाता है, हम वास्तविक रूप से [स्वचालित रूप से] कुंजी प्रदान नहीं कर सकते। मेरा सुझाव है कि यदि आपके पास आईडी नहीं है तो आप किसी प्रकार के हैशिंग फ़ंक्शन का उपयोग कर सकते हैं
  • जब हम सरणियों का उपयोग करते हैं तो हमारे पास पहले से ही आंतरिक कुंजी होती है, लेकिन वे सरणी में सूचकांक होते हैं। जब आप एक नया तत्व सम्मिलित करते हैं, तो वे कुंजी गलत हैं।

संक्षेप में, एक keyहोना चाहिए:

  • अद्वितीय - एक कुंजी एक भाई घटक के समान नहीं हो सकती है ।
  • स्टेटिक - एक कुंजी को रेंडरर्स के बीच कभी नहीं बदलना चाहिए।


keyप्रोप का उपयोग करना

ऊपर दिए गए स्पष्टीकरण के अनुसार, निम्नलिखित नमूनों का ध्यानपूर्वक अध्ययन करें और जब संभव हो, अनुशंसित दृष्टिकोण को लागू करने का प्रयास करें।


खराब (संभावित रूप से)

<tbody>
    {rows.map((row, i) => {
        return <ObjectRow key={i} />;
    })}
</tbody>

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

इस स्निपेट में हम एक गैर-स्थैतिक सरणी का उपयोग कर रहे हैं और हम इसे स्टैक के रूप में उपयोग करने के लिए खुद को प्रतिबंधित नहीं कर रहे हैं। यह एक असुरक्षित दृष्टिकोण है (आप देखेंगे कि क्यों)। ध्यान दें कि कैसे हम सरणी (मूल रूप से अनशिफ्ट) की शुरुआत में आइटम जोड़ते हैं, प्रत्येक के लिए मान <input>जगह पर रहता है। क्यों? क्योंकि keyप्रत्येक वस्तु की विशिष्ट पहचान नहीं है।

दूसरे शब्दों में, पहली बार Item 1में key={0}। जब हम दूसरा आइटम जोड़ते हैं, तो शीर्ष आइटम बन जाता है Item 2, उसके बाद Item 1दूसरा आइटम बन जाता है । हालांकि, अब Item 1है key={1}और न key={0}अब। इसके बजाय, Item 2अब है key={0}!!

जैसे, रिएक्ट को लगता है कि <input>तत्व नहीं बदले हैं, क्योंकि Itemकुंजी 0हमेशा शीर्ष पर है!

तो यह दृष्टिकोण कभी-कभी केवल बुरा क्यों होता है ?

यह दृष्टिकोण केवल जोखिम भरा है यदि सरणी को किसी तरह से फ़िल्टर किया जाता है, पुनर्व्यवस्थित किया जाता है, या आइटम जोड़े / हटाए जाते हैं। यदि यह हमेशा स्थिर होता है, तो यह उपयोग करने के लिए पूरी तरह से सुरक्षित है। उदाहरण के लिए, इस तरह के साथ एक नेविगेशन मेनू ["Home", "Products", "Contact us"]को सुरक्षित रूप से पुनरावृत्त किया जा सकता है क्योंकि आप शायद कभी नए लिंक नहीं जोड़ेंगे या उन्हें पुनर्व्यवस्थित नहीं करेंगे।

संक्षेप में, यहाँ जब आप सुरक्षित रूप से सूचकांक का उपयोग कर सकते हैंkey :

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

इसके बजाय, हमने ऊपर के स्निपेट में, जोड़े गए आइटम को सरणी के अंत में धकेल दिया , प्रत्येक मौजूदा आइटम के लिए क्रम हमेशा सही होगा।


बहुत बुरा

<tbody>
    {rows.map((row) => {
        return <ObjectRow key={Math.random()} />;
    })}
</tbody>

हालांकि यह दृष्टिकोण संभवतः चाबियों की विशिष्टता की गारंटी देगा, यह हमेशा सूची में प्रत्येक आइटम को फिर से प्रस्तुत करने के लिए प्रतिक्रिया देगा , भले ही यह आवश्यक न हो। यह एक बहुत बुरा समाधान है क्योंकि यह प्रदर्शन को बहुत प्रभावित करता है। यह उल्लेख नहीं करने के लिए कि कोई भी उस घटना में एक महत्वपूर्ण टकराव की संभावना को बाहर नहीं कर सकता है जो एक Math.random()ही संख्या को दो बार पैदा करता है।

अस्थिर कुंजी (जैसे उनके द्वारा उत्पादित Math.random()) कई घटक उदाहरणों और डोम नोड्स को अनावश्यक रूप से पुनः निर्मित करने का कारण बनेगी, जिससे बच्चे के घटकों में प्रदर्शन में गिरावट और खोई हुई स्थिति हो सकती है।


बहुत अच्छा

<tbody>
    {rows.map((row) => {
        return <ObjectRow key={row.uniqueId} />;
    })}
</tbody>

यह यकीनन सबसे अच्छा तरीका है क्योंकि यह ऐसी संपत्ति का उपयोग करता है जो डेटासेट में प्रत्येक आइटम के लिए अद्वितीय है। उदाहरण के लिए, यदि rowsकिसी डेटाबेस से प्राप्त डेटा शामिल है , तो कोई तालिका की प्राथमिक कुंजी का उपयोग कर सकता है ( जो आमतौर पर एक ऑटो-वृद्धि संख्या है )।

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


अच्छा

componentWillMount() {
  let rows = this.props.rows.map(item => { 
    return {uid: SomeLibrary.generateUniqueID(), value: item};
  });
}

...

<tbody>
    {rows.map((row) => {
        return <ObjectRow key={row.uid} />;
    })}
</tbody>

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


1
में सरकारी डॉक्स , वे का उपयोग toString()करने के बजाय स्ट्रिंग संख्या के रूप में छोड़ने में बदलने के लिए। क्या यह याद रखना महत्वपूर्ण है?
skube

1
@skube, नहीं, आप पूर्णांकों का भी उपयोग कर सकते हैं key। निश्चित नहीं है कि वे इसे क्यों परिवर्तित कर रहे हैं।
क्रिस

1
मुझे लगता है कि आप पूर्णांक का उपयोग कर सकते हैं लेकिन क्या आपको करना चाहिए ? अपने डॉक्स के अनुसार वे "... एक कुंजी चुनने का सबसे अच्छा तरीका एक स्ट्रिंग का उपयोग करना है जो विशिष्ट रूप से पहचान करता है ..." (जोर देकर मेरा)
skube

2
@skube, हाँ यह पूरी तरह से स्वीकार्य है। जैसा कि ऊपर दिए गए उदाहरणों में कहा गया है, आप आइटम के अनुक्रमित पुनरावृत्त सरणी (और यह एक पूर्णांक) का उपयोग कर सकते हैं। यहां तक ​​कि डॉक्स स्थिति: "अंतिम उपाय के रूप में, आप कुंजी में आइटम के सूचकांक को कुंजी के रूप में पारित कर सकते हैं" । हालांकि क्या होता है कि keyहमेशा एक स्ट्रिंग वैसे भी समाप्त होता है।
क्रिस

3
@ farmcommand2, कुंजियों को प्रतिक्रिया घटकों पर लागू किया जाता है, और भाई - बहनों के बीच अद्वितीय होने की आवश्यकता होती है । यह ऊपर बताया गया है। दूसरे शब्दों में, सरणी में अद्वितीय
क्रिस

8

यह किसी की मदद कर सकता है या नहीं, लेकिन यह एक त्वरित संदर्भ हो सकता है। यह भी ऊपर प्रस्तुत सभी उत्तरों के समान है।

मेरे पास बहुत सारे स्थान हैं जो नीचे दी गई संरचना का उपयोग करके सूची उत्पन्न करते हैं:

return (
    {myList.map(item => (
       <>
          <div class="some class"> 
             {item.someProperty} 
              ....
          </div>
       </>
     )}
 )

थोड़ी परीक्षण और त्रुटि (और कुछ कुंठाओं) के बाद, एक महत्वपूर्ण संपत्ति को सबसे बाहरी ब्लॉक में जोड़कर इसे हल किया। यह भी ध्यान दें कि <> टैग अब टैग के साथ बदल दिया गया है।

return (

    {myList.map((item, index) => (
       <div key={index}>
          <div class="some class"> 
             {item.someProperty} 
              ....
          </div>
       </div>
     )}
 )

निश्चित रूप से, मैं उपरोक्त उदाहरण में कुंजी मान को पॉप्युलेट करने के लिए पुनरावृत्त सूचकांक (इंडेक्स) का उपयोग कर रहा हूं। आदर्श रूप से, आप कुछ ऐसा उपयोग करेंगे जो सूची आइटम के लिए अद्वितीय है।


यह बेहद मददगार था, धन्यवाद! मुझे यह भी महसूस नहीं हुआ कि मुझे इसे सबसे बाहरी परत में रखना है
चार्ल्स स्मिथ

6

चेतावनी: एक सरणी या पुनरावृत्त में प्रत्येक बच्चे के पास एक अद्वितीय "कुंजी" प्रोप होना चाहिए।

यह एरे आइटम के लिए एक चेतावनी है जिस पर हम पुनरावृत्ति करने जा रहे हैं, उसे एक अद्वितीय समानता की आवश्यकता होगी।

प्रतिक्रिया सरणियों के रूप में पुनरावृत्ति घटक प्रतिपादन को संभालती है।

इसे हल करने के लिए बेहतर तरीका यह है कि आप जिस आइटम पर जा रहे हैं उस पर इंडेक्स प्रदान करें। उदाहरण के लिए:

class UsersState extends Component
    {
        state = {
            users: [
                {name:"shashank", age:20},
                {name:"vardan", age:30},
                {name:"somya", age:40}
            ]
        }
    render()
        {
            return(
                    <div>
                        {
                            this.state.users.map((user, index)=>{
                                return <UserState key={index} age={user.age}>{user.name}</UserState>
                            })
                        }
                    </div>
                )
        }

सूचकांक रिएक्ट बिल्ट-इन प्रॉप्स है।


2
यह दृष्टिकोण संभावित रूप से खतरनाक है यदि आइटम किसी भी तरह से फिर से व्यवस्थित हो। लेकिन अगर वे स्थिर रहते हैं तो यह ठीक है।
क्रिस

@chris मैं पूरी तरह से आपके साथ सहमत हूँ क्योंकि इस मामले में सूचकांक को डुप्लिकेट किया जा सकता है। कुंजी के लिए गतिशील मूल्यों का उपयोग करने के लिए बेहतर है।
शशांक मालवीय

@ क्रिस मैं भी आपकी टिप्पणी से सहमत हूं। हमें गतिशील मानों का उपयोग करना चाहिए बल्कि तब अनुक्रमणिका क्योंकि वहाँ डुप्लिकेट हो सकते हैं। इसे सरल बनाने के लिए मैंने ऐसा किया। Btw आपके योगदान (उत्थान) के लिए धन्यवाद
शशांक मालवीय

6

बस अपने घटकों के लिए अद्वितीय कुंजी जोड़ें

data.map((marker)=>{
    return(
        <YourComponents 
            key={data.id}     // <----- unique key
        />
    );
})

6

जाँच करें: कुंजी = अपराजित !!!

आपको चेतावनी संदेश भी मिला:

Each child in a list should have a unique "key" prop.

यदि आपका कोड सही है, लेकिन यदि है

<ObjectRow key={someValue} />

someValue अपरिभाषित है !!! कृपया इसे पहले जांचें। आप घंटे बचा सकते हैं।


1

प्रतिक्रिया में अद्वितीय कुंजी को परिभाषित करने का सबसे अच्छा समाधान: मानचित्र के अंदर आपने नाम पोस्ट को प्रारंभ किया, फिर कुंजी = {पोस्ट.ड} द्वारा परिभाषित किया गया या मेरे कोड में आप देखते हैं कि मैं नाम आइटम को परिभाषित करता हूं तो मैं कुंजी = {आइटम.आईडी द्वारा कुंजी को परिभाषित करता हूं। }:

<div className="container">
                {posts.map(item =>(

                    <div className="card border-primary mb-3" key={item.id}>
                        <div className="card-header">{item.name}</div>
                    <div className="card-body" >
                <h4 className="card-title">{item.username}</h4>
                <p className="card-text">{item.email}</p>
                    </div>
                  </div>
                ))}
            </div>


0

यह एक चेतावनी है, लेकिन इसे संबोधित करने से प्रतिक्रियाएं बहुत तेजी से प्रतिपादन होंगी ,

ऐसा इसलिए है क्योंकि Reactसूची में प्रत्येक आइटम को विशिष्ट रूप से पहचानने की आवश्यकता है। आइए कहते हैं कि अगर उस सूची के एक तत्व की स्थिति प्रतिक्रिया में बदल जाती है Virtual DOMतो रिएक्ट को यह पता लगाने की जरूरत है कि कौन सा तत्व बदल गया है और कहां डोम में इसे बदलने की जरूरत है ताकि ब्राउज़र डोम रिएक्ट्स वर्चुअल डोम के साथ सिंक हो जाएगा।

एक समाधान के रूप में बस keyप्रत्येक liटैग के लिए एक विशेषता परिचय । यह keyप्रत्येक तत्व के लिए एक अद्वितीय मूल्य होना चाहिए।


यह पूरी तरह सही नहीं है। यदि आप प्रस्ताव जोड़ते हैं, तो रेंडरिंग तेज़ नहीं होगा key। यदि आप एक प्रदान नहीं करते हैं, तो रिएक्ट एक स्वचालित रूप से (पुनरावृत्ति का वर्तमान सूचकांक) असाइन करेगा।
क्रिस

@ उस मामले में क्रिस क्यों यह एक चेतावनी बढ़ा?
प्राइम

एक कुंजी प्रदान नहीं करने के कारण, React को पता नहीं है कि आपका डेटा कैसे मॉडल किया गया है। यदि सरणी संशोधित है, तो यह अवांछित परिणाम हो सकता है।
क्रिस

@ सरणी संशोधन के उस मामले में, यदि हम चाबियाँ प्रदान नहीं करते हैं, तो उसके अनुसार सूचक को सही करेगा। वैसे भी मुझे लगा कि रिएक्ट से अतिरिक्त ओवरहेड हटाने से रेंडरिंग प्रक्रिया पर कुछ असर पड़ेगा।
प्राइम

फिर से, प्रतिक्रिया मूल रूप से करेंगे key={i}। तो यह आपके सरणी में मौजूद डेटा पर निर्भर करता है। उदाहरण के लिए, यदि आपके पास सूची है ["Volvo", "Tesla"], तो जाहिर है कि वोल्वो को कुंजी और टेस्ला के साथ पहचाना जाता है - क्योंकि यही वह क्रम है जो वे लूप में दिखाई देंगे। अब यदि आप उस सरणी को फिर से व्यवस्थित करते हैं जो कुंजियों की अदला-बदली होती है। रिएक्ट के लिए, चूंकि "ऑब्जेक्ट" अभी भी शीर्ष पर है, इसलिए यह इस बदलाव को "नाम" के रूप में व्याख्या करेगा, बजाय एक रीऑर्डर के। यहाँ सही कुंजी क्रम में हो सकता है,, की आवश्यकता होगी तो । आप हमेशा मध्य रनटाइम को फिर से नहीं बनाते हैं, लेकिन जब आप ऐसा करते हैं, तो यह एक जोखिम है। 01010
क्रिस

0
var TableRowItem = React.createClass({
  render: function() {

    var td = function() {
        return this.props.columns.map(function(c, i) {
          return <td key={i}>{this.props.data[c]}</td>;
        }, this);
      }.bind(this);

    return (
      <tr>{ td(this.props.item) }</tr>
    )
  }
});

इससे समस्या दूर हो जाएगी।


0

<></>सरणी में कुछ वस्तुओं के लिए वापस किए जाने के कारण मैं इस त्रुटि संदेश में चल रहा था जब बदले में nullवापस करने की आवश्यकता थी।


-1

मैंने इस तरह प्रत्येक कुंजी के लिए गाइड का उपयोग करके इसे तय किया: गाइड बनाना:

guid() {
    return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' +
        this.s4() + '-' + this.s4() + this.s4() + this.s4();
}

s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
        .toString(16)
        .substring(1);
}

और फिर मार्करों को यह मान प्रदान करना:

{this.state.markers.map(marker => (
              <MapView.Marker
                  key={this.guid()}
                  coordinate={marker.coordinates}
                  title={marker.title}
              />
          ))}

2
कुंजी के रूप में एक यादृच्छिक संख्या जोड़ना हानिकारक है! यह परिवर्तनों का पता लगाने के लिए प्रतिक्रिया को रोक देगा, जो कुंजी का उद्देश्य है।
पाइजेंटागी

-1

मूल रूप से आपको सरणी के सूचकांक को एक अद्वितीय कुंजी के रूप में उपयोग नहीं करना चाहिए। बल्कि आप setTimeout(() => Date.now(),0)यूनीक की या यूनीकिड यूआईडी या किसी अन्य तरीके को सेट करने के लिए एक का उपयोग कर सकते हैं जो यूनिक आईडी उत्पन्न करेगा लेकिन यूनिक आईडी के रूप में एरे का इंडेक्स नहीं।

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