সন্তানের উপাদানগুলি পিতামাতার রাজ্য পরিবর্তনের পরে আপডেট হচ্ছে না এমন প্রতিক্রিয়া জানান


114

আমি বিভিন্ন শিশু উপাদানগুলিতে ডেটা পপুলেশন করার জন্য একটি দুর্দান্ত এপিওয়্যার্পার উপাদান তৈরি করার চেষ্টা করছি। আমি যা পড়েছি তার থেকে এই কাজ করা উচিত: https://jsfiddle.net/vinniejames/m1mesp6z/1/

class ApiWrapper extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      response: {
        "title": 'nothing fetched yet'
      }
    };
  }

  componentDidMount() {
    this._makeApiCall(this.props.endpoint);
  }

  _makeApiCall(endpoint) {
    fetch(endpoint).then(function(response) {
      this.setState({
        response: response
      });
    }.bind(this))
  }

  render() {
    return <Child data = {
      this.state.response
    }
    />;
  }
}

class Child extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: props.data
    };
  }

  render() {
    console.log(this.state.data, 'new data');
    return ( < span > {
      this.state.data.title
    } < /span>);
  };
}

var element = < ApiWrapper endpoint = "https://jsonplaceholder.typicode.com/posts/1" / > ;

ReactDOM.render(
  element,
  document.getElementById('container')
);

তবে কোনও কারণে, মনে হয় পিতামাতার রাজ্যের পরিবর্তন হলে সন্তানের উপাদানগুলি আপডেট হচ্ছে না।

আমি কি এখানে কিছু মিস করছি?

উত্তর:


209

আপনার কোড নিয়ে দুটি সমস্যা আছে।

আপনার সন্তানের উপাদানটির প্রাথমিক অবস্থা প্রপস থেকে সেট করা আছে।

this.state = {
  data: props.data
};

এই এসও থেকে উদ্ধৃতি দেওয়া উত্তর :

একটি উপাদান হিসাবে অন্তর্নিহিত অবস্থা অতিক্রম propকরা একটি অ্যান্টি-প্যাটার্ন কারণ getInitialState(আমাদের ক্ষেত্রে কনডাক্টর) পদ্ধতিটি কেবলমাত্র প্রথম বারটিকে রেন্ডার বলে। আর কখনও না। এর অর্থ হ'ল, যদি আপনি সেই উপাদানটিকে একটি হিসাবে আলাদা মানটি পাস করে পুনরায় রেন্ডার করেন propতবে উপাদানটি সেই অনুযায়ী প্রতিক্রিয়া জানাবে না, কারণ উপাদানটি প্রথম বার যখন রেন্ডার হয়েছিল তখন থেকে রাজ্যটিকে রক্ষা করবে। এটি খুব ত্রুটিযুক্ত

সুতরাং আপনি যদি এমন পরিস্থিতি এড়াতে না পারেন তবে আদর্শ সমাধানটি হ'ল componentWillReceivePropsনতুন প্রপস শোনার পদ্ধতিটি ব্যবহার করা ।

আপনার সন্তানের উপাদানগুলিতে নীচের কোডটি যুক্ত করা আপনার চাইল্ড উপাদান পুনরায় রেন্ডারিংয়ের সাথে আপনার সমস্যার সমাধান করবে।

componentWillReceiveProps(nextProps) {
  this.setState({ data: nextProps.data });  
}

দ্বিতীয় ইস্যুটি নিয়ে fetch

_makeApiCall(endpoint) {
  fetch(endpoint)
    .then((response) => response.json())   // ----> you missed this part
    .then((response) => this.setState({ response }));
}

এবং এখানে একটি কার্যক্ষম ফিডল: https://jsfiddle.net/o8b04mLy/


4
" প্রপসের ভিত্তিতে রাষ্ট্র সূচনা করা ঠিক আছে যদি আপনি জানেন যে আপনি কী করছেন" প্রপ এর মাধ্যমে রাষ্ট্র নির্ধারণের জন্য কি অন্য কোন উত্সাহ রয়েছে, এই সত্য ছাড়াও যে nextPropপুনরায় রেন্ডার দেবে না componentWillReceiveProps(nextProps)?
ভিনি জেমস

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

7
এখন থেকে যে কেউ পড়ছেন, তার জন্য static getDerivedStateFromProps(nextProps, prevState) reactjs.org/docs/… দেখুন
ছাগলওয়্যারহ্যাটস

4
কম্পোনেন্টবিলাইসিপপ্রসেস () এখন এটিকে অবমূল্যায়ন করা ছাড়া কি এর অন্য কোনও সমাধান আছে?
LearningMath

4
@LearningMath দয়া করে সর্বশেষতম প্রতিক্রিয়া ডক্স দেখুন যা বিকল্প পদ্ধতি সম্পর্কে কথা বলে। আপনার যুক্তিটি পুনর্বিবেচনা করতে হতে পারে।
ইয়াদু কিরণ

1

আপনার কিছু পরিবর্তন করতে হবে।

যখন fetchপ্রতিক্রিয়াটি পান, এটি কোনও জসন নয়। আমি কীভাবে এই জসন পেতে পারি তা সন্ধান করছিলাম এবং আমি এই লিঙ্কটি আবিষ্কার করেছি ।

অন্যদিকে, আপনাকে ভাবতে হবে যে constructorফাংশনটি কেবল একবার ডাকা হয়।

সুতরাং, আপনাকে <Child>উপাদানটির যে উপায়ে তথ্য পুনরুদ্ধার করবেন সেভাবে আপনার পরিবর্তন করতে হবে ।

এখানে, আমি একটি উদাহরণ কোড রেখেছি: https://jsfiddle.net/emq1ztqj/

আমি আশা করি এটি সাহায্য করবে.


ধন্যবাদ. যদিও আপনি যে উদাহরণটি তৈরি করেছেন তা দেখে এখনও মনে হয় শিশু কখনই আপডেট হয় না। শিশু কীভাবে ডেটা গ্রহণের উপায় পরিবর্তন করতে পারে সে সম্পর্কে কোনও পরামর্শ?
ভিনি জেমস

4
তুমি কি নিশ্চিত? আমি দেখছি যে <Child>উপাদানটি নতুন ডেটা পুনরুদ্ধার করে https://jsonplaceholder.typicode.com/posts/1এবং পুনরায় রেন্ডার করে।
slorenzo

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