我试图通过axios从REST端点获取数据,然后将其呈现在我的app.js组件中,然后使用上下文API将其提供给整个应用程序:
axios.js
import axios from 'axios';
const instance = axios.create({
baseURL: 'api_endpoint'
});
export default instance;
app.js
import Context from './context'
class App extends Component {
constructor(props) {
super(props)
this.state = {
comp: []
}
};
async componentDidMount() {
await instance.get('')
.then(res => {
const data = JSON.stringify(res.data.data)
this.setState({comp: data});
console.table('componentDidMount', data); // here I can log the data
})
.catch(err => {
console.log(err)
});
}
render () {
return (
<Context.Provider
value={{
comp: this.state.comp
}}>
</comp.Provider>
);
}
}
export default App;
children.js
import Context from '../../context'
class Children extends Component {
render () {
const { classes } = this.props;
return (
<Context.Consumer>
{context => (
<Paper className={classes.root}>
<Table className={classes.table}>
<TableHead>
<TableRow>
<CustomTableCell>comp_id</CustomTableCell>
<CustomTableCell align="right">comp_name</CustomTableCell>
<CustomTableCell align="right">comp_price</CustomTableCell>
<CustomTableCell align="right">comp_log_usd</CustomTableCell>
</TableRow>
</TableHead>
<TableBody>
{Object.entries(context.comp).forEach(([key, value]) => (
<TableRow className={classes.row} key={value.id}>
<CustomTableCell component="th" scope="row">
{value.id}
</CustomTableCell>
<CustomTableCell align="right">{value.name}</CustomTableCell>
<CustomTableCell align="right">{value.price}</CustomTableCell>
<CustomTableCell align="right">{value.log.usd}</CustomTableCell>
</TableRow>
))}
</TableBody>
</Table>
</Paper>
)}
</Context.Consumer>
);
}
第一个问题是,当我尝试像这样渲染它时,尽管我记录并测试了它的“ log”属性,但它仍能正常工作,但它显示此错误:“无法读取属性'log'未定义”
第二个问题是,当我删除具有此属性的CustomTableCell时,它会将我的数据加载到表外,并为我提供表外的整个对象数组。
因此,在这里将对您有所帮助。
答案 0 :(得分:0)
如果您打算使用异步函数,请不要使用.then(),这在我看来很难追踪。我从来没有在组件上使用过异步安装,这个答案假设还不错,但是尝试
async componentDidMount() {
try{
let response = await instance.get('')
const data = JSON.stringify(response.data.data)
this.setState({comp: data});
console.table('componentDidMount', data); // here I can log the data
}
catch(error){console.log(error);
}