javascript - setState 在 axios fetch 中不起作用
问题描述
class ItemsPage extends React.Component {
constructor(props)
{
super(props)
this.state = {items: null }
this.fetchImages = this.fetchImages.bind(this)
}
fetchImages()
{
var self = this
axios.get('https://api.instagram.com/v1/users/self/media/recent/?access_token=')
.then(function (result) {
const items = result
self.setState({ items: 'test' })
});
}
componentDidMount()
{
this.fetchImages()
console.log(this.state.items)
}
render () {
return (
<div>Test</div>
);
}
}
我设置items
并仍然出现我已经尝试记录结果null
并且我得到了我的数据我正在寻求帮助!也试过在 es6 中使用箭头函数还是不行console.log
null
setState
解决方案
让我们收集所有意见和建议,然后提供答案:)
正如评论中所说,您的主要问题是将您的状态记录在错误的位置。既然setState
是异步的,就放一个之后就不行了console.log
。在这里,您有两个选择。
setState
第一个是在您的方法中使用回调。
self.setState({ items: "test" }, () => console.log(this.state.items))
您的第二个选项是console.log
在您的render
方法中使用。
render () {
console.log( this.state.items );
return (
...
因此,在第一次渲染中,您会看到初始值,在更新后您会看到数据。请记住,永远不要setState
在render
方法中使用,但在这里记录您的状态是可以的。
第二个问题,实际上不是问题,但也许不是必需的,你不需要var self = this
在你的函数中使用。如果您使用箭头函数而不是常规函数,则可以直接使用this
那里,因为箭头函数不会创建自己的范围。
axios.get('https://api.instagram.com/v1/users/self/media/recent/?access_token=')
.then( result => this.setState({ items: 'test' })
);
因此,您的整个组件将是这样的:
class ItemsPage extends React.Component {
constructor(props) {
super(props)
this.state = { items: null }
this.fetchImages = this.fetchImages.bind(this)
}
fetchImages() {
axios.get( "https://api.instagram.com/v1/users/self/media/recent/?access_token=" )
.then(result => this.setState({ items: "test"} )
);
}
componentDidMount() {
this.fetchImages();
}
render() {
console.log( this.state.items );
return <div>Test</div>;
}
}
如果你有合适的 Babel 插件和配置,你甚至可以使用 class-fields 提案来简化你的代码。
class ItemsPage extends React.Component {
state = { items: null };
fetchImages() {
axios.get( "https://api.instagram.com/v1/users/self/media/recent/?access_token=" )
.then((result) => this.setState({ items: "test"} )
);
}
componentDidMount() {
this.fetchImages();
}
render() {
console.log( this.state );
return <div>Test</div>;
}
}
与当前情况一样,您不需要绑定函数。但是请记住,如果您fetchImages
在回调中使用它(例如在按钮中),您将需要绑定它。如果您使用箭头函数,它会自动绑定。
class ItemsPage extends React.Component {
state = { items: null };
fetchImages = () =>
axios.get( "https://api.instagram.com/v1/users/self/media/recent/?access_token=" )
.then((result) => this.setState({ items: "test"} )
);
componentDidMount() {
this.fetchImages();
}
render() {
console.log( this.state );
return <div>Test</div>;
}
}
推荐阅读
- python - Python缺少已安装的模块
- windows - 在窗口中运行的 VBScript 如何发出哔哔声(或播放系统声音)?
- kotlin - 如何从 Kotlin 中的 URL 获取文本
- python - 我的机器学习模型一直在预测错误的事物,即使它具有很高的准确性
- c - 双向链表分段错误 C
- flutter - pubspec.yaml = 资产目录不存在有什么问题?
- mysql - 创建存储过程时出现语法错误,我的代码有什么问题
- c++ - 我想为“for”循环提供两个条件
- python - 如何加快 TF 模型训练?MultiWorkerMirroredStrategy 看起来比非分布式慢很多
- java - 在richfaces上下载文件时如何显示进度条