বাংলা

রিঅ্যাক্টের রিকনসিলিয়েশন প্রক্রিয়া আয়ত্ত করুন। জানুন কীভাবে 'key' প্রপ সঠিকভাবে ব্যবহার করে লিস্ট রেন্ডারিং অপ্টিমাইজ করা যায়, বাগ প্রতিরোধ করা যায় এবং অ্যাপ্লিকেশনের পারফর্ম্যান্স বাড়ানো যায়। বিশ্বব্যাপী ডেভেলপারদের জন্য একটি গাইড।

পারফর্ম্যান্স আনলক করা: লিস্ট অপ্টিমাইজেশনের জন্য রিঅ্যাক্ট রিকনসিলিয়েশন কী (Key)-এর গভীর বিশ্লেষণ

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

আপনি সম্ভবত অগণিতবার data.map(item => <div>{item.name}</div>) এর মতো কোড লিখেছেন। এটি সহজ, প্রায় তুচ্ছ মনে হয়। তবুও, এই সরলতার নিচে একটি গুরুত্বপূর্ণ পারফর্ম্যান্স বিবেচনার বিষয় লুকিয়ে আছে, যা উপেক্ষা করলে অ্যাপ্লিকেশন ধীরগতির হতে পারে এবং বিভ্রান্তিকর বাগের সৃষ্টি হতে পারে। এর সমাধান? একটি ছোট কিন্তু শক্তিশালী প্রপ: key

এই বিস্তারিত গাইডটি আপনাকে রিঅ্যাক্টের রিকনসিলিয়েশন প্রক্রিয়া এবং লিস্ট রেন্ডারিংয়ে কী (key)-এর অপরিহার্য ভূমিকা সম্পর্কে গভীর ধারণা দেবে। আমরা কেবল 'কী' তা নয়, বরং 'কেন' তাও অন্বেষণ করব—কেন কী অপরিহার্য, কীভাবে সেগুলি সঠিকভাবে বেছে নিতে হয়, এবং সেগুলি ভুলভাবে ব্যবহারের গুরুতর পরিণতি কী হতে পারে। এই গাইডের শেষে, আপনি আরও পারফর্ম্যান্ট, স্থিতিশীল এবং পেশাদার রিঅ্যাক্ট অ্যাপ্লিকেশন লেখার জ্ঞান অর্জন করবেন।

অধ্যায় ১: রিঅ্যাক্টের রিকনসিলিয়েশন এবং ভার্চুয়াল ডোম বোঝা

কী-এর গুরুত্ব বোঝার আগে, আমাদের প্রথমে সেই foundational মেকানিজমটি বুঝতে হবে যা রিঅ্যাক্টকে দ্রুত করে তোলে: রিকনসিলিয়েশন, যা ভার্চুয়াল ডোম (VDOM) দ্বারা চালিত।

ভার্চুয়াল ডোম কী?

ব্রাউজারের ডকুমেন্ট অবজেক্ট মডেল (DOM)-এর সাথে সরাসরি কাজ করা কম্পিউটেশনালি ব্যয়বহুল। প্রতিবার যখন আপনি DOM-এ কিছু পরিবর্তন করেন—যেমন একটি নোড যোগ করা, টেক্সট আপডেট করা, বা একটি স্টাইল পরিবর্তন করা—ব্রাউজারকে অনেক কাজ করতে হয়। এটিকে পুরো পৃষ্ঠার জন্য স্টাইল এবং লেআউট পুনরায় গণনা করতে হতে পারে, যা রিফ্লো (reflow) এবং রিপেইন্ট (repaint) নামে পরিচিত। একটি জটিল, ডেটা-চালিত অ্যাপ্লিকেশনে, ঘন ঘন সরাসরি DOM ম্যানিপুলেশন দ্রুত পারফর্ম্যান্সকে মন্থর করে দিতে পারে।

রিঅ্যাক্ট এই সমস্যা সমাধানের জন্য একটি অ্যাবস্ট্রাকশন লেয়ার নিয়ে আসে: ভার্চুয়াল ডোম। VDOM হলো আসল DOM-এর একটি হালকা, ইন-মেমরি উপস্থাপনা। এটিকে আপনার UI-এর একটি ব্লুপ্রিন্ট হিসাবে ভাবুন। যখন আপনি রিঅ্যাক্টকে UI আপডেট করতে বলেন (উদাহরণস্বরূপ, একটি কম্পোনেন্টের স্টেট পরিবর্তন করে), রিঅ্যাক্ট অবিলম্বে আসল DOM স্পর্শ করে না। পরিবর্তে, এটি নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে:

  1. আপডেট করা স্টেটকে প্রতিনিধিত্বকারী একটি নতুন VDOM ট্রি তৈরি করা হয়।
  2. এই নতুন VDOM ট্রিটিকে পূর্ববর্তী VDOM ট্রি-এর সাথে তুলনা করা হয়। এই তুলনা প্রক্রিয়াটিকে "ডিফিং" (diffing) বলা হয়।
  3. রিঅ্যাক্ট পুরানো VDOM-কে নতুনটিতে রূপান্তরিত করার জন্য প্রয়োজনীয় ন্যূনতম পরিবর্তনগুলি খুঁজে বের করে।
  4. এই ন্যূনতম পরিবর্তনগুলিকে একত্রিত করে একটি দক্ষ অপারেশনে আসল DOM-এ প্রয়োগ করা হয়।

এই প্রক্রিয়া, যা রিকনসিলিয়েশন নামে পরিচিত, রিঅ্যাক্টকে এত পারফর্ম্যান্ট করে তোলে। পুরো বাড়িটি পুনর্নির্মাণের পরিবর্তে, রিঅ্যাক্ট একজন বিশেষজ্ঞ ঠিকাদারের মতো কাজ করে যিনি সঠিকভাবে সনাক্ত করেন কোন নির্দিষ্ট ইটগুলি প্রতিস্থাপন করা দরকার, ফলে কাজ এবং ব্যাঘাত কম হয়।

অধ্যায় ২: কী (Key) ছাড়া লিস্ট রেন্ডার করার সমস্যা

এখন, আসুন দেখি এই চমৎকার সিস্টেমটি কোথায় সমস্যায় পড়তে পারে। একটি সাধারণ কম্পোনেন্ট বিবেচনা করুন যা ব্যবহারকারীদের একটি তালিকা রেন্ডার করে:


function UserList({ users }) {
  return (
    <ul>
      {users.map(user => (
        <li>{user.name}</li>
      ))}
    </ul>
  );
}

যখন এই কম্পোনেন্টটি প্রথমবার রেন্ডার হয়, রিঅ্যাক্ট একটি VDOM ট্রি তৈরি করে। যদি আমরা `users` অ্যারের *শেষে* একটি নতুন ব্যবহারকারী যুক্ত করি, রিঅ্যাক্টের ডিফারেন্সিং অ্যালগরিদম এটি সুন্দরভাবে পরিচালনা করে। এটি পুরানো এবং নতুন তালিকার তুলনা করে, শেষে একটি নতুন আইটেম দেখতে পায়, এবং কেবল একটি নতুন `<li>` আসল DOM-এ যুক্ত করে। দক্ষ এবং সহজ।

কিন্তু যদি আমরা তালিকার *শুরুতে* একটি নতুন ব্যবহারকারী যুক্ত করি, বা আইটেমগুলি পুনর্বিন্যাস করি, তাহলে কী হবে?

ধরা যাক আমাদের প্রাথমিক তালিকাটি হলো:

এবং একটি আপডেটের পরে, এটি হয়ে যায়:

কোনো অনন্য শনাক্তকারী ছাড়া, রিঅ্যাক্ট দুটি তালিকার তুলনা তাদের ক্রম (ইনডেক্স) এর উপর ভিত্তি করে করে। এখানে এটি যা দেখে:

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

এই কারণেই, যদি আপনি উপরের কোডটি চালান, আপনার ব্রাউজারের ডেভেলপার কনসোল একটি সতর্কতা দেখাবে: "Warning: Each child in a list should have a unique 'key' prop." রিঅ্যাক্ট আপনাকে স্পষ্টভাবে বলছে যে তার কাজটি দক্ষতার সাথে সম্পাদন করার জন্য সাহায্যের প্রয়োজন।

অধ্যায় ৩: উদ্ধারে `key` প্রপ

key প্রপটি হলো রিঅ্যাক্টের প্রয়োজনীয় ইঙ্গিত। এটি একটি বিশেষ স্ট্রিং অ্যাট্রিবিউট যা আপনি এলিমেন্টের তালিকা তৈরি করার সময় সরবরাহ করেন। কী প্রতিটি এলিমেন্টকে রি-রেন্ডার জুড়ে একটি স্থিতিশীল এবং অনন্য পরিচয় দেয়।

আসুন আমাদের `UserList` কম্পোনেন্টটি কী সহ পুনরায় লিখি:


function UserList({ users }) {
  return (
    <ul>
      {users.map(user => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

এখানে, আমরা ধরে নিচ্ছি প্রতিটি `user` অবজেক্টের একটি অনন্য `id` প্রপার্টি আছে (যেমন, একটি ডাটাবেস থেকে)। এখন, আসুন আমাদের আগের পরিস্থিতিটি আবার দেখি।

প্রাথমিক ডেটা:


[{ id: 'u1', name: 'Alice' }, { id: 'u2', name: 'Bob' }]

আপডেট করা ডেটা:


[{ id: 'u3', name: 'Charlie' }, { id: 'u1', name: 'Alice' }, { id: 'u2', name: 'Bob' }]

কী ব্যবহার করার ফলে রিঅ্যাক্টের ডিফারেন্সিং প্রক্রিয়াটি অনেক বেশি স্মার্ট হয়:

  1. রিঅ্যাক্ট নতুন VDOM-এর `<ul>` এর চাইল্ডদের দেখে এবং তাদের কী পরীক্ষা করে। এটি `u3`, `u1`, এবং `u2` দেখতে পায়।
  2. তারপর এটি পূর্ববর্তী VDOM-এর চাইল্ড এবং তাদের কী পরীক্ষা করে। এটি `u1` এবং `u2` দেখতে পায়।
  3. রিঅ্যাক্ট জানে যে `u1` এবং `u2` কী সহ কম্পোনেন্টগুলি ইতিমধ্যেই বিদ্যমান। তাদের পরিবর্তন করার দরকার নেই; শুধু তাদের সংশ্লিষ্ট DOM নোডগুলিকে তাদের নতুন অবস্থানে সরাতে হবে।
  4. রিঅ্যাক্ট দেখে যে `u3` কী-টি নতুন। এটি "Charlie"-এর জন্য একটি নতুন কম্পোনেন্ট এবং DOM নোড তৈরি করে এবং এটিকে শুরুতে সন্নিবেশ করায়।

এর ফল হলো একটিমাত্র DOM ইনসার্শন এবং কিছু পুনর্বিন্যাস, যা আমরা আগে দেখেছিলাম সেই একাধিক মিউটেশন এবং ইনসার্শনের চেয়ে অনেক বেশি কার্যকর। কী একটি স্থিতিশীল পরিচয় প্রদান করে, যা রিঅ্যাক্টকে অ্যারেতে তাদের অবস্থান নির্বিশেষে রেন্ডার জুড়ে এলিমেন্টগুলি ট্র্যাক করতে সাহায্য করে।

অধ্যায় ৪: সঠিক কী (Key) নির্বাচন - গোল্ডেন রুলস

key প্রপের কার্যকারিতা সম্পূর্ণভাবে সঠিক মান নির্বাচনের উপর নির্ভর করে। এখানে কিছু স্পষ্ট সেরা অভ্যাস এবং বিপজ্জনক অ্যান্টি-প্যাটার্ন রয়েছে যা সম্পর্কে সচেতন থাকতে হবে।

সেরা কী: অনন্য এবং স্থিতিশীল আইডি

আদর্শ কী হলো এমন একটি মান যা একটি তালিকার মধ্যে একটি আইটেমকে অনন্য এবং স্থায়ীভাবে সনাক্ত করে। এটি প্রায় সবসময়ই আপনার ডেটা উৎস থেকে একটি অনন্য আইডি হয়।

কী-এর জন্য চমৎকার উৎসগুলির মধ্যে রয়েছে:


// ভালো: ডেটা থেকে একটি স্থিতিশীল, অনন্য আইডি ব্যবহার করা হচ্ছে।
<div>
  {products.map(product => (
    <ProductItem key={product.sku} product={product} />
  ))}
</div>

অ্যান্টি-প্যাটার্ন: অ্যারে ইনডেক্সকে কী হিসাবে ব্যবহার করা

একটি সাধারণ ভুল হলো অ্যারে ইনডেক্সকে কী হিসাবে ব্যবহার করা:


// খারাপ: অ্যারে ইনডেক্সকে কী হিসাবে ব্যবহার করা হচ্ছে।
<div>
  {items.map((item, index) => (
    <ListItem key={index} item={item} />
  ))}
</div>

যদিও এটি রিঅ্যাক্টের সতর্কতাটি বন্ধ করে দেবে, এটি গুরুতর সমস্যার কারণ হতে পারে এবং সাধারণত এটি একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচিত হয়। ইনডেক্সকে কী হিসাবে ব্যবহার করা রিঅ্যাক্টকে বলে যে একটি আইটেমের পরিচয় তার তালিকার অবস্থানের সাথে আবদ্ধ। যখন তালিকাটি পুনর্বিন্যাস করা, ফিল্টার করা, বা শুরু বা মাঝখান থেকে আইটেম যোগ/মুছে ফেলা হয়, তখন এটি কোনো কী না থাকার মতোই একটি সমস্যা তৈরি করে।

স্টেট ম্যানেজমেন্ট বাগ:

ইনডেক্স কী ব্যবহারের সবচেয়ে বিপজ্জনক পার্শ্বপ্রতিক্রিয়া দেখা যায় যখন আপনার লিস্ট আইটেমগুলি তাদের নিজস্ব স্টেট পরিচালনা করে। ইনপুট ফিল্ডের একটি তালিকা কল্পনা করুন:


function UnstableList() {
  const [items, setItems] = React.useState([{ id: 1, text: 'First' }, { id: 2, text: 'Second' }]);

  const handleAddItemToTop = () => {
    setItems([{ id: 3, text: 'New Top' }, ...items]);
  };

  return (
    <div>
      <button onClick={handleAddItemToTop}>Add to Top</button>
      {items.map((item, index) => (
        <div key={index}>
          <label>{item.text}: </label>
          <input type="text" />
        </div>
      ))}
    </div>
  );
}

এই মানসিক অনুশীলনটি চেষ্টা করুন:

  1. তালিকাটি "First" এবং "Second" দিয়ে রেন্ডার হয়।
  2. আপনি প্রথম ইনপুট ফিল্ডে (যেটি "First"-এর জন্য) "Hello" টাইপ করেন।
  3. আপনি "Add to Top" বোতামে ক্লিক করেন।

আপনি কী আশা করবেন? আপনি আশা করবেন যে "New Top"-এর জন্য একটি নতুন, খালি ইনপুট প্রদর্শিত হবে, এবং "First"-এর ইনপুটটি (এখনও "Hello" ধারণ করে) নিচে চলে যাবে। আসলে কী হয়? প্রথম অবস্থানে (ইনডেক্স ০) থাকা ইনপুট ফিল্ডটি, যা এখনও "Hello" ধারণ করে, সেখানেই থাকে। কিন্তু এখন এটি নতুন ডেটা আইটেম "New Top"-এর সাথে যুক্ত হয়েছে। ইনপুট কম্পোনেন্টের স্টেট (এর অভ্যন্তরীণ মান) তার অবস্থানের সাথে (key=0) আবদ্ধ, যে ডেটা এটি প্রতিনিধিত্ব করার কথা তার সাথে নয়। এটি ইনডেক্স কী-এর কারণে সৃষ্ট একটি ক্লাসিক এবং বিভ্রান্তিকর বাগ।

আপনি যদি কেবল `key={index}`-কে `key={item.id}`-তে পরিবর্তন করেন, তাহলে সমস্যাটি সমাধান হয়ে যায়। রিঅ্যাক্ট এখন সঠিকভাবে কম্পোনেন্টের স্টেটকে ডেটার স্থিতিশীল আইডির সাথে যুক্ত করবে।

কখন ইনডেক্স কী ব্যবহার করা গ্রহণযোগ্য?

কিছু বিরল পরিস্থিতি রয়েছে যেখানে ইনডেক্স ব্যবহার করা নিরাপদ, তবে আপনাকে এই সমস্ত শর্ত পূরণ করতে হবে:

  1. তালিকাটি স্ট্যাটিক: এটি কখনও পুনর্বিন্যাস করা, ফিল্টার করা, বা শেষ ছাড়া অন্য কোথাও থেকে আইটেম যোগ/মুছে ফেলা হবে না।
  2. তালিকার আইটেমগুলির কোনো স্থিতিশীল আইডি নেই।
  3. প্রতিটি আইটেমের জন্য রেন্ডার করা কম্পোনেন্টগুলি সরল এবং তাদের কোনো অভ্যন্তরীণ স্টেট নেই।

এমনকি তখনও, সম্ভব হলে একটি অস্থায়ী কিন্তু স্থিতিশীল আইডি তৈরি করা প্রায়শই ভালো। ইনডেক্স ব্যবহার করা সবসময় একটি ইচ্ছাকৃত পছন্দ হওয়া উচিত, ডিফল্ট নয়।

সবচেয়ে খারাপ অভ্যাস: `Math.random()`

কখনোই, কখনোই `Math.random()` বা অন্য কোনো নন-ডিটারমিনিস্টিক মান কী-এর জন্য ব্যবহার করবেন না:


// ভয়ানক: এটি করবেন না!
<div>
  {items.map(item => (
    <ListItem key={Math.random()} item={item} />
  ))}
</div>

`Math.random()` দ্বারা তৈরি একটি কী প্রতিটি রেন্ডারে ভিন্ন হবে এটি নিশ্চিত। এটি রিঅ্যাক্টকে বলে যে পূর্ববর্তী রেন্ডারের সমস্ত কম্পোনেন্টের তালিকা ধ্বংস হয়ে গেছে এবং সম্পূর্ণ ভিন্ন কম্পোনেন্টের একটি নতুন তালিকা তৈরি হয়েছে। এটি রিঅ্যাক্টকে সমস্ত পুরানো কম্পোনেন্ট আনমাউন্ট করতে (তাদের স্টেট ধ্বংস করে) এবং সমস্ত নতুন কম্পোনেন্ট মাউন্ট করতে বাধ্য করে। এটি রিকনসিলিয়েশনের উদ্দেশ্যকে সম্পূর্ণরূপে ব্যর্থ করে এবং পারফর্ম্যান্সের জন্য সবচেয়ে খারাপ বিকল্প।

অধ্যায় ৫: অ্যাডভান্সড ধারণা এবং সাধারণ প্রশ্ন

`key` এবং `React.Fragment`

কখনও কখনও আপনাকে একটি `map` কলব্যাক থেকে একাধিক এলিমেন্ট রিটার্ন করতে হয়। এটি করার স্ট্যান্ডার্ড উপায় হলো `React.Fragment` ব্যবহার করা। যখন আপনি এটি করেন, তখন `key` অবশ্যই `Fragment` কম্পোনেন্টের উপরই রাখতে হবে।


function Glossary({ terms }) {
  return (
    <dl>
      {terms.map(term => (
        // কী Fragment-এর উপর যাবে, চাইল্ডদের উপর নয়।
        <React.Fragment key={term.id}>
          <dt>{term.name}</dt>
          <dd>{term.definition}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

গুরুত্বপূর্ণ: শর্টহ্যান্ড সিনট্যাক্স `<>...</>` কী সমর্থন করে না। যদি আপনার তালিকার জন্য ফ্র্যাগমেন্টের প্রয়োজন হয়, তবে আপনাকে অবশ্যই সুস্পষ্ট `<React.Fragment>` সিনট্যাক্স ব্যবহার করতে হবে।

কী (Key) শুধুমাত্র পাশাপাশি এলিমেন্টের (Siblings) মধ্যে অনন্য হতে হবে

একটি সাধারণ ভুল ধারণা হলো যে কী-গুলিকে আপনার পুরো অ্যাপ্লিকেশন জুড়ে বিশ্বব্যাপী অনন্য হতে হবে। এটি সত্য নয়। একটি কী শুধুমাত্র তার তাৎক্ষণিক সিবলিংদের তালিকার মধ্যে অনন্য হতে হবে।


function CourseRoster({ courses }) {
  return (
    <div>
      {courses.map(course => (
        <div key={course.id}>  {/* কোর্সের জন্য কী */} 
          <h3>{course.title}</h3>
          <ul>
            {course.students.map(student => (
              // এই স্টুডেন্ট কী শুধুমাত্র এই নির্দিষ্ট কোর্সের স্টুডেন্ট তালিকার মধ্যে অনন্য হতে হবে।
              <li key={student.id}>{student.name}</li>
            ))}
          </ul>
        </div>
      ))}
    </div>
  );
}

উপরের উদাহরণে, দুটি ভিন্ন কোর্সে `id: 's1'` সহ একজন ছাত্র থাকতে পারে। এটি সম্পূর্ণ ঠিক আছে কারণ কী-গুলি বিভিন্ন প্যারেন্ট `<ul>` এলিমেন্টের মধ্যে মূল্যায়ন করা হচ্ছে।

কম্পোনেন্টের স্টেট ইচ্ছাকৃতভাবে রিসেট করতে কী (Key) ব্যবহার করা

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

এটি একটি কম্পোনেন্ট রিসেট করার একটি শক্তিশালী এবং ডিক্লারেটিভ উপায় হতে পারে। উদাহরণস্বরূপ, একটি `UserProfile` কম্পোনেন্ট কল্পনা করুন যা একটি `userId`-এর উপর ভিত্তি করে ডেটা নিয়ে আসে।


function App() {
  const [userId, setUserId] = React.useState('user-1');

  return (
    <div>
      <button onClick={() => setUserId('user-1')}>View User 1</button>
      <button onClick={() => setUserId('user-2')}>View User 2</button>
      
      <UserProfile key={userId} id={userId} />
    </div>
  );
}

`UserProfile` কম্পোনেন্টে `key={userId}` স্থাপন করে, আমরা নিশ্চিত করি যে যখনই `userId` পরিবর্তিত হবে, পুরো `UserProfile` কম্পোনেন্টটি ফেলে দেওয়া হবে এবং একটি নতুন তৈরি করা হবে। এটি সম্ভাব্য বাগ প্রতিরোধ করে যেখানে পূর্ববর্তী ব্যবহারকারীর প্রোফাইল থেকে স্টেট (যেমন ফর্ম ডেটা বা ফেচ করা বিষয়বস্তু) থেকে যেতে পারে। এটি কম্পোনেন্টের পরিচয় এবং লাইফসাইকেল পরিচালনা করার একটি পরিষ্কার এবং সুস্পষ্ট উপায়।

উপসংহার: আরও ভালো রিঅ্যাক্ট কোড লেখা

`key` প্রপটি একটি কনসোল সতর্কতা বন্ধ করার উপায়ের চেয়ে অনেক বেশি কিছু। এটি রিঅ্যাক্টের জন্য একটি মৌলিক নির্দেশনা, যা তার রিকনসিলিয়েশন অ্যালগরিদমকে দক্ষতার সাথে এবং সঠিকভাবে কাজ করার জন্য প্রয়োজনীয় গুরুত্বপূর্ণ তথ্য সরবরাহ করে। কী-এর ব্যবহার আয়ত্ত করা একজন পেশাদার রিঅ্যাক্ট ডেভেলপারের অন্যতম বৈশিষ্ট্য।

আসুন মূল বিষয়গুলি সংক্ষেপে আলোচনা করি:

এই নীতিগুলি আত্মস্থ করার মাধ্যমে, আপনি কেবল দ্রুত, আরও নির্ভরযোগ্য রিঅ্যাক্ট অ্যাপ্লিকেশনই লিখবেন না, বরং লাইব্রেরির মূল মেকানিক্স সম্পর্কেও গভীর ধারণা অর্জন করবেন। পরের বার যখন আপনি একটি তালিকা রেন্ডার করার জন্য একটি অ্যারে ম্যাপ করবেন, তখন `key` প্রপকে তার প্রাপ্য মনোযোগ দিন। আপনার অ্যাপ্লিকেশনের পারফর্ম্যান্স—এবং আপনার ভবিষ্যতের আপনি—এর জন্য আপনাকে ধন্যবাদ জানাবে।