通过axios响应来反应设置状态

时间:2019-03-31 21:11:20

标签: javascript reactjs axios

我试图用axios POST调用返回的信息更新状态。我说TypeError: Cannot read property 'setState' of undefined时遇到错误。在我看来,this在API响应中不可用。

submitData= () => {
        axios.post("url", this.props.data)
        .then(function (result) {
            console.log(result,'success');
            this.setState({
                ...this.state,
                id: result.data.id
            })
          })
          .catch(function (err) {
            console.log(err, 'fail');
          });

    }

我可以控制台日志result.data.id,它是正确的ID。我正在所有客户端上执行此操作,并且我不想构建服务器或使用reducer。

4 个答案:

答案 0 :(得分:1)

在回调中使用箭头函数,如下所示:

submitData= () => {
        axios.post("url", this.props.data)
        .then((result) => {
            console.log(result,'success');
            this.setState({
                ...this.state,
                id: result.data.id
            })
          })
          .catch(function (err) {
            console.log(err, 'fail');
          });

    }

答案 1 :(得分:1)

您还可以使用async / await语法并将数据作为参数传递,以提高灵活性/可重用性。试试:

submitData = async (data) => {
    try {
        const result = await axios.post('url', data);
        console.log('Success', result);
        const { id } = result.data;
        this.setState({
            ...this.state,
            id,
        });
    } catch (err) {
        console.log('Failure', err);
    }
}

答案 2 :(得分:0)

尝试将.then设为绑定this的匿名函数。

submitData= () => {
    axios.post("url", this.props.data)
    .then((result) => {
        console.log(result,'success');
        this.setState({
            ...this.state,
            id: result.data.id
        })
      })
      .catch((err) => {
        console.log(err, 'fail');
      });
}

答案 3 :(得分:0)

在回调函数this中将是未定义的(这就是js中this的工作方式)。 如果您想轻松修复,只需使用箭头功能

submitData= () => {
        axios.post("url", this.props.data)
        .then(result => {
            console.log(result,'success');
            this.setState({
                ...this.state,
                id: result.data.id
            })
          })
          .catch(function (err) {
            console.log(err, 'fail');
          });
    }

详细了解this https://hackernoon.com/javascript-es6-arrow-functions-and-lexical-this-f2a3e2a5e8c4