Adam Ebrahim نشر 11 أبريل 2021 أرسل تقرير نشر 11 أبريل 2021 لدي مكون 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 ثوانٍ، ما الخطأ الذي أقوم به هنا؟ اقتباس
0 عبدالباسط ابراهيم نشر 11 أبريل 2021 أرسل تقرير نشر 11 أبريل 2021 هماك خطأ بسيط في الكود وهو المجال ل this في ال setTimeout حيث سوف تعود ال this للكائن window وليس ال component ولذلك يمكننا حل هذه المشكلة عن طريق عمل binding عن طريق توليد دالة جديدة بمجال scope محدد setTimeout(function(){this.setState({count: 1})}.bind(this), 3000); أو يمكنك استخدام ال arrow function كالتالي setTimeout(()=>this.setState({count: 1}), 3000); 1 اقتباس
0 Nuhla Almasri نشر 17 أبريل 2021 أرسل تقرير نشر 17 أبريل 2021 ال 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')); 1 اقتباس
السؤال
Adam Ebrahim
لدي مكون React التالي:
من المفترض أن تتغير حالة المكون بعد 3 ثوانٍ، لكنها تتغير بمجرد ظهور المكون في الصفحة، أي أن الدالة يتم تنفيضها بشكل مباشر وليس بعد 3 ثوانٍ، ما الخطأ الذي أقوم به هنا؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.