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

السؤال

نشر

لدي مكون 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...