开发者问题收集

React-无法读取未定义的属性“state”

2017-08-14
3315

尽管在使用 setState 时使用了粗箭头函数绑定 this 的上下文,但我仍不断收到此错误。有人可以帮忙吗?

export default class App extends Component {

constructor(props) {
    super(props);
    this.state = {
        query: '',
        items: [],
        repos: []
    };
}

search(term) {
    this.setState({
        query: term
    });
    const clientId = '12489b7d9ed4251ebbca';
    const secret = 'ff53ac9a93aaa9e7cddc0c009d6f068302866ff2';

    function fetchUser() {
        return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`);
    }

    function fetchRepos() {
        return axios.get(`https://api.github.com/users/${this.state.query}?client_id=${clientId}client_secret=${secret}`);
    }

    axios.all([fetchUser(), fetchRepos()])
        .then(axios.spread((items, repos) => {
            this.setState({
                items: items.data,
                repos: repos.data

            });
            console.log(state);
        }));

}
3个回答

从错误消息中可以清楚地看出 this 未定义。这可能是因为您在 search() 中使用它,而 search() 未绑定到组件,使得 this 完全没有意义。要解决此问题,请尝试在构造函数末尾添加此行:

        this.search = this.search.bind(this);

现在您应该能够在搜索函数中使用 this

MatTheWhale
2017-08-14

setState 不是同步的。如果您想在设置状态后使用状态值,则必须在对象之后在 setState 内提供回调。

我会这样做:

onSearch(term) {
  this.setState({ query: term }, () => {
    console.log(this.state.query);
    this.search();
  });
}

search() {
  // now you can be sure, that this.state.query is set and use it.. 

  // Use arrow functions, as they will reuse the parent scope.
  const fetchUser = () => {

  }
}
webdeb
2017-08-14

如果 fetchUser 出现错误,我认为您在 search 函数中正确使用了 this 。因此,您需要绑定 fetchUserfetchRepos

const fetchUser = () => {
        return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`);
    }

const fetchUser = function(){
        return axios.get(`https://api.github.com/users/${this.state.query}/repos?client_id=${clientId}client_secret=${secret}`);
    }.bind(this);

对于 fetchRepos 也一样。

Andrii Starusiev
2017-08-14