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

السؤال

نشر

عند تشغيل هذا المكون أحصل على الخطأ التالي:

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 لازالت المشكلة موجودة.

Recommended Posts

  • 0
نشر

السطر الذي أضفته ليس الطريقة الصحيحة بل هذه:

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.

  • 0
نشر

الكود الخاص بك (.لا يوجد به أخطاء ويعمل بطريقة صحيحة ) وذلك لأنك تستخدم ال arrow function والتي تعمل bind تلقائي للكلاس ولن تحتاج عمل bind في ال constructor ولذلك يجب عليك إزالة السطر الموجود في ال constructor 
أما إذا لم تكن تستخدم ال arrow function فيجب أن تعمل constructor bind بهذه الطريقة 
 

this.increaseCounter = this.increaseCounter.bind(this);

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...