尝试更改组件的状态时出错。
未捕获的TypeError:无法读取未定义的属性“setState”
constructor(props){
super(props);
this.state={
r:'',
message:''
};
this.setStateMessage = this.setStateMessage.bind(this);
}
setStateMessage (e){
e.preventDefault();
var test = this.state.message;
request
.post('http://127.0.0.1:5000/api/db')
.send({message: this.state.message})
.accept('application/json')
.withCredentials()
.end(function(err, res){
if(err)
throw err;
this.setState({ r: res.body.message });
});
}
render() {
return (
<div>
<div className='response'>
{this.state.r}
</div>
//form with input
</div>
)}
答案 0 :(得分:6)
这是因为您正在函数中调用this.setState
,因此this
实际上是对您所在函数的引用。您需要存储对正确this
的引用或使用没有自己的上下文并从父上下文继承的箭头。所以:
setStateMessage (e){
e.preventDefault();
var test = this.state.message;
var self = this;
request
.post('http://127.0.0.1:5000/api/db')
.send({message: this.state.message})
.accept('application/json')
.withCredentials()
.end(function(err, res){
if(err) throw err;
self.setState({ r: res.body.message });
});
}
或者:
setStateMessage (e){
e.preventDefault();
var test = this.state.message;
request
.post('http://127.0.0.1:5000/api/db')
.send({message: this.state.message})
.accept('application/json')
.withCredentials()
.end((err, res) => {
if(err) throw err;
this.setState({ r: res.body.message });
});
}
答案 1 :(得分:2)
要添加到@ aray12&#39的答案,您也可以绑定回调。
setStateMessage (e){
e.preventDefault();
var test = this.state.message;
request
.post('http://127.0.0.1:5000/api/db')
.send({message: this.state.message})
.accept('application/json')
.withCredentials()
.end((function(err, res) {
if(err) throw err;
this.setState({ r: res.body.message });
}).bind(this));
}
答案 2 :(得分:0)
花了太多时间在这之后我的最终代码就在这里
class Data extends React.Component{
constructor(){
super()
this.state={
name:''
}
}
componentDidMount(){
console.log('componentDidMount');
var url = "http:\//localhost:3000/order/test";
Request
.get(url)
.query(null)
.set('Accept', 'application/json')
.end ((error, response)=>{
const title=response.text
console.log(JSON.stringify(title));
this.setState({
name:title
});
});
}
render(){
return <div>World {this.state.name}</div>;
}
}
注意:如果回复是文字,则必须使用response.text
,因为我在我的情况下使用
如果您需要更多详细信息click here