当前位置: 首页 > 知识库问答 >
问题:

在组件中使用axios WillMount方法给我带来了一个奇怪的错误

韩靖琪
2023-03-14

我想在react代码中使用axios从服务器获取数据。我将axios代码放入react组件的组件willmount中,如下所示。


componentWillMount()
    {   
        axios
        .get("https://jsonplaceholder.typicode.com/Posts")
        .then(function(response) {
            this.setState({Posts : response.data[0].title});
        })
        .catch(function(error) {
            console.log(error);
        });
    }

但上面的代码给我带来了这样的错误


TypeError: "this is undefined"
    componentWillMount Redux

但当我对代码做了一些细微的修改,比如下面的代码时,一切都正常了。


componentWillMount()
    {   
        axios
        .get("https://jsonplaceholder.typicode.com/Posts")
        .then(response= > {
            this.setState({Posts : response.data[0].title});
        })
        .catch(error => {
            console.log(error);
        });
    }

我想说的另一件事是“this”对象在componentWillMount中是活动的

有人告诉我上面两种代码的区别吗?

共有3个答案

屈晨
2023-03-14
匿名用户

您需要使用箭头函数来使用此

当您使用函数()时,不能使用setState访问<代码>此将返回未定义,因为其范围不指向您创建的对象。因此,您应该使用下面的代码,

工作代码:

componentDidMount()
    {   
        axios
        .get("https://jsonplaceholder.typicode.com/Posts")
        .then(() => {
            this.setState({Posts : response.data[0].title}); // `this` object points to your object here because of the arrow function.
        })
        .catch(() => { // Same case here
            console.log(error);
        });
    }

此外,Junius对componentDidMount的看法是正确的。

调用以获取数据的最佳位置是在componentDidMount()中。componentDidMount()只在客户端调用一次,而componentWillMount()只在服务器上调用一次,在客户端调用一次。更多信息

百里诚
2023-03-14

如果使用函数(响应){…}语法,不是继承的,将是未定义的。您需要将显式绑定到React组件,以便它知道如何查找此。setState

componentWillMount()
{   
    axios
    .get("https://jsonplaceholder.typicode.com/Posts")
    .then(function(response) {
        this.setState({Posts : response.data[0].title});
    }.bind(this))  // <-- notice the .bind(this)
    .catch(function(error) {
        console.log(error);
    });
}

响应=

林绪
2023-03-14

MDN说:

箭头函数[...]是正则函数表达式的替代方法,尽管它没有自己对“this”的绑定。

如果使用常规函数,this指的是函数本身(这是未定义的)。当使用箭头函数时,this保持不变。

 类似资料:
  • 因此,我对Python类是新手,但对一般类不是新手。我想在我创建的对象中生成一个新的数字,并不断地改变它。

  • 问题内容: 我正在尝试在节点中使用Express,安装一切正常,进行编译,获取npm并通过以下方式安装express: npm安装快递 问题是,每次我尝试“要求”它时,都会给我一个错误!看一下一个简单的文件app.js: 当我运行它时: 有人能帮我吗?为什么会出现此错误?如何安装与Express不同的版本? 问题答案: 问题是,你可能有最新的连接(而不是“您需要安装最新的连接”)的命令@Shrip

  • 问题内容: 这段代码: 调用此方法: 给我一个ClassCastException->跟踪的一部分: 这很奇怪,因为,实际上,如果您查找Hibernate的源代码,它将尝试执行以下操作: 这没有任何意义… 目标的类型为Class,此代码尝试将其强制转换为Map, 为什么要尝试这样做??? 任何指针都值得欢迎… 我正在使用Hibernate 5(并且正在从3升级)… 编辑:我也使用Spring(4.

  • 我建立了一个twitter开发帐户,并已经用它创建了一个小应用程序。今天我尝试使用cURL和Twitters oAuth签名结果页面(它为您生成cURL命令)。 我正在尝试运行以下GET 当我将其粘贴到Twitter以将其转换为我得到的cURL命令时 卷曲--获取'https://api.twitter.com/1.1/statuses/home_timeline.json“--header”授权

  • 我在Digitalocean上安装了一个VPS服务器。安装了Ubuntu 18.04、LAMP等。最后,我安装了ffmpeg。它在终端上运行良好,但当我尝试通过php执行它时,会出现一个奇怪的“权限被拒绝”错误: 以下是一些信息: root@vl:/#何去何从ffmpeg ffmpeg: /usr/local/bin/ffmpeg root@vl:/#何去何从ff探针: /usr/local/bi

  • 我试图在Redis上执行Spring中的函数。这让我犯了个错误。我已经成功实现了函数,但在实现时,它要求我将集合作为第二个参数。我不知道该进什么?有人能带我来吗。 这是我的multiGet()代码 方法定义: 控制器中的代码: 上面的Multiget方法的错误是 下面是Get函数的代码。 控制器中Get函数的代码: