React.js এ অ্যারে শিশুদের জন্য অনন্য কীগুলি বোঝা


653

আমি একটি প্রতিক্রিয়া উপাদান তৈরি করছি যা একটি JSON ডেটা উত্স গ্রহণ করে এবং একটি সারণযোগ্য টেবিল তৈরি করে।
গতিশীল ডেটা সারিগুলির প্রত্যেকটির কাছে একটি স্বতন্ত্র কী বরাদ্দ করা হয়েছে তবে আমি এর ত্রুটি পেয়েছি:

অ্যারেতে প্রতিটি সন্তানের একটি অনন্য "কী" প্রপস থাকা উচিত।
টেবিল কম্পোনেন্টের রেন্ডার পদ্ধতিটি পরীক্ষা করুন।

আমার 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 কে উপযুক্ত ডিওএম নোডের জন্য রেফারেন্সগুলি খুঁজে পেতে এবং মার্ক-আপের ভিতরে কেবলমাত্র সামগ্রী আপডেট করতে সহায়তা করবে তবে পুরো টেবিল / সারিটিকে পুনরায় রেন্ডার করবে না।
কিরিল

আপনি কি rowsঅ্যারে বা আরও বেশি পছন্দ করে একটি জেসফিডেল ভাগ করতে পারেন ? যদি আপনি আছে আত প্রয়োজন keyউপর সম্পত্তি theadএবং tbodyউপায় দ্বারা।
নীলগুন

আমি @ নীলগুনে মূল প্রশ্নটিতে সারি উপাদানটি যুক্ত করেছি।
ব্রেট ডিউউডি

3
কিছু আইটেমের আইডি না থাকলে বা একই আইডি থাকা সম্ভব?
নীলগুন

উত্তর:


620

আপনার প্রতিটি বাচ্চার পাশাপাশি বাচ্চাদের ভিতরে থাকা প্রতিটি উপাদানকে একটি কী যুক্ত করা উচিত ।

এইভাবে প্রতিক্রিয়া সর্বনিম্ন 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);

নীচে @Cris দ্বারা পোস্ট করা উত্তরটি এই উত্তরটির চেয়ে অনেক বেশি বিশদে চলে গেছে। দয়া করে https://stackoverflow.com/a/43892905/2325522 এ একবার দেখুন

পুনর্মিলন কীগুলির গুরুত্ব সম্পর্কে ডকুমেন্টেশন প্রতিক্রিয়া: কী


5
আমি ঠিক একই ত্রুটি চালাচ্ছি। আড্ডার পরে কি এর সমাধান হয়েছিল? যদি তা হয় তবে দয়া করে এই প্রশ্নের একটি আপডেট পোস্ট করতে পারেন।
ডেকে

1
উত্তর কাজ করে, ডেকে। কেবলমাত্র নিশ্চিত হয়ে নিন যে keyপ্রপসের মানটি প্রতিটি আইটেমের জন্য স্বতন্ত্র এবং আপনি keyপ্রোপটি সেই উপাদানটিতে রেখেছেন যা অ্যারের সীমানার নিকটে থাকে। উদাহরণস্বরূপ, প্রতিক্রিয়া নেটিভে, আমি প্রথমে উপাদানটিকে keyপ্রোপ দেওয়ার চেষ্টা করছিলাম <Text>। তবে আমাকে এটি <View>উপাদানটিতে রাখতে হয়েছিল যা এর পিতামাতা <Text>। যদি অ্যারে == [(দেখুন> পাঠ্য), (দেখুন> পাঠ্য)] আপনার এটি দেখার দরকার। পাঠ্য নয়।
scaryguy

237
প্রতিক্রিয়ার পক্ষে স্বতন্ত্র কী কী তৈরি করা কেন এত শক্ত?
লুভিক

13
@ড্যাওয়ারলুসিক, এখানে একটি আলোচনা রয়েছে: github.com/facebook/react/issues/1342#issuecomment-39230939
কোডো

5
উপরের সাথে লিঙ্কিত ইস্যুতে তৈরি করা একটি নোটটিতে এটি বেশ সরকারী শব্দ : কীগুলি একটি স্বেচ্ছাসেবীর পুনরুত্থানকারী থেকে বেরিয়ে আসা আইটেমগুলির জন্য কীগুলির একটি সেট এবং অটো-প্রজন্মের সদস্যের পরিচয় সম্পর্কে সম্ভবত প্রতিক্রিয়াটির মধ্যে পারফরম্যান্সের প্রভাব থাকতে পারে গ্রন্থাগার।
সমীরা

522

অ্যারেগুলিতে পুনরাবৃত্তি করার সময় সাবধানতা অবলম্বন করুন !!

এটি একটি সাধারণ ভ্রান্ত ধারণা যে অ্যারেতে উপাদানটির সূচক ব্যবহার করা সম্ভবত আপনি যে ত্রুটিটির সাথে পরিচিত তা দমন করার একটি গ্রহণযোগ্য উপায়:

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

তবে অনেক ক্ষেত্রে তা হয় না! এটি নিদর্শন বিরোধী যা কিছু পরিস্থিতিতে অযাচিত আচরণের দিকে পরিচালিত করতে পারে


keyপ্রোপ বোঝা

প্রতিক্রিয়াটি keyকম্পোনেন্ট-টু-ডম উপাদান উপাদান বোঝার জন্য প্রপ ব্যবহার করে , যা পরে পুনর্মিলন প্রক্রিয়াটির জন্য ব্যবহৃত হয় । এটি তাই যে খুব গুরুত্বপূর্ণ সর্বদা অনন্য থাকে , অন্যথায় একটি ভাল সুযোগ রয়েছে প্রতিক্রিয়াটি উপাদানগুলির সাথে মিশে যায় এবং ভুলটিকে রূপান্তরিত করে। সর্বোত্তম পারফরম্যান্স বজায় রাখার জন্য এই কীগুলি সমস্ত রি-রেন্ডারগুলিতে স্থির থাকে তাও গুরুত্বপূর্ণ ।

বলা হচ্ছে, এক না সবসময় , উপরোক্ত আবেদন করতে হবে প্রদত্ত এটা হয় পরিচিত যে অ্যারের সম্পূর্ণরূপে স্ট্যাটিক হয়। যাইহোক, সেরা অভ্যাস প্রয়োগ যখনই সম্ভব উত্সাহিত করা হয়।

একটি প্রতিক্রিয়া বিকাশকারী ভিতরে বলেছেন এই গিটহাব ইস্যুতে বলেছেন :

  • কীটি প্রকৃতপক্ষে পারফরম্যান্সের বিষয়ে নয়, এটি পরিচয় সম্পর্কে আরও বেশি (যা ফলশ্রুতিতে আরও ভাল পারফরম্যান্সের দিকে নিয়ে যায়)। এলোমেলোভাবে নির্ধারিত এবং মান পরিবর্তন করা পরিচয় নয়
  • আপনার ডেটা কীভাবে মডেল করা হয়েছে তা না জেনে আমরা বাস্তবে কীগুলি [স্বয়ংক্রিয়ভাবে] সরবরাহ করতে পারি না। আমি আপনাকে আইডি না থাকলে সম্ভবত কিছু ধরণের হ্যাশিং ফাংশন ব্যবহার করার পরামর্শ দেব
  • অ্যারে ব্যবহার করার সময় আমাদের কাছে ইতিমধ্যে অভ্যন্তরীণ কী রয়েছে তবে সেগুলি অ্যারের সূচক। আপনি যখন একটি নতুন উপাদান sertোকান, সেই কীগুলি ভুল।

সংক্ষেপে, ক key হওয়া উচিত:


keyপ্রপ ব্যবহার করা

উপরের ব্যাখ্যা অনুসারে, সাবধানে নিম্নলিখিত নমুনাগুলি অধ্যয়ন করুন এবং সম্ভব হলে, প্রস্তাবিত পদ্ধতির প্রয়োগের চেষ্টা করুন।


খারাপ (সম্ভাব্য)

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

প্রতিক্রিয়াটিতে কোনও অ্যারের উপরে পুনরাবৃত্তি করার সময় এটি সবচেয়ে ত্রুটিপূর্ণভাবে দেখা যায় seen এই পদ্ধতিটি প্রযুক্তিগতভাবে "ভুল" নয় , আপনি কী করছেন তা যদি আপনি না জানেন তবে এটি ঠিক ... "বিপজ্জনক" । আপনি যদি কোনও স্ট্যাটিক অ্যারের মাধ্যমে পুনরাবৃত্তি করেন তবে এটি একটি সম্পূর্ণ বৈধ পন্থা (যেমন আপনার নেভিগেশন মেনুতে লিঙ্কগুলির একটি অ্যারে)। তবে, আপনি যদি আইটেমগুলি যোগ, অপসারণ, পুনরায় অর্ডারিং বা ফিল্টারিং করছেন তবে আপনার সতর্কতা অবলম্বন করা উচিত। অফিসিয়াল ডকুমেন্টেশনে এই বিস্তারিত ব্যাখ্যাটি একবার দেখুন ।

এই স্নিপেটে আমরা একটি স্ট্যাটাসহীন অ্যারে ব্যবহার করছি এবং আমরা এটিকে স্ট্যাক হিসাবে ব্যবহার করতে সীমাবদ্ধ করছি না। এটি একটি অনিরাপদ পদ্ধতি (আপনি কেন তা দেখতে পাবেন)। দ্রষ্টব্যগুলির শুরুতে আমরা কীভাবে আইটেমগুলি যুক্ত করব তা লক্ষ্য করুন (মূলত আনশিফ্ট), প্রতিটিটির জন্য মান<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>

এটিও একটি ভাল পদ্ধতির। যদি আপনার ডেটাসেটে কোনও ডেটা না থাকে যা স্বতন্ত্রতার গ্যারান্টি দেয় ( উদাহরণস্বরূপ স্বেচ্ছাসেবী সংখ্যার একটি অ্যারে ), একটি মূল সংঘর্ষের সম্ভাবনা রয়েছে। এই জাতীয় ক্ষেত্রে, ডেটাসেটে প্রতিটি আইটেমটি পুনরুক্ত করার আগে ম্যানুয়ালি এক অনন্য শনাক্তকারী তৈরি করা ভাল best সাধারণত উপাদানটি মাউন্ট করার সময় বা যখন ডেটাসেটটি গ্রহণ করা হয় ( যেমন propsকোনও এসিঙ্ক এপিআই কল থেকে বা তা থেকে ), কেবল একবার এটি করার জন্য , এবং প্রতিটি সময় উপাদান পুনরায় রেন্ডার করে না। ইতিমধ্যে বেশ কয়েকটি গ্রন্থাগার রয়েছে যা আপনাকে এই জাতীয় কী সরবরাহ করতে পারে। এখানে একটি উদাহরণ: প্রতিক্রিয়া-কী-সূচক


1
ইন কর্মকর্তা ডক্স , তারা ব্যবহার toString()পরিবর্তে স্ট্রিং নম্বর হিসাবে রেখে রূপান্তর করবে। এটি কি মনে রাখা গুরুত্বপূর্ণ?
স্কুব

1
@ এসকিউব, না, আপনি keyপাশাপাশি পূর্ণসংখ্যার ব্যবহার করতে পারেন । তারা কেন এটি রূপান্তর করছে তা নিশ্চিত নয়।
ক্রিস

1
আমার ধারণা আপনি পূর্ণসংখ্যা ব্যবহার করতে পারেন তবে কি আপনার উচিত ? তাদের দস্তাবেজ অনুসারে তারা জানিয়েছে "... কী বাছাই করার সর্বোত্তম উপায় হ'ল স্ট্রিং যা অনন্যভাবে চিহ্নিত করে ..." (জোর খনি)
স্কুব

2
@ এসকিউব, হ্যাঁ এটি পুরোপুরি গ্রহণযোগ্য। উপরের উদাহরণগুলিতে বর্ণিত হিসাবে, আপনি পুনরাবৃত্ত অ্যারের আইটেমের সূচি ব্যবহার করতে পারেন (এবং এটি একটি পূর্ণসংখ্যা)। এমনকি দস্তাবেজগুলিও বলে: "শেষ অবলম্বন হিসাবে, আপনি অ্যারের মধ্যে আইটেমের সূচি একটি কী হিসাবে পাস করতে পারেন"keyযাইহোক যা ঘটে তা হ'ল সর্বদা স্ট্রিং হয়ে যাই হোক না কেন।
ক্রিস

3
@ ফার্ম কম্যান্ড 2, কীগুলি প্রতিক্রিয়াশীল উপাদানগুলিতে প্রয়োগ করা হয় এবং ভাইবোনদের মধ্যে অনন্য হওয়া দরকার । এটি উপরে বর্ণিত হয়েছে। অন্য কথায়, অ্যারেতে অনন্য
ক্রিস

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

সতর্কতা: একটি অ্যারে বা পুনরুক্তি করা প্রতিটি শিশুর একটি অনন্য "কী" প্রপস থাকা উচিত।

এটি অ্যারে আইটেমগুলির জন্য একটি সতর্কতা যা আমরা পুনরাবৃত্তি করতে যাচ্ছি একটি অনন্য সাদৃশ্য প্রয়োজন।

প্রতিক্রিয়া পুনরুক্তি উপাদান হিসাবে অ্যারে হিসাবে পুনরাবৃত্তি হ্যান্ডলগুলি।

এটি সমাধানের আরও ভাল উপায় হ'ল অ্যারে আইটেমগুলির উপরে সূচক সরবরাহ করা যা আপনি পুনরাবৃত্তি করতে চলেছেন for উদাহরণস্বরূপ:

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
আইটেমগুলি কোনওভাবে পুনরায় সাজানো থাকলে এই পদ্ধতিটি সম্ভাব্য বিপজ্জনক। তবে যদি তারা স্থির থাকে তবে এটি ঠিক আছে।
ক্রিস

@ ক্রিস আমি সম্পূর্ণরূপে আপনার সাথে একমত কারণ এই ক্ষেত্রে সূচকটি নকল হতে পারে। কী জন্য গতিশীল মান ব্যবহার করা ভাল।
শশাঙ্ক মালভিয়া

@ ক্রিস আমি আপনার মন্তব্যের সাথেও একমত পরিবর্তে আমাদের সূচকের পরিবর্তে গতিশীল মানগুলি ব্যবহার করা উচিত কারণ নকল থাকতে পারে। এটি সহজ করার জন্য আমি এটি করেছি। আপনার অবদানের জন্য বিটিডব্লিউ ধন্যবাদ (উত্সাহিত)
শশাঙ্ক মালভিয়া

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} />

কিছু মূল্য নির্ধারিত !!! প্রথমে এটি পরীক্ষা করে দেখুন। আপনি ঘন্টা বাঁচাতে পারেন।


1

প্রতিক্রিয়ায় অনন্য কী সংজ্ঞায়নের সর্বোত্তম সমাধান: মানচিত্রের ভিতরে আপনি নাম পোস্টটি আরম্ভ করেছিলেন তারপরে কী দ্বারা ডিফল্ট কী = {post.id} বা আমার কোডে আপনি দেখতে পাবেন আমি নামের আইটেমটি সংজ্ঞায়িত করব তারপরে আমি কী = {আইটেম.আইডি দ্বারা কী সংজ্ঞায়িত করব key }:

<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তালিকার প্রতিটি আইটেম স্বতন্ত্রভাবে সনাক্ত করা প্রয়োজন is যদি সেই তালিকার কোনও উপাদানটির প্রতিক্রিয়াগুলিতে পরিবর্তন হয় তবে তা বলতে দিনVirtual DOM প্রতিক্রিয়াগুলির তবে কোন উপাদানটি পরিবর্তিত হয়েছে এবং ডোমটিতে এটি কোথায় পরিবর্তন করা দরকার তা প্রতিক্রিয়া জানাতে হবে যাতে ব্রাউজার ডিওএম প্রতিক্রিয়া ভার্চুয়াল ডিওমের সাথে সিঙ্ক হয়।

সমাধান হিসাবে কেবল keyপ্রতিটি liট্যাগের একটি বৈশিষ্ট্য উপস্থাপন করুন । এটি keyপ্রতিটি উপাদানগুলির জন্য একটি অনন্য মান হওয়া উচিত।


এটি সম্পূর্ণ সঠিক নয়। প্রোপ যুক্ত করলে রেন্ডারিং দ্রুত হবে নাkey । আপনি যদি একটি সরবরাহ না করেন, প্রতিক্রিয়া স্বয়ংক্রিয়ভাবে একটি বরাদ্দ করবে (পুনরাবৃত্তির বর্তমান সূচি)।
ক্রিস

@ ক্রিস এই ক্ষেত্রে কেন এটি একটি সতর্কতা উত্থাপন করে?
প্রাইম

কারণ কী সরবরাহ না করে, প্রতিক্রিয়া জানায় না কীভাবে আপনার ডেটা মডেল করা হয়। অ্যারে পরিবর্তন করা হলে এটি অনাকাঙ্ক্ষিত ফলাফলের দিকে নিয়ে যেতে পারে।
ক্রিস

অ্যারে পরিবর্তনের ক্ষেত্রে ক্রিস @ ক্রিস, যদি আমরা কী সরবরাহ না করি তবে সেই অনুযায়ী সূচকগুলি ঠিক করে দেবে। যাইহোক আমি ভেবেছিলাম প্রতিক্রিয়া থেকে অতিরিক্ত ওভারহেড অপসারণ রেন্ডারিং প্রক্রিয়াটিতে কিছুটা প্রভাব ফেলবে।
প্রধানমন্ত্রী

আবার, প্রতিক্রিয়া মূলত করবে key={i}। সুতরাং এটি আপনার অ্যারেতে থাকা ডেটার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি তালিকা আছে ["Volvo", "Tesla"], তাহলে সম্ভবত ভলভো হয় শনাক্ত কী দ্বারা 0এবং টেসলা 1- কারণ, যাতে তারা লুপ প্রদর্শিত হবে। এখন আপনি অ্যারেটিকে পুনরায় অর্ডার করলে কীগুলি অদলবদল হয়। প্রতিক্রিয়াটির জন্য, যেহেতু "অবজেক্ট" 0এখনও শীর্ষে রয়েছে, তাই পরিবর্তনের পরিবর্তে এটি "পুনর্নবীকরণ" হিসাবে পরিবর্তিত হবে। এখানে সঠিক কীগুলি দরকার হয়, 1তারপরে , ক্রম অনুযায়ী 0। আপনি সর্বদা মিড রানটাইমটিকে পুনরায় অর্ডার করেন না, তবে আপনি যখন করেন, এটি একটি ঝুঁকিপূর্ণ।
ক্রিস

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)অনন্য কী বা অনন্যতর ইউউইড বা অন্য কোনও উপায়ে সেট করতে একটি ব্যবহার করতে পারেন যা অনন্য আইডি উত্পন্ন করবে তবে অ্যারের সূচকটি অনন্য আইডি হিসাবে নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.