0

我第一次在 react-native 中使用类,但由于某种原因我无法更改状态。我检查了它是否是 API,但 API 工作正常。引导程序和其他一切都可以正常工作,但由于this.setState({ name: response.data.name });某种原因无法正常工作。有人知道我做错了什么吗?

import React from "react";
import { StyleSheet, View, Text, AsyncStorage, Button } from "react-native";
import axios from "axios";

export default class Dashboard extends React.Component {
  constructor() {
    super();
    this.state = {
      token: "",
      response: [],
      supported: true,
      displayName: "",
      id: 0,
      name: "",
      phone: 0,
      website: ""
    };
    this._bootstrap();
  }

  _bootstrap = async () => {
    const token = await AsyncStorage.getItem("accessToken");
    this.setState({ token: token });
  };

  changeName = async function() {
    try {
      response = await axios.get("general/organization/own/default");
      this.setState({ name: response.data.name });
      return;
    } catch (error) {
      console.log(error);
      return;
    }
  };

  render() {
    return (
      <View style={styles.container}>
        <Text>name: {this.state.name}</Text>
        <Button title="change name" onPress={this.changeName} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center"
  }
});

错误:this.setState 不是函数。(In 'this.setState({name: response.data.name})', 'this.setState' is undefined)

4

3 回答 3

1

为了能够this在函数内部使用,您需要将其绑定到类。所以你必须解决这个问题的几种方法是:

创建箭头函数

changeName = async () => {
  try {
    let { data: { name } } = await axios.get(url);
    this.setState({ name });
  } catch (err) {
    console.log(err);
  }
};

在构造函数上绑定函数

constructor(props) {
  this.state: {},
  changeName: this.changeName.bind(this),
}

将其绑定在<Button/>

<Button title="change name" onPress={this.changeName.bind(this)} />
于 2019-12-16T19:14:28.283 回答
0

没关系setState。使用普通的类方法就可以了:

  async changeName() {
    try {
      response = await axios.get("general/organization/own/default");
      this.setState({ name: response.data.name });
      return;
    } catch (error) {
      console.log(error);
      return;
    }
  };

多写一点...

实际上,changeName在您的代码中是类属性,而不是类方法。我们可以使用 es5 语法转换这些代码(忽略 async 和其他一些不必要的代码):

function Dashboard() {
  ....
  defineProperty(this, 'changeName', async function() {
     // "this" here doesn't point to Dashboard context
     this.setState({ .... })
  })
}
于 2019-12-16T15:43:37.387 回答
0

您需要将函数绑定到this。所以更改以下行:

<Button title="change name" onPress={this.changeName} />

到以下:

<Button title="change name" onPress={this.changeName.bind(this)} />
于 2019-12-16T16:33:02.417 回答