এই.সেটস্টেটটি একাধিকবার রিঅ্যাক্ট উপাদানটিতে ব্যবহার করার পরে কী ঘটে?


105

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

একটি জেএসফিডেলের লিঙ্ক

var Hello = React.createClass({
  render: function() {
    return (
      <div>
        <div>Hello {this.props.name}</div>
        <CheckBox />
      </div>
    );
  }
});

var CheckBox = React.createClass({
  getInitialState: function() {
    return {
      alex: 0
    };
  },

  handleChange: function(event) {
    this.setState({
      value: event.target.value
    });
    this.setState({
      alex: 5
    });
  },

  render: function() {
    alert('render');
    return (
      <div>
        <label htmlFor="alex">Alex</label>
        <input type="checkbox" onChange={this.handleChange} name="alex" />
        <div>{this.state.alex}</div>
      </div>
    );
  }
});

ReactDOM.render(
  <Hello name="World" />,
  document.getElementById('container')
);

আপনি দেখতে পাবেন, 'রেন্ডার' বলছে এমন একটি সতর্কতা প্রতিটি রেন্ডারে পপ আপ হয়।

কেন এটি সঠিকভাবে কাজ করেছে তার জন্য আপনার কাছে কোনও ব্যাখ্যা আছে?


4
প্রতিক্রিয়াটি বেশ চালাক এবং কেবল তখনই রেন্ডার হবে যখন রেন্ডার করার জন্য প্রয়োজনীয় রাষ্ট্রটি পরিবর্তন করা হবে। আপনার রেন্ডার পদ্ধতিতে আপনি কেবল ব্যবহার করছেন this.state.alex- আপনি যদি নির্ভর করে এমন কোনও উপাদান যুক্ত করেন তবে কী ঘটবে this.state.value?
মার্টিন ওয়েডভিচ

4
@ মার্টিন ওয়েডভিচ এই বিষয়টির উপর নির্ভরশীল যদি আমি এর উপর নির্ভর করি। এর জন্য আপনার 'getInitialState' পদ্ধতি রয়েছে - ডিফল্ট মানগুলি সেট করতে যাতে আপনার অ্যাপ্লিকেশনটি ভেঙে না যায়।
আলেকান্দার

4
এর সাথে সম্পর্কিত, এবং দরকারী: stackoverflow.com/questions/48563650/...
andydavies

উত্তর:


120

ইভেন্ট হ্যান্ডলার এবং জীবনচক্র পদ্ধতিতে ঘটে এমন ব্যাচের স্টেট আপডেটগুলি প্রতিক্রিয়া জানায়। সুতরাং, আপনি যদি কোনও <div onClick />হ্যান্ডলারের একাধিক বার স্থিতি আপডেট করেন তবে প্রতিক্রিয়া পুনরায় রেন্ডারিংয়ের আগে ইভেন্ট হ্যান্ডলিংয়ের সমাপ্ত হওয়ার জন্য অপেক্ষা করবে।

পরিষ্কার হয়ে উঠতে, এটি কেবল বিক্রিয়া-নিয়ন্ত্রিত সিন্থেটিক ইভেন্ট হ্যান্ডলার এবং লাইফাইসাইকেল পদ্ধতিতে কাজ করে। রাষ্ট্রীয় আপডেটগুলি এজেএক্স এবং setTimeoutইভেন্ট হ্যান্ডলারগুলিতে ব্যাচ করা হয় না , উদাহরণস্বরূপ।


4
ধন্যবাদ, এটি বোধগম্য হয়, কোনও ধারণা কীভাবে এটি পর্দার আড়ালে করা হয়?
আলেকান্দার

15
যেহেতু প্রতিক্রিয়া সিন্থেটিক ইভেন্ট হ্যান্ডলারগুলি (যেমন <div onClick />) এবং উপাদানগুলি লাইফাইসাইক্যাল পদ্ধতিগুলিকে পুরোপুরি নিয়ন্ত্রণ করে, তাই এটি জানে যে এটি নিরাপদে setStateকলটির ব্যাচ স্টেট আপডেটের সময়কাল এবং আচরণের জন্য অপেক্ষা করতে পারে। setTimeoutবিপরীতে একটি এজেএক্স বা হ্যান্ডলারে, প্রতিক্রিয়াটির কোনও হ্যান্ডলারের কখন কার্য সম্পাদন শেষ হয়েছে তা জানার কোনও উপায় নেই। প্রযুক্তিগতভাবে, প্রতিক্রিয়া উভয় ক্ষেত্রেই আপডেট আপডেট করে, তবে প্রতিক্রিয়া-নিয়ন্ত্রিত হ্যান্ডলারের বাইরে অবিলম্বে ফ্লাশ হয়।
ক্রিস গৌদ্রিউ

4
@ নিউরোসন্যাপ আমার মনে হয় না যে ডক্সগুলি এ সম্পর্কে আরও বিস্তারিতভাবে চলে। এটি রাজ্য এবং জীবনচক্র বিভাগ এবং সেটস্টেট ডক্সে বিমূর্তভাবে উল্লেখ করা হয়েছে । ReactDefaultBatchingStrategy এর কোডটি দেখুন , যা বর্তমানে একমাত্র অফিসিয়াল ব্যাচিং কৌশল।
ক্রিস গৌদ্রিউ

4
@ বেনজামিনটাইগ আমি বিশ্বাস করি আপনি প্রতিক্রিয়া ইভেন্ট হ্যান্ডলারের বাইরে ReactDOM.unstable_batchedUpdates(function)ব্যাচ ব্যবহার করতে পারেন setState। নামটি থেকে বোঝা যায়, আপনি আপনার ওয়্যারেন্টি বাতিল করবেন।
ক্রিস গৌদ্রিউ

4
এই লোকটির কাছে সর্বদা ভাল বলুন টুইটার.
com

37

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

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি কেবলমাত্র 4 বার বলা হলেও রাষ্ট্রীয় মান বৈশিষ্ট্যটিকে 1 দ্বারা বাড়িয়ে তুলবে:

 class Counter extends React.Component{
   constructor(props){
     super(props)
    //initial state set up
     this.state = {value:0}
   }
   componentDidMount(){
    //updating state
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
    this.setState({value:this.state.value+1})
   }
   render(){
    return <div>Message:{this.state.value}</div>
   }
}

কোনও রাষ্ট্র আপডেট হওয়ার পরে এটি ব্যবহার করার জন্য, কলব্যাক আর্গুমেন্টে সমস্ত যুক্তি করুন:

//this.state.count is originally 0
this.setState({count:42}, () => {
  console.log(this.state.count)
//outputs 42
})

সেটস্টেট (আপডেটেটর, [কলব্যাক]) পদ্ধতিটি পূর্ববর্তী রাষ্ট্র এবং বৈশিষ্ট্যের উপর ভিত্তি করে রাষ্ট্র আপডেট করার প্রথম যুক্তি হিসাবে একটি আপডেটেটর ফাংশন নিতে পারে। আপডেটেটর ফাংশনের রিটার্ন মানটি পূর্ববর্তী উপাদান রাষ্ট্রের সাথে অগভীরভাবে একত্রিত হবে। পদ্ধতিটি অযৌক্তিকভাবে রাজ্যকে আপডেট করে, সুতরাং একটি বিকল্প কলব্যাক রয়েছে যা একবার রাষ্ট্রের সম্পূর্ণ আপডেট শেষ হয়ে গেলে বলা হবে।

উদাহরণ:

this.setState((prevState, props) => { 
return {attribute:"value"}
})

পূর্ববর্তী রাজ্যের উপর ভিত্তি করে কীভাবে রাষ্ট্র আপডেট করতে হবে তার একটি উদাহরণ এখানে রয়েছে:

    class Counter extends React.Component{
      constructor(props) {
        super(props)
    //initial state set up
        this.state = {message:"initial message"}
    }
      componentDidMount() {
    //updating state
        this.setState((prevState, props) => {
          return {message: prevState.message + '!'}
        })
     }
     render(){
       return <div>Message:{this.state.message}</div>
     }
  }

আহ, আমি setState(updater,[callback])এটি সম্পর্কে জানতাম না , এটি এর Object.assignজন্য একটি কম ভারবস ধন্যবাদ মত !
এজে ভেন্টুরেেলা

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