আমি কীভাবে সমস্ত ট্রান্সসিটিভ অ্যাক্সেসযোগ্য রাজ্য সহ একটি প্রতিক্রিয়া উপাদান পুনরায় সেট করতে পারি?


94

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

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

এটি করার জন্য কি কোনও এপিআই বা প্যাটার্ন রয়েছে?

সম্পাদনা: আমি একটি তুচ্ছ উদাহরণ তৈরি করেছি যা this.replaceState(this.getInitialState())পদ্ধতির সাথে প্রদর্শন করে এবং পদ্ধতির সাথে এর বিপরীতে this.setState(this.getInitialState()): jsfiddle - replaceStateআরও দৃ is

উত্তর:


211

আপনার উল্লিখিত অন্তর্নিহিত ব্রাউজারের অবস্থা এবং শিশুদের অবস্থা পুনরায় সেট করা হয়েছে তা নিশ্চিত করতে, আপনি ফিরে আসা মূল-স্তরের উপাদানটিতে একটি keyবৈশিষ্ট্য যুক্ত করতে পারেন render; যখন এটি পরিবর্তন হবে, সেই উপাদানটি ফেলে দেওয়া হবে এবং স্ক্র্যাচ থেকে তৈরি করা হবে।

render: function() {
    // ...
    return <div key={uniqueId}>
        {children}
    </div>;
}

স্বতন্ত্র উপাদানটির স্থানীয় অবস্থা পুনরায় সেট করার জন্য কোনও শর্টকাট নেই।


4
কৌতূহলের বাইরে যখন আপনি বলবেন যে 'উপাদানটি ফেলে দেওয়া হবে এবং স্ক্র্যাচ থেকে তৈরি করা হবে' আপনার অর্থ কি ভার্চুয়াল ডিওএম ফেলে দেওয়া হবে এবং স্ক্র্যাচ থেকে তৈরি করা হবে তবে ডিওএম আপডেটগুলি এখনও ভিন্ন আলগোরিদমের ভিত্তিতে ঘটবে?
নিমগের্গ

4
@ নিমগ্রাগ না, আসল ডোম উপাদানগুলিও আবার তৈরি করা হবে। (ভার্চুয়াল ডোমটি ইতিমধ্যে প্রতিটি রেন্ডারে পুনরায় তৈরি করা হয়েছে তাই যদি আপনি আসল ডোম রাখতে চান তবে কেবল keyএই ক্ষেত্রে কোনও সেট করবেন না ))
সোফি আল্পার্ট

4
@ এমননার্বোন 0.8 রিঅ্যাক্টে, কীগুলি কেবল একটি অ্যারেতে ভাইবোনের উপাদানগুলির মধ্যে পার্থক্য করার জন্য ব্যবহৃত হয় এবং মূলটিতে উপেক্ষা করা হয়। Github.com/facebook/react/issues/590 দেখুন ।
সোফি আল্পার্ট

নোট করুন replaceState()এবং getInitialState()উভয়ই নতুন ES6 শ্রেণির-স্টাইলের রিএ্যাক্টজগুলিতে অবচয় করা হয়েছে। this.setState(this._getInitialState())পরিবর্তে ব্যবহার করুন। এছাড়াও আপনি নিজের স্টেট ইনিশিয়াল ক্রিয়াকলাপের নাম রাখতে পারবেন না getInitialState()- প্রতিক্রিয়াটি একটি সতর্কতা নিক্ষেপ করে - এটিকে অন্য কোনও কিছু বলুন এবং স্পষ্টভাবে state = this._getInitialState()শ্রেণীর শীর্ষ স্তরের ক্ষেত্রে করুন।
thom_nic

4
কোনও বাহকের অভ্যন্তরীণ অংশ থেকে কী প্রপসটি পাস করার জন্য কোনও উপায় নেই?
trusktr

14

পরিবর্তে আপনার পরিবর্তে replaceStateব্যবহার setStateকরা উচিত ।

দস্তাবেজগুলি বলে যে replaceState"প্রতিক্রিয়াটির ভবিষ্যতের সংস্করণে পুরোপুরি সরিয়ে দেওয়া যেতে পারে।" আমি মনে করি এটি অবশ্যই মুছে ফেলা হবে কারণ replaceStateপ্রতিক্রিয়া দর্শনের সাথে সত্যই মাতামাতি করে না। এটি রিয়্যাক্ট উপাদান তৈরি করার সুবিধার্থে সুইডেন ছুরি-ওয়াইন্ডা মনে করে feel এটি ছোট হয়ে ওঠার জন্য আরও একটি প্রতিক্রিয়া উপাদানটির প্রাকৃতিক বিকাশের বিরুদ্ধে কৃতজ্ঞ।

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

যাইহোক আপনি এটি এটি কিভাবে। উপরের বেনের (গৃহীত) উত্তরগুলির মতো, তবে এটির মতো:

this.setState(this.getInitialState());

এছাড়াও (যেমন বেনও বলেছেন) "ব্রাউজারের অবস্থা" পুনরায় সেট করতে আপনাকে সেই ডিওএম নোডটি সরিয়ে ফেলতে হবে। ভিডমের শক্তি বাড়ান এবং keyসেই উপাদানটির জন্য একটি নতুন প্রপ ব্যবহার করুন। নতুন রেন্ডার সেই উপাদানটি পাইকারি প্রতিস্থাপন করবে।

তথ্যসূত্র: https://facebook.github.io/react/docs/comp घटक-api.html# replacestate


4
যদি বর্তমান অবস্থায় প্রাথমিক অবস্থানে নেই এমন কোনও সম্পত্তি অন্তর্ভুক্ত থাকে তবে এটি কাজ করবে না। যদিও আমি বিশ্বাস করি না যে এটি বিষয়গুলির একটি দুর্দান্ত "রাষ্ট্র", যদি না আপনি কোনওভাবে এটি প্রতিরোধ করতে পারেন তবে আমি আশ্চর্যজনক ভাঙ্গন এড়াতে চাই। কিছু ক্ষেত্রে ক্র্যাশ হওয়া রিসেটের সাথে আমি ঠিক থাকব , তবে এমন রিসেট নয় যা সূক্ষ্মভাবে রাষ্ট্রকে দূষিত করে।
ইমন নের্বোন

আমি অনুসরণ করছি নিশ্চিত না। আপনি কি বলছেন যে এটি সমতুল্য নয় this.replaceState? এটি কিউজ
wle8300

4
@ williamle8300 তাদের কাছে সমান হবে না যদি কলগুলিতে কল করুন getInitialState()(একটি অনিক্লিক হ্যান্ডলারের সাহায্যে বলুন) এর মধ্যে উপাদানটির জীবনকালক্রমে কোথাও একটি নতুন সম্পত্তি যুক্ত করা হয়। এই ক্ষেত্রে, সেই নতুন সম্পত্তি এখনও ২ য় পরে উপস্থিত থাকবে getInitialState()
গ্রাহাম

@ গ্রাহাম আমি বিশ্বাস করি যে ইতিমধ্যে ঘোষণা করা হয়নি এমন একটি উপাদানের সাথে নতুন রাষ্ট্র প্রবর্তন করা খারাপ অভ্যাস getInitialState। ফাংশনের শীর্ষে জেএস ফাংশনে আপনার সমস্ত ভেরিয়েবল ঘোষণার মতো। পার্শ্ব দ্রষ্টব্য: বেন আল্পার্টের সমাধানটি আমার কাছে প্রায় একই রকম ... এবং তিনি একজন অফিসিয়াল রিএ্যাক্ট রক্ষণাবেক্ষণকারী!
wle8300

4
আমি ভয় পেয়েছি getInitialState () ফাংশনটি পেয়েছি, এবং সেইজন্য উত্তরটি হ্রাস করা হয়েছে। একটি আপডেট সুন্দর হবে।
মার্টিন আর।

10

সংযোজন ক keyআপনাকে পুনরায় পুনঃনির্মাণ করতে হবে এমন উপাদানের সাথে অ্যাট্রিবিউট যুক্ত করা প্রতিবার এটি পুনরায় লোড করবে propsবা stateউপাদান পরিবর্তনের সাথে যুক্ত হবে।

কী = {নতুন তারিখ ()। গেটটাইম ()}

এখানে একটি উদাহরণ:

render() {
  const items = (this.props.resources) || [];
  const totalNumberOfItems = (this.props.resources.noOfItems) || 0;

  return (
    <div className="items-container">
      <PaginationContainer
        key={new Date().getTime()}
        totalNumberOfItems={totalNumberOfItems}
        items={items}
        onPageChange={this.onPageChange}
      />
    </div>
  );
}

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