constructor(props) {
super(props);
this.state = {
data: [],
}
}
componentWillMount() {
axios.get('url here', {
auth: {
username: ' ',
password: ' '
}
}).then(function(response) {
console.info(response.data.value)
this.setState({
data: response
})
}).catch(function(error) {
console.info(error)
})
}
render() {
return (
<div className = "App">
<header className = "App-header">
<img src = {logo} className = "App-logo" alt = "logo" />
<h1 className = "App-title">Welcome to React</h1>
</header>
<ul>
{ this.state.data.map(person => <li>{person.name}</li>)}
</ul>
</div>
);
}
}
Когда мой componentWillMount запускается, журнал консоли точно выводит то, что я хочу. Однако в моем setState написано Cannot read property 'setState' of undefined even though it's defined. Почему выдает эту ошибку, хотя data определен?





Это потому, что this внутри .then(function() {}) другой. Попробуйте, .then(function() {}.bind(this)) или передайте стрелочную функцию, например
axios.get('url here', {
auth: {
username: ' ',
password: ' '
}
}).then(response=>{
console.info(response.data.value)
this.setState({
data: response
})
}
).catch(error=>{
console.info(error)
})
Демо-код:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import axios from "axios";
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: []
};
}
componentDidMount() {
axios.get("https://jsonplaceholder.typicode.com/todos").then(
function(resp) {
console.info(resp);
this.setState({ data: resp.data });
}.bind(this)
);
}
render() {
return (
<ul>
{this.state.data.map(todo => <li key = {todo.id}>{todo.title}</li>)}
</ul>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);<script src = "https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id = "root"></div>
Не уверен, почему фрагменты SO выдают ошибку синтаксис. Фрагмент кода работает здесь.