প্রতিক্রিয়া হুকগুলিতে পদ্ধতিটি ধাক্কা (ব্যবহারের স্টেট)?


108

কিভাবে ব্যবহারকারীর স্টোর অ্যারে প্রতিক্রিয়া হুক ভিতরে উপাদান পুশ? প্রতিক্রিয়া অবস্থায় কি এটি কোনও পুরানো পদ্ধতি হিসাবে? নাকি নতুন কিছু?

যেমন সেটস্টেট ধাক্কা উদাহরণ ?

উত্তর:


263

আপনি যখন ব্যবহার করবেন useState, আপনি রাষ্ট্র আইটেমটির জন্য একটি আপডেট পদ্ধতি পেতে পারেন:

const [theArray, setTheArray] = useState(initialArray);

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

setTheArray(oldArray => [...oldArray, newElement]);

কখনও কখনও আপনি, যে কলব্যাক ফর্ম ব্যবহার না করেই পার পেয়ে যাবে যদি আপনি শুধুমাত্র মত নির্দিষ্ট নির্দিষ্ট ব্যবহারকারীর ইভেন্টের জন্য হ্যান্ডেলার অ্যারের আপডেট click(কিন্তু মত নয় mousemove):

setTheArray([...theArray, newElement]);

যে ইভেন্টগুলির জন্য প্রতিক্রিয়াটি নিশ্চিত করে যে রেন্ডারিং ফ্লাশ হয়েছে তা হ'ল এখানে তালিকাভুক্ত "বিচ্ছিন্ন ঘটনা" ।

সরাসরি উদাহরণ (এতে একটি কলব্যাক পাস করা setTheArray):

যেহেতু কেবলমাত্র একমাত্র আপডেটটি theArrayএকটি clickইভেন্টে ("বিযুক্ত" ইভেন্টগুলির মধ্যে একটি) রয়েছে তাই আমি সরাসরি আপডেট নিয়ে পালাতে পারলাম addEntry:


4
... এবং setTheArray(currentArray => [...currentArray, newElement])উপরের কাজ না করে চেষ্টা করুন । সম্ভবত useEffect(...theArray..., []), এটি অনুধাবন করা গুরুত্বপূর্ণ যে theArrayএটি একটি ধ্রুবক, তাই ভবিষ্যতের
রেন্ডারগুলি

@ এপ্রিলিয়ন - আপনি নিশ্চিত যে useEffectউদাহরণটি দিয়ে যা বলছেন তা নিশ্চিত নয় ...?
টিজে ক্রাউডার

4
যদি useEffectখালি নির্ভরতা তালিকা থাকে তবে []এটি কেবল প্রথম রেন্ডার সময় কার্যকর করা হবে। সুতরাং theArrayপ্রভাবটির অভ্যন্তরের মান সর্বদা থাকবে initialArray। এমন পরিস্থিতিতে যেখানে setTheArray([...initialArray, newElement])বোধগম্য হবে না এবং যখন theArrayধ্রুবক সর্বদা সমান হয় initialValueতখন কার্যকরী আপডেটগুলি প্রয়োজন।
এপ্রিলিয়ন

@ এপ্রিলিয়ন - আমি আশঙ্কা করছি যে আমি এখনও এটি পাচ্ছি না, সম্ভবত কিছুটা ঘন হওয়ার কারণে। :-) আপনার কেবল প্রাথমিক আরে মান সহ কেন একটি প্রভাব প্রয়োজন ? (আমি বোঝাতে চাইছি যে এখানে খুব কম ব্যবহারের ঘটনা ঘটতে পারে, তবে ...) এবং এমনকি যদি আপনি এটি করেন তবে এটির প্রশ্নের সাথে কী সম্পর্ক আছে?
টিজে ক্রাউডার

আরে @TJCrowder, আমি যখন ডেটা আনার কলব্যাক উপায় নতুন পুরাতন ডেটাকে একত্র করার জন্য ব্যবহার, কিন্তু কিছু কারণে এটি সঠিকভাবে ভাল কাজ করে না যাচ্ছে তুমি কি দয়া করে পরীক্ষা করতে পারবেন এই আমার সমস্যা বুঝতে?
অলিভার ডি

45

আরও কিছুটা প্রসারিত করার জন্য, এখানে কয়েকটি সাধারণ উদাহরণ দেওয়া হল। দিয়ে শুরু:

const [theArray, setTheArray] = useState(initialArray);
const [theObject, setTheObject] = useState(initialObject);

অ্যারের শেষে উপাদানটি পুশ করুন

setTheArray(prevArray => [...prevArray, newValue])

অবজেক্টের শেষে এলিমেন্টটি পুশ / আপডেট করুন

setTheObject(prevState => ({ ...prevState, currentOrNewKey: newValue}));

অবজেক্টের অ্যারের শেষে উপাদানটি পুশ / আপডেট করুন

setTheArray(prevState => [...prevState, {currentOrNewKey: newValue}]);

অ্যারের অবজেক্টের শেষে উপাদানটি পুশ করুন

let specificArrayInObject = theObject.array.slice();
specificArrayInObject.push(newValue);
const newObj = { ...theObject, [event.target.name]: specificArrayInObject };
theObject(newObj);

এখানে কিছু কার্যকারী উদাহরণ রয়েছে। https://codesandbox.io/s/reacthooks-push-r991u


4
সমস্ত উদাহরণের জন্য আপনাকে ধন্যবাদ। অ্যারে অবজেক্টের শেষে আপনার সঠিক উপাদানটির সাথে আমি যে সমস্যাটি নিয়ে আসছিলাম তা হ'ল । আমি অনেকগুলি আলাদা আলাদা করে চেষ্টা করেছি, তবে এটি একসাথে আবদ্ধ করতে পারি নি।
sdouble

5

প্রতিক্রিয়া শ্রেণীর উপাদানগুলিতে আপনি "স্বাভাবিক" অবস্থার সাথে একইভাবে করেন।

উদাহরণ:

function App() {
  const [state, setState] = useState([]);

  return (
    <div>
      <p>You clicked {state.join(" and ")}</p>
      //destructuring
      <button onClick={() => setState([...state, "again"])}>Click me</button>
      //old way
      <button onClick={() => setState(state.concat("again"))}>Click me</button>
    </div>
  );
}

এটি অনক্লিকের সাথে কাজ করবে, তবে সেটস্টেট (ওল্ড স্টেট => [... ওল্ড স্টেট, পুশমোথিং]) আপনার কীভাবে করা উচিত তা হল
সাইরাস জেই

3
// Save search term state to React Hooks with spread operator and wrapper function

// Using .concat(), no wrapper function (not recommended)
setSearches(searches.concat(query))

// Using .concat(), wrapper function (recommended)
setSearches(searches => searches.concat(query))

// Spread operator, no wrapper function (not recommended)
setSearches([...searches, query])

// Spread operator, wrapper function (recommended)
setSearches(searches => [...searches, query])

https://medium.com/javascript-in-plain-english/how-to-add-to-an-array-in-react-state-3d08ddb2e1dc


2

setTheArray([...theArray, newElement]);সহজ উত্তর কিন্তু অ্যারে আইটেমগুলির রূপান্তর জন্য সতর্কতা অবলম্বন করুন । অ্যারে আইটেমগুলির গভীর ক্লোনিং ব্যবহার করুন।


আপনি যে গভীর ক্লোনিংয়ের কথা উল্লেখ করেছেন, তার অর্থ কি এইচবিএ হিসাবে গ্রহণ করা। ইউজস্টেট এবং অবজেক্টের সাথে অবজেক্টটি কনটাক্ট করবেন? এই লিঙ্ক হিসাবে একই? gist.githubusercontent.com/kahsing/…
লুই

1

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

const [names, setNames] = useState([])

আপনি এই অ্যারেতে এভাবে চাপ দিতে পারেন,

setNames(names => [...names, newName])

আশা করি এইটি কাজ করবে.


দয়া করে কেবল লিঙ্কযুক্ত উত্তর পোস্ট করবেন না। ভবিষ্যতে লিঙ্কটি নষ্ট হয়ে যেতে পারে। পরিবর্তে, article নিবন্ধটির একটি লিখন আপ তৈরি করুন এবং নিশ্চিতভাবে প্রশ্নের উত্তরটি নিশ্চিত করুন।
ব্ল্যাকচেথা

যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
ilke444
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.