当前位置: 首页 > 面试题库 >

如何在回调中执行setState:ReactJS

丰俊艾
2023-03-14
问题内容

以下是我用来设置状态的代码。

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();
};

即使成功创建了数据库,也无法调用this.state,因为它始终是未定义的。

我试过了:

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();
};

但是它仍然失败,尝试使用a = this和使用a.setState,仍然没有运气。

我该如何解决?


问题答案:

您需要将正确的this(类上下文)与回调方法绑定在一起,然后只有您才能访问类的属性和方法。

可能的解决方案:

1- 使用 箭头功能 ,如下所示:

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

2-.bind(this)与一起使用callback method,如下所示:

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

您使用的方式也将起作用,保存方法this内部的引用handleAddNewQuiz,如下所示:

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();
};


 类似资料:
  • 问题内容: 我使用$ .ajax()每5秒轮询一次操作方法,如下所示: 和ActionResult动作: 为了使用RedirectToAction,我不得不将操作返回类型更改为ActionResult(最初是JsonResult,而我正在返回),但是从$ .ajax()成功回调中重定向和呈现新的View看起来很麻烦。我需要从此轮询ajax回发中重定向到“ AnotherAction”。Firebu

  • 问题内容: 许多Cocoa和CocoaTouch方法都将完成回调实现为Objective- C中的块,而实现为Swift中的Closures。但是,在Playground中尝试这些操作时,永远不会调用完成操作。例如: 我可以在Playground时间轴中看到控制台输出,但是在我的完成块中从未调用过… 问题答案: true`。如果设置了此属性,则在您的顶级游乐场源完成时,我们将继续旋转主运行循环,而

  • 在以下代码中,设置状态后,setState方法的回调不会像预期的那样执行。如果你检查控制台,你会明白我的意思。console.log读取的状态不是更新的状态。它总是前一个(你可以通过点击读取数组按钮来检查这个),但是根据反应文档: setState()的第二个参数是一个可选的回调函数,它将在setState完成并重新呈现组件后执行。通常,我们建议对此类逻辑使用componentDidUpdate(

  • 我有一个< code>Observable链(RxJava 1),我想在Observable完成它的工作时(就在它发出某个东西之前),但在调用任何订户回调之前(我想更新某个< code>AtomicBoolean值,并让所有订户都看到新值),执行一些一次性操作。 以线程安全的方式执行此操作的最佳选择是什么? 我检查了 ,,,但似乎没有关于顺序的保证:我放了一些日志,有时在任何这些方法之前执行第一个

  • 我正在使用boto3访问AWS Dynamodb表并批量写入它,下面是示例代码: 是否可以使用BatchWriteItem对整个批执行回滚?(例如,在块中除外)。 谢谢

  • 问题内容: 在我的NodeJS代码中,我需要进行2或3个API调用,每个调用都会返回一些数据。在完成所有API调用之后,我想将所有数据收集到单个JSON对象中以发送到前端。 我知道如何使用API​​回调(下一个调用将在上一个调用的回调中发生)执行此操作,但这会很慢: 我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。 有没有一种