为了账号安全,请及时绑定邮箱和手机立即绑定

我收到 this.setState is not a function inside

我收到 this.setState is not a function inside

largeQ 2023-09-21 14:12:33
我看过一些关于“this.setState 不是函数”问题的主题,但没有一个主题为我解决了这个问题。我使用了箭头函数或绑定“this”,但仍然收到错误。初步尝试如下。它使用嵌套的 setTimeout 函数(我可以解释为什么它会有所帮助),但问题是围绕 this.setState 的。在不研究“useEffect”Hook 的情况下,我可以检查下面的代码中是否缺少在 React 中设置状态的基本/基础内容吗?let delay = 5000;      var startTime = new Date().getTime();      let intervalTimerId = setTimeout(function request() {        // first apply a random number to a div        let randomNum = Math.floor(Math.random() * 6) + 1;        // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "test");        // then after a second, remove the class        setTimeout(() => {          // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "");          // after another second, set state to use later          setTimeout(() => {            this.setState({someState: "testing"});          }, 1000)        }, 1000)        // set new delay time        if (new Date().getTime() - startTime > 9000) {          delay = 3000;        }        console.log(new Date().getTime() - startTime)        intervalTimerId = setTimeout(request, delay);      }, delay);
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您可以尝试使用箭头功能


let delay = 5000;

var startTime = new Date().getTime();


const request = () => {

  // first apply a random number to a div

  let randomNum = Math.floor(Math.random() * 6) + 1;

  // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "test");


  // then after a second, remove the class

  setTimeout(() => {

    // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "");


    // after another second, set state to use later

    setTimeout(() => {

      this.setState({ someState: 'testing' });

    }, 1000);

  }, 1000);


  // set new delay time

  if (new Date().getTime() - startTime > 9000) {

    delay = 3000;

  }


  console.log(new Date().getTime() - startTime);


  intervalTimerId = setTimeout(request, delay);

};


let intervalTimerId = setTimeout(request, delay);


查看完整回答
反对 回复 2023-09-21
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以使用箭头函数显式绑定 this.bind(this)或简单地用箭头函数替换函数语法,因为this箭头函数内等于this声明该函数的外部:


let intervalTimerId = setTimeout(() => {

    ...

    setTimeout(() => {

       this.setState({someState: "testing"});

    }, 1000)

}, delay);


查看完整回答
反对 回复 2023-09-21
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以尝试使用绑定:

let intervalTimerId = setTimeout(function request() { ... }.bind(this)

假设您正在使用类组件并且this尚未损坏,不使用类组件的动机之一是:

除了使代码重用和代码组织变得更加困难之外,我们发现类可能成为学习 React 的一大障碍。您必须了解 JavaScript 中的工作方式,这与大多数语言中的工作方式非常不同。


查看完整回答
反对 回复 2023-09-21
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信