Adam Ebrahim نشر 22 مارس 2021 أرسل تقرير نشر 22 مارس 2021 عند تشغيل هذا المكون أحصل على الخطأ التالي: Uncaught TypeError: Cannot read property 'setState' of undefined وهذا هو مكون React: class Timer extends React.Component { constructor(props) { super(props); this.state = {count : 1}; // أضفت السطر التالي لكن المشكلة لم تحل this.increaseCounter.bind(this); } increaseCounter() { this.setState({ count : this.state.count + 1 }); } render() { return ( <div> <p>{this.state.count}</p> <button onClick={() => this.increaseCounter()}>Increase</button> </div> ); } } حتى بعد عمل binding لدالة increaseTimer لازالت المشكلة موجودة. اقتباس
0 أحمد حبنكة نشر 22 مارس 2021 أرسل تقرير نشر 22 مارس 2021 السطر الذي أضفته ليس الطريقة الصحيحة بل هذه: this.increaseCounter = this.increaseCounter.bind(this); الهدف اﻷصلي من التعليمة أن arrow function الممرر للـonClick لها قواعد خاصة من ناحية this هذه القواعد تمنع الوصول إلى Component instance وبدلاً من ذلك تكون this مساوية لـundefined. لكن بعد تنفيذ التعليمة السابقة أنت تجعل increaseCounter يأخذ الـthis دائماً من Component instance لهذا سمي التابع بـbind وهو للعلم تابع جافاسكريبت عادي ليس مخصوصاً بالـReactJS ، كل ما هنالك أن استعماله في React class components شائع جداً. بالطبع مع وجود react hooks يمكنك كتابة functional components وحينها لن تحتاج إلى عمل أي binding ﻷنه حينها لا يوجد class لتقوم بعمل this. 2 اقتباس
0 Mohammed Saber6 نشر 22 مارس 2021 أرسل تقرير نشر 22 مارس 2021 الكود الخاص بك (.لا يوجد به أخطاء ويعمل بطريقة صحيحة ) وذلك لأنك تستخدم ال arrow function والتي تعمل bind تلقائي للكلاس ولن تحتاج عمل bind في ال constructor ولذلك يجب عليك إزالة السطر الموجود في ال constructor أما إذا لم تكن تستخدم ال arrow function فيجب أن تعمل constructor bind بهذه الطريقة this.increaseCounter = this.increaseCounter.bind(this); 1 اقتباس
السؤال
Adam Ebrahim
عند تشغيل هذا المكون أحصل على الخطأ التالي:
Uncaught TypeError: Cannot read property 'setState' of undefined
وهذا هو مكون React:
حتى بعد عمل binding لدالة increaseTimer لازالت المشكلة موجودة.
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.