Я получаю следующую ошибку
//bundle.js:31367 Uncaught TypeError: this.setState не является функцией //
JSX:
componentDidMount(){
$.ajax({
url:'http://intelligencevillage.wxtui.cn/index.php/Api/HomepageWebview/getHomepageData/area_id/5',
dataType:'json',
cache:false,
}).done(function({data}){
this.setState({
lis1:[data.banner]
})
})
}
Я понимаю, что это своего рода проблема с привязкой, но я не знаю, как это исправить. Любая помощь приветствуется.
Проблема заключается в области выполнения функций.
componentDidMount(){
$.ajax({
...
}).done(function({data}){
///// HERE {this}
// try console.log(this);
// you will see there is no'setState'
this.setState({
lis1:[data.banner]
})
})
}
Теперь, функция внутри done
цепочки, this
ссылка только внутри функции.
componentDidMount(){
$.ajax({
url:'',
dataType:'json',
cache:false,
}).done(({data}) => {
this.setState({
lis1:[data.banner]
})
})
}
Проблема в том, что this
в вашем случае не соответствует правильному контексту. Функция внутри .done()
представляет собой отдельный контекст для себя, и, следовательно, вы можете
1. Добавьте bind(this)
после .done()
.
constructor(props){
super(props);
this.state={
lis1:[],
}
}
componentDidMount(){
$.ajax({
url:'',
dataType:'json',
cache:false,
}).done(function({data}){
this.setState({
lis1:[data.banner]
});
}.bind(this));
}
2 Или вы можете назначить this
отдельной переменной и использовать ее.
constructor(props){
super(props);
this.state={
lis1:[],
}
}
componentDidMount(){
var self = this;
$.ajax({
url:'',
dataType:'json',
cache:false,
}).done(function({data}){
self.setState({
lis1:[data.banner]
})
})
}