اذهب إلى المحتوى
  • 0

دالة setTimeout لا تعمل في مكون React؟

Adam Ebrahim

السؤال

لدي مكون React التالي:

Class Counter extends React.Component({
    getInitialState() {
        return {count: 0};    
    }

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

    render() {
         return (
            <div className="count-wrapper">
                {this.state.count}
            </div>
         ); 
    }
});

ReactDOM.render(<Counter />, document.getElementById('app'));

من المفترض أن تتغير حالة المكون بعد 3 ثوانٍ، لكنها تتغير بمجرد ظهور المكون في الصفحة، أي أن الدالة يتم تنفيضها بشكل مباشر وليس بعد 3 ثوانٍ، ما الخطأ الذي أقوم به هنا؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

هماك خطأ بسيط في الكود وهو المجال ل this في ال setTimeout حيث سوف تعود ال this للكائن window وليس ال component ولذلك يمكننا حل هذه المشكلة عن طريق 

  • عمل binding عن طريق توليد دالة جديدة بمجال scope محدد 
    setTimeout(function(){this.setState({count: 1})}.bind(this), 3000);

     

  • أو يمكنك استخدام ال arrow function كالتالي

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

     

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

ال setTimeout عبارة عن امر نمرر اليه امر اخر فعندما تقوم بتمرير this.setState فان this. سوف تشير الى النافذة لان الامر  تابع للنافذه و this سوف تشير الى الجزء او الobject  الذي ينتمي اليه الامر لذلك يمكنك ببساطة خلق متغير اخر يحمل المؤشر الي ال component  المراد العمل عليه و من ثم استخدامه مره اخرى ادخل ال setTimeout كالتالي 

 

Class Counter extends React.Component({
    getInitialState() {
        return {count: 0};    
    }

    componentDidMount() {
		var that = this;           # نضيف هنا مؤشر الcomponent  المراد اضافة الامر عليه 
        setTimeout(that.setState({count: 1}), 3000);
    }

    render() {
         return (
            <div className="count-wrapper">
                {this.state.count}
            </div>
         ); 
    }
});

ReactDOM.render(<Counter />, document.getElementById('app'));

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...