【发布时间】:2017-11-26 15:09:45
【问题描述】:
尝试在 React 中使用 Axios 设置简单的 AJAX 调用。
我在我的“FetchRepos”组件中进行 Axios 调用,然后在我的“主页”组件中要求它传递一个语言参数。
它加载正常,因为我在主页组件中控制台记录了数据,但是当我将函数置于设置状态时,我检查了 React 开发工具并且“repos”状态为空,当我为“activeLanguage”执行 onClick 方法时它只是从状态中删除“repos”。
我们将不胜感激。
主页组件
import React from "react";
import {fetchPopularRepos} from "./FetchRepos";
class Homepage extends React.Component {
constructor(props) {
super(props);
this.state = {
activeLanguage: 'all',
repos: null
}
this.activeLanguage = this.activeLanguage.bind(this);
}
activeLanguage(lang) {
this.setState({
activeLanguage: lang,
repos: fetchPopularRepos(lang)
})
}
render() {
var languages = ['all', 'ruby', 'javascript', 'python'];
return (
<div>
{languages.map((lang) => {
return (
<li key={lang} onClick={this.activeLanguage.bind(null, lang)} style={lang === this.state.activeLanguage ? {color: 'red'} : null}>{lang}</li>
)
})}
</div>
)
}
}
FetchRepos 组件
var axios = require('axios');
export function fetchPopularRepos(language) {
axios.get('https://api.github.com/search/repositories?q=stars:>1+language:'+ language + '&sort=stars&order=desc&type=Repositories')
.then(function(res) {
return res.data.items;
})
}
【问题讨论】:
-
你的函数 fetchPopularRepos 什么都不返回,所以你只是将状态的 repos 属性设置为 undefined
-
您可以通过返回 axios get 的结果并在 React 组件中的另一个 then 语句中设置状态来解决此问题
-
关于一致性的公平点 KonradD。 @PatrickHund 你能进一步解释一下吗?我不明白为什么 fetchPopularRepos 什么都不返回,因为我已经做了一个 console.log 而不是 return 并且它获取了一个对象数组?其次我尝试了这个: activeLanguage(lang) { fetchPopularRepos(lang) .then((res) => { console.log(res) }) this.setState({ activeLanguage: lang }) } 但得到了这个错误: Uncaught TypeError:如果您能帮助解释为什么我会非常感激,则无法读取未定义的属性 'then'!
-
抱歉,我的手机无法写出正确答案。你几乎是对的,只需在 axios.get 之前添加“return”
-
@PatrickHund 哈哈没问题,伙计,这很有效,谢谢!如果您在通话后有时间并且如果您能解释为什么我需要添加退货会很麻烦:)如果不是,谢谢!
标签: javascript reactjs axios