React.useState প্রপস থেকে রাষ্ট্র পুনরায় লোড করে না


95

আমি প্রপস পরিবর্তনের উপর রাষ্ট্র পুনরায় লোড করার প্রত্যাশা করছি, তবে এটি কার্যকর হয় না এবং userপরের useStateকলটিতে পরিবর্তনশীল আপডেট হয় না , কী ভুল?

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});
  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

কোডপেন

উত্তর:


210

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

আপনি যদি প্রোপ চেঞ্জে স্টেট আপডেট করতে চান তবে useEffectহুক ব্যবহার করুন

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});

  React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

ওয়ার্কিং ডেমো


18
কনস্ট্রাক্টারে প্রাথমিক অবস্থায় সেট করার সময় বুঝতে হবে যে ক্লাস ইনস্ট্যান্সে কনস্ট্রাক্টরকে একবার ডাকা হবে। হুকগুলির সাথে দেখে মনে হচ্ছে যে প্রতিটিবার ফাংশন কলের ক্ষেত্রে ব্যবহারের স্টেট বলা হয় এবং প্রতিবার এটি রাষ্ট্রের সূচনা করা উচিত তবে কিছু অব্যক্ত "যাদু" সেখানে ঘটে।
প্রাণবন্ত

সম্ভবত এই পোস্টটি এতে কিছুটা আলোকপাত করেছে স্ট্যাকওভারফ্লো.com
শুভম খাত্রি

যদি প্রপসগুলিকে রাজ্যে মার্জ করতে হয় তবে
ক্রিয়েট

4
এটি দু'বার প্রারম্ভিক রাষ্ট্রটি সেট আপ করে যা বেশ বিরক্তিকর। আমি অবাক হয়েছি আপনি যদি প্রাথমিক অবস্থাটি বাতিল করতে পারেন এবং তারপরে React.useEffectপ্রতিটি সময়ে প্রাথমিক অবস্থা সেট করতে ব্যবহার করতে পারেন ।
সিএমসিডিগ্রাগনকাই

4
যদি রাজ্য রেন্ডারিং নিয়ন্ত্রণ করে তবে এটি কাজ করে না। আমার একটি কার্যকরী উপাদান রয়েছে যা প্রপসের উপর ভিত্তি করে রেন্ডার করে এবং রাজ্যের উপর ভিত্তি করে রেন্ডার করে। যদি রাষ্ট্রটি উপাদানটিকে রেন্ডার করতে বলে কারণ এটি পরিবর্তিত হয়, তবে ইউজএফেক্ট চালায় এবং রাষ্ট্রকে ডিফল্ট মানটিতে ফিরিয়ে দেয়। এটি তাদের পক্ষে সত্যই খারাপ নকশা।
গ্রেগ ভেরেস

1

কার্যকরী উপাদানগুলি যেখানে আমরা useStateআমাদের ভেরিয়েবলের জন্য প্রাথমিক মান সেট করতে ব্যবহার করি , যদি আমরা প্রপসের মাধ্যমে প্রাথমিক মানটি পাস করি, তবে আপনি useEffectহুক ব্যবহার না করা অবধি এটি সর্বদা একই প্রাথমিক মান সেট করবে ,

উদাহরণস্বরূপ আপনার ক্ষেত্রে এটি আপনার কাজ করবে

 React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

UseEffect এ পাস করা কার্যটি স্ক্রিনে রেন্ডার প্রতিশ্রুতিবদ্ধ হওয়ার পরে চলবে run

ডিফল্ট হিসাবে, প্রভাবগুলি প্রতিটি রেন্ডার পরে চালিত হয়, তবে আপনি নির্দিষ্ট মানগুলি পরিবর্তিত হলেই সেগুলি বরখাস্ত করতে পারেন।

React.useEffect(FunctionYouWantToRunAfterEveryRender)

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

React.useEffect(FunctionYouWantToRunAfterEveryRender, [props.user])

আপনি যখন লক্ষ্য করেছেন যে আমি পাস করছি [প্রপস.উজার] এখন useEffectকেবলমাত্র এই FunctionYouWantToRunAfterEveryRenderফাংশনটি props.userপরিবর্তন করবে যখন পরিবর্তন করা হবে

আমি আশা করি এটি আপনার বোধগম্যতায় কোনও উন্নতির জন্য ধন্যবাদ প্রয়োজন কিনা তা আমাকে জানাতে সহায়তা করে


0

প্রদত্ত প্যারামিটারটি React.useState()কেবলমাত্র সেই রাজ্যের প্রাথমিক মান। প্রতিক্রিয়া রাষ্ট্রটিকে পরিবর্তন হিসাবে স্বীকৃতি দেয় না , কেবল তার ডিফল্ট মান সেট করে। আপনি প্রথমে ডিফল্ট রাষ্ট্র সেট করতে চান এবং তারপরে শর্তসাপেক্ষে কল করুন setUser(newValue)যা একটি নতুন রাষ্ট্র হিসাবে স্বীকৃত হবে এবং উপাদানটিকে পুনরায় রেন্ডার করবে।

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


-2

হুকস সম্পর্কে রিঅ্যাক্টজেএস ডকুমেন্টেশন অনুসারে :

তবে কী ঘটবে যখন স্ক্রিনে থাকা উপাদানটির প্রপ পরিবর্তন হয়? আমাদের উপাদানটি অন্য কোনও বন্ধুর অনলাইন স্থিতি প্রদর্শন করা চালিয়ে যাবে। এটি একটি বাগ। আনসাবস্ক্রাইব করা কলটি যদি ভুল বন্ধু আইডি ব্যবহার করে তবে আনমাউন্ট করার সময় আমরা মেমরি ফাঁস বা ক্রাশও করতে পারি।

এখানে আপনার একমাত্র ইন্টারঅ্যাকশনটি প্রপস পরিবর্তনে ঘটতে হবে, যা কাজ করে না বলে মনে হচ্ছে। প্রপসটিতে কোনও আপডেট সক্রিয়ভাবে ধরতে আপনি (এখনও ডক অনুসারে) একটি উপাদান ডিডআপডেট (প্রপ্রপ্রপস) ব্যবহার করতে পারেন।

পিএস: আমার কাছে বিচার করার মতো পর্যাপ্ত কোড নেই, তবে আপনি কি আপনার অবতার (প্রসেস) ফাংশনটির ভিতরে সক্রিয়ভাবে ব্যবহারকারীর সেট করতে পারবেন না?


-12

প্রতিক্রিয়া বিশ্বে, আপনার ক্ষেত্রে এই জাতীয় উপাদানগুলিতে উইন্ড্রিলিভিউপ্রোপস (নেক্সটপ্রোপস) ফাংশনটিতে আপনার রাষ্ট্র আপডেট করা উচিত।


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