বিক্রিয়া জেএস: সেটটাইমআউট () কাজ করছে না?


104

এই কোডটি মাথায় রেখে:

var Component = React.createClass({

    getInitialState: function () {
        return {position: 0};    
    },

    componentDidMount: function () {
        setTimeout(this.setState({position: 1}), 3000);
    },

    render: function () {
         return (
            <div className="component">
                {this.state.position}
            </div>
         ); 
    }

});

ReactDOM.render(
    <Component />,
    document.getElementById('main')
);

রাষ্ট্রটি কি কেবল 3 সেকেন্ড পরে পরিবর্তিত হওয়ার কথা নয়? এটি অবিলম্বে পরিবর্তন হচ্ছে।

এখানে আমার মূল লক্ষ্যটি প্রতি 3 সেকেন্ডে (রাষ্ট্রীয় setInterval()) পরিবর্তন করা, তবে যেহেতু এটি কাজ করছে না, তাই চেষ্টা করেছি setTimeout(), যা কাজ করছে না। এই কোন বাতি? ধন্যবাদ!


4
আপনি যদি foo(bar())তারপর barহয় প্রথম মৃত্যুদন্ড কার্যকর এবং তার ফেরত মান প্রেরণ করা foo
ফেলিক্স ক্লিং

@ ফেলিক্সক্লিং যা সঠিক বলে মনে হচ্ছে, তবে এটি উপযুক্ত নয়। যেহেতু foo()এখানে হ'ল barপছন্দসই সময়সীমার পরে কার্যকর করা। বা আমি কি পুরোপুরি ভুল এবং এটি অবিলম্বে কার্যকর করা হয়, এবং কেবলমাত্র পছন্দসই সময়ের পরে মূল্য ফেরত দেয়?
জবারদাস

4
"যেহেতু এখানে foo () হ'ল পছন্দসই সময়সীমার পরে বারটি কার্যকর করতে পারে।" ঠিক আছে, এজন্য আপনাকে পাস করতে হবে bar, এটিকে কল করতে হবে না এবং তার ফেরতের মানটি পাস করতে হবে না। আপনি কি আচরণের foo(bar())পরিবর্তনের প্রত্যাশা করেছিলেন , fooযা করছে তা নির্ভর করে? এটা সত্যিই অদ্ভুত হবে।
ফেলিক্স ক্লিং

উত্তর:


246

কর

setTimeout(
    function() {
        this.setState({ position: 1 });
    }
    .bind(this),
    3000
);

অন্যথায়, আপনি ফলাফল পাস setStateকরছেন setTimeout

আপনি thisকীওয়ার্ডের ব্যবহার এড়াতে ES6 তীর ফাংশনগুলিও ব্যবহার করতে পারেন :

setTimeout(
  () => this.setState({ position: 1 }), 
  3000
);

4
হ্যাঁ বোঝা যায় এবং এটি কাজ করে। তবে ফাংশন () কোনও ফাংশন নয়? তাহলে আমাদের কেন এটি বাঁধতে হবে? আমি ইতিমধ্যে চেষ্টা করেছি এবং এটি সত্যই দরকার, কেন আমি তা জানতে চেয়েছিলাম। আপনার সহায়তার জন্য প্রশংসা করুন :)
jbarradas

আমি পাচ্ছি না কেন আপনি বলছেন যে ফলাফলটি সেটটাইমআউটে চলে যাবে, কীভাবে এটি এই কাজ করে না? এক্ষেত্রে কী আচরণ?
PositiveGuy

16
আপনারা যারা ES6 তীর ফাংশন ব্যবহার করতে পছন্দ করেন তাদের জন্য: setTimeout(() => {this.setState({ position: 1 })}, 3000)@ পজিটিভগুই নিশ্চিত হন না যে আপনি এই প্রশ্নটি পোস্ট হওয়ার পর থেকে আপনি নিজেই এটি নিয়ে গবেষণা করেছেন কিনা, তবে আপনি যদি না করেন: ড্যানিয়েলের মূল উদাহরণটি প্রসঙ্গে .bind(this)সীমাবদ্ধ thisকরা দরকার setState- অন্যথায় , thisস্বয়ংক্রিয়ভাবে সেই প্রসঙ্গে functionপ্রেরণ করা হবে যেখানে এটি আহ্বান করা হয়েছে (এই ক্ষেত্রে, বেনামে প্রেরণ করা হচ্ছে setTimeout)। ES6 তীর ফাংশনগুলি যাইহোক, বর্ণিতভাবে স্কোপ করা হয় - তারা thisসেই প্রসঙ্গে সীমাবদ্ধ করে যেখানে তারা ডাকা হয়।
জ্যাক কলিয়ার

4
কাজ করে না ... সেটটাইমআউট (() => {যদি (! This.prop.logoIsLoading &&! This.prop.isLoading) so কনসোল.লগ ('আমরা কি ঘটবো?'); This.setState ({.. .this.state, shouldUpdate: false, itemToUpdate: নাল, ModalIsOpen: মিথ্যা, মডেল টাইটেল: 'নতুন সংস্থা যুক্ত করুন'});}}, 100); এটি শ্রেণীর সিনট্যাকটিকাল সুগার শ্রেণির সংস্থার পরিপ্রেক্ষিতে সংস্থাগুলিকে প্রসারিত করে {কনসোল.লগ কখনই কনসোল.লগ পায় না ('আমরা কি করব?'); এটির আগে এবং এটি লগ হওয়ার পরে সমস্ত কিছু।
জাস্টলিঙ্কেক

@ জসলিনটেক কাজ করে না প্রয়োজনে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
ড্যানিয়েল এ। হোয়াইট

151
setTimeout(() => {
  this.setState({ position: 1 });
}, 3000);

উপরেরগুলিও কাজ করবে কারণ ES6 তীর ফাংশনটি প্রসঙ্গে পরিবর্তন করে না this


4
প্রতিক্রিয়া সেরা অনুশীলনের জন্য ES6 বাক্য গঠনটি গ্রহণযোগ্য উত্তর হওয়া উচিত। উভয়ই কাজ করবে, তবে এটি আরও মার্জিত এবং হ্যান্ডলগুলি this
এমসিসিএ্যামব্রিজ ১৩ ই

24

যে কোনও সময় আমরা একটি টাইমআউট তৈরি করি আমাদের ইলেক্ট্রন উইলউনমাউন্টে এটি সাফ করা উচিত, যদি এটি এখনও চালিত না হয়।

      let myVar;
         const Component = React.createClass({

            getInitialState: function () {
                return {position: 0};    
            },

            componentDidMount: function () {
                 myVar = setTimeout(()=> this.setState({position: 1}), 3000)
            },

            componentWillUnmount: () => {
              clearTimeout(myVar);
             };
            render: function () {
                 return (
                    <div className="component">
                        {this.state.position}
                    </div>
                 ); 
            }

        });

ReactDOM.render(
    <Component />,
    document.getElementById('main')
);

12

আমি জানি এটি কিছুটা পুরানো, তবে লক্ষ্য করা গুরুত্বপূর্ণ যে উপাদানটি আনমাট করার সময় প্রতিক্রিয়া অন্তর সাফ করতে পুনরুদ্ধার করে: https://reactjs.org/docs/state-and-lifecycle.html

সুতরাং আমি এই আলোচনায় এই উত্তরটি যুক্ত করতে চাই:

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }
  componentWillUnmount() {
    clearInterval(this.timerID);
  }

8

setStateপ্রথম বন্ধনী কারণে তত্ক্ষণাত আহ্বান করা হচ্ছে! এটি একটি বেনামে ফাংশনে মুড়িয়ে রাখুন, তারপরে এটিকে কল করুন:

setTimeout(function() {
    this.setState({position: 1})
}.bind(this), 3000);

6

কাকে সেটটাইমআউট বলেছে তা আপনি জানাননি

এখানে আপনি কীভাবে অতিরিক্ত ফাংশনগুলি কল না করে টাইমআউট কল করবেন।

1. আপনি অতিরিক্ত ফাংশন না করে এটি করতে পারেন।

setTimeout(this.setState.bind(this, {position:1}), 3000);

ফাংশন.প্রোটোটাইপ.বাইন্ড () ব্যবহার করে

সেটটাইমআউট ফাংশনটির অবস্থান নেয় এবং এটি প্রসঙ্গে রাখে।

২. আরও কম কোড লিখেও একই কাজ করার আরেকটি উপায়।

setTimeout(this.setState, 3000, {position:1});

সম্ভবত কোনও সময়ে একই বাঁধাই পদ্ধতিটি ব্যবহার করে

সেটটাইমআউটটি কেবল ফাংশনের অবস্থান নেয় এবং ফাংশনে ইতিমধ্যে প্রসঙ্গটি রয়েছে? যাইহোক, এটি কাজ করে!

দ্রষ্টব্য: আপনি js তে ব্যবহার করেন এমন কোনও ফাংশন নিয়ে এই কাজ করে।


5

আপনার কোড স্কোপ ( this)window আপনার প্রতিক্রিয়া উপাদান নয়, বরং আপনার অবজেক্ট হবে এবং সে কারণেই setTimeout(this.setState({position: 1}), 3000)এইভাবে ক্রাশ হবে।

এটি জাভাস্ক্রিপ্ট থেকে আসে প্রতিক্রিয়া নয়, এটি জেএস বন্ধ


সুতরাং, আপনার বর্তমান প্রতিক্রিয়া উপাদান অংশটি বাঁধতে, এটি করুন:

setTimeout(function(){this.setState({position: 1})}.bind(this), 3000);

অথবা যদি আপনার ব্রাউজারটি এস 6 সমর্থন করে বা আপনার প্রজদের এস 6 এএস 5 সংকলন করার জন্য সমর্থন রয়েছে, তীর ফাংশনটিও চেষ্টা করে দেখুন, তীর ফানক 'এই' সমস্যাটি সমাধান করার জন্য:

setTimeout(()=>this.setState({position: 1}), 3000);

3

'সেটটাইমআউট' ফাংশনের ভিতরে স্কোপটি অ্যাক্সেস করার 3 টি উপায় রয়েছে

প্রথম,

const self = this
setTimeout(function() {
  self.setState({position:1})
}, 3000)

দ্বিতীয়টি হচ্ছে ES6 তীর ফাংশনটি ব্যবহার করা, কারণ তীর ফাংশনটির নিজস্ব সুযোগ নেই (এটি)

setTimeout(()=> {
   this.setState({position:1})
}, 3000)

তৃতীয়টি হ'ল ফাংশনের অভ্যন্তরের সুযোগটি আবদ্ধ করা

setTimeout(function(){
   this.setState({position:1})
}.bind(this), 3000)

1

আপনি সিনট্যাক্স ঘোষণার ত্রুটি করেছেন, সঠিক সেটটাইমআউট ঘোষণাটি ব্যবহার করুন

message:() => { 
  setTimeout(() => {this.setState({opened:false})},3000); 
  return 'Thanks for your time, have a nice day 😊! 
}

0

সেট টাইমআউট এর ES6 সিনট্যাক্স ব্যবহার করার চেষ্টা করুন। সাধারণ জাভাস্ক্রিপ্ট সেটটাইমআউট () জ্যাক্সে প্রতিক্রিয়া দেখায় না

setTimeout(
      () => this.setState({ position: 100 }), 
      5000
    );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.