আমি প্রতিক্রিয়া কাজ।
TLDR:
তবে আপনি কি সেটাকে স্টেট আপডেট করার অনুরোধে একই স্থানে রাষ্ট্র আপডেট করার জন্য প্রতিক্রিয়াটিকে বিশ্বাস করতে পারেন
হ্যাঁ.
হ্যাঁ.
অর্ডার আপডেটের সবসময় বিবেচনা করা হয়। আপনি তাদের মধ্যে "মধ্যবর্তী" অবস্থা দেখেন কিনা বা আপনি কোনও ব্যাচে রয়েছেন কিনা তার উপর নির্ভর করে।
বর্তমানে (১ 16 এবং তার আগের প্রতিক্রিয়া), কেবল প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারগুলির মধ্যে আপডেটগুলি ডিফল্টরূপে ব্যাচ হয় । আপনার যখন প্রয়োজন হয় বিরল ক্ষেত্রে ইভেন্ট হ্যান্ডলারের বাইরে ব্যাচিংকে বাধ্য করার জন্য একটি অস্থির API রয়েছে।
ভবিষ্যতের সংস্করণগুলিতে (সম্ভবত 17 এবং তার পরে প্রতিক্রিয়া করুন), প্রতিক্রিয়াটি ডিফল্ট অনুসারে সমস্ত আপডেটগুলি ব্যাচ করে দেবে যাতে আপনার এটি সম্পর্কে চিন্তা করতে হবে না। সর্বদা হিসাবে, আমরা প্রতিক্রিয়া ব্লগ এবং রিলিজ নোটগুলিতে এ সম্পর্কে যে কোনও পরিবর্তন ঘোষণা করব ।
এটি বোঝার মূল বিষয়টিsetState()
হ'ল আপনি কোনও প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারের অভ্যন্তরে কয়টি উপাদানই কল করুন না কেন , ইভেন্টের শেষে তারা কেবলমাত্র একক পুনরায় রেন্ডার তৈরি করবে । বৃহত অ্যাপ্লিকেশনগুলিতে ভাল পারফরম্যান্সের জন্য এটি গুরুত্বপূর্ণ কারণ যদি ক্লিক ইভেন্ট হ্যান্ডল করার সময় Child
এবং যদি Parent
প্রতিটি কল হয় setState()
, আপনি Child
দুবার পুনরায় রেন্ডার করতে চান না ।
আপনার উভয় উদাহরণে, setState()
কলগুলি একটি প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারের ভিতরে ঘটে। অতএব এগুলি ইভেন্টের শেষে সর্বদা একসাথে ফেলা হয় (এবং আপনি মধ্যবর্তী অবস্থা দেখতে পাবেন না)।
আপডেট সবসময় জিওপার্ডিতে অর্ডার তারা ঘটতে মধ্যে মিশে গিয়ে তৈরি । সুতরাং যদি প্রথম আপডেট হয় {a: 10}
, দ্বিতীয়টি হয় {b: 20}
এবং তৃতীয়টি হয় {a: 30}
, রেন্ডার রাষ্ট্র হবে {a: 30, b: 20}
। একই রাজ্যের কীতে সাম্প্রতিক আপডেট (যেমন a
আমার উদাহরণের মতো) সর্বদা "জয়"।
this.state
বস্তু আপডেট করা হয় যখন আমরা ব্যাচ শেষে UI 'তে পুনরায় রেন্ডার। সুতরাং আপনার যদি আগের অবস্থার উপর ভিত্তি করে রাষ্ট্র আপডেট করার প্রয়োজন হয় (যেমন একটি কাউন্টার বাড়ানো), আপনার setState(fn)
পড়া সংক্রান্ত পরিবর্তে আপনাকে কার্যক্ষম সংস্করণ ব্যবহার করা উচিত যা আপনাকে পূর্ববর্তী অবস্থা দেয় this.state
। যদি আপনি এটির জন্য যুক্তি সম্পর্কে আগ্রহী হন তবে আমি এটিকে এই মন্তব্যে গভীরভাবে ব্যাখ্যা করেছি ।
আপনার উদাহরণে, আমরা "মধ্যবর্তী অবস্থা" দেখতে পাব না কারণ আমরা একটি প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারের ভিতরে থাকি যেখানে ব্যাচিং সক্ষম করা হয় (কারণ আমরা যখন ইভেন্টটি থেকে বেরিয়ে আসছি তখন প্রতিক্রিয়া "জানেন")।
যাইহোক, প্রতিক্রিয়া ১ earlier এবং পূর্ববর্তী সংস্করণ উভয়ই, ইভেন্ট ইভেন্ট হ্যান্ডলারের বাইরে ডিফল্টরূপে কোনও ব্যাচিং নেই । সুতরাং আপনার উদাহরণে যদি আমাদের পরিবর্তে AJAX প্রতিক্রিয়া হ্যান্ডলার handleClick
থাকে setState()
তবে প্রত্যেকটি এটি হওয়ার সাথে সাথেই প্রক্রিয়াজাত করা হবে। এই ক্ষেত্রে, হ্যাঁ, আপনি হবে কোন মধ্যবর্তী রাষ্ট্র দেখুন:
promise.then(() => {
// We're not in an event handler, so these are flushed separately.
this.setState({a: true}); // Re-renders with {a: true, b: false }
this.setState({b: true}); // Re-renders with {a: true, b: true }
this.props.setParentState(); // Re-renders the parent
});
আমরা বুঝতে পারি যে এটি কোনও অসুবিধাজনক নয় যে আপনি কোনও ইভেন্ট হ্যান্ডলারে রয়েছেন কিনা তার উপর নির্ভর করে আচরণটি আলাদা । এটি ভবিষ্যতের প্রতিক্রিয়া সংস্করণে পরিবর্তিত হবে যা ডিফল্টরূপে সমস্ত আপডেটের ব্যাচ করবে (এবং সিঙ্ক্রোনালি পরিবর্তনগুলি ফ্লাশ করার জন্য একটি অপ্ট-ইন এপিআই সরবরাহ করবে)। আমরা ডিফল্ট আচরণটি স্যুইচ না করা পর্যন্ত (সম্ভাব্যভাবে 17 টি প্রতিক্রিয়াতে), এমন একটি API রয়েছে যা আপনি ব্যাচিংয়ে জোর করতে ব্যবহার করতে পারেন :
promise.then(() => {
// Forces batching
ReactDOM.unstable_batchedUpdates(() => {
this.setState({a: true}); // Doesn't re-render yet
this.setState({b: true}); // Doesn't re-render yet
this.props.setParentState(); // Doesn't re-render yet
});
// When we exit unstable_batchedUpdates, re-renders once
});
অভ্যন্তরীণ প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারগুলি সমস্তই মোড়ানো হচ্ছে unstable_batchedUpdates
যার কারণে তারা ডিফল্টরূপে ব্যাচ করা হচ্ছে। নোট করুন যে একটি আপডেট unstable_batchedUpdates
দুটি বার মোড়ানোর কোনও প্রভাব নেই। আপডেটগুলি ফ্লাশ করা হয় যখন আমরা বাইরেরতম unstable_batchedUpdates
কলটি থেকে প্রস্থান করি ।
সেই এপিআই এই অর্থে "অস্থিতিশীল" যে ব্যাচিং ইতিমধ্যে ডিফল্টরূপে সক্ষম হয়ে গেলে আমরা এটিকে সরিয়ে ফেলব। তবে আমরা এটিকে একটি ছোটখাটো সংস্করণে সরাব না, তাই 17 এর প্রতিক্রিয়া না হওয়া পর্যন্ত আপনি নিরাপদে এটির উপর নির্ভর করতে পারবেন যদি ইভেন্ট ইভেন্ট হ্যান্ডলারের বাইরে কিছু ক্ষেত্রে আপনাকে জোর করে জোর করা প্রয়োজন atch
সংক্ষেপে বলতে গেলে এটি একটি বিভ্রান্তিকর বিষয় কারণ কেবল ইভেন্ট হ্যান্ডলারদের মধ্যে ডিফল্টরূপে কেবল প্রতিক্রিয়া হয়। এটি ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হবে এবং আচরণটি তখন আরও সহজ হবে। তবে সমাধানটি কম ব্যাচ নয় , এটি ডিফল্টরূপে আরও ব্যাচ করা । আমরা যা করতে যাচ্ছি।