最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to use setState inside callback: ReactJS - Stack Overflow

programmeradmin0浏览0评论

Following is the code that I used to set the state.

handleAddNewQuiz(event){
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            this.setState( { quiz : value});  // ERROR: Cannot read property 'setState' of undefined
        }
    });
    event.preventDefault();
};

Even though the database is created successfully, I cannot call this.setState, as it's always undefined.

I tried:

self = this;

handleAddNewQuiz(event){
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            self.setState( { quiz : value});  // ERROR: self.setState is not a function
        }
    });
    event.preventDefault();
};

But it still fails, Also tried with a = this, and using a.setState, but still no luck.

How can I solve this?

Following is the code that I used to set the state.

handleAddNewQuiz(event){
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            this.setState( { quiz : value});  // ERROR: Cannot read property 'setState' of undefined
        }
    });
    event.preventDefault();
};

Even though the database is created successfully, I cannot call this.setState, as it's always undefined.

I tried:

self = this;

handleAddNewQuiz(event){
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            self.setState( { quiz : value});  // ERROR: self.setState is not a function
        }
    });
    event.preventDefault();
};

But it still fails, Also tried with a = this, and using a.setState, but still no luck.

How can I solve this?

Share Improve this question edited Oct 13, 2022 at 19:11 Satyam Saurabh 6682 gold badges8 silver badges21 bronze badges asked Apr 7, 2017 at 10:30 tonyweitonywei 7253 gold badges13 silver badges26 bronze badges 1
  • use ()=> {} instead using function(){}. – Ved Commented Apr 7, 2017 at 10:33
Add a comment  | 

2 Answers 2

Reset to default 20

You need to bind correct this (class context) with callback method, then only you will be able to access the class properties and methods.


Possible Solutions:

1- Use arrow function, like this:

 handleAddNewQuiz(event){
        this.quiz = new Quiz(this.db, this.newQuizName, (err, affected, value) => {
            if(!err){
                this.setState( { quiz : value}); 
            }
        });
        event.preventDefault();
    };

2- Or use .bind(this) with callback method, like this:

handleAddNewQuiz(event){
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            this.setState( { quiz : value});  
        }
    }.bind(this));
    event.preventDefault();
};

The way you are using will also work, save the reference of this inside the handleAddNewQuiz method, like this way:

handleAddNewQuiz(event){
    let self = this;    //here save the reference of this
    this.quiz = new Quiz(this.db, this.newQuizName, function(err, affected, value){
        if(!err){
            self.setState( { quiz : value});  
        }
    });
    event.preventDefault();
};

Mayank's answer is correct.. Alternatively you can use https://www.npmjs.com/package/core-decorators

and use the @autobind decorator before the function.

发布评论

评论列表(0)

  1. 暂无评论