如何在渲染和存储会话之前进行 axios 调用?
How can I make an axios call before rendering and store a session?
我已经尝试了很多教程,到目前为止,我可以显示项目并了解一些 React。
URL 结构是
/works/2
2的查询字符串存储在pageID
里面
然后我触发 ajax 调用并过滤数据库以仅显示具有 .find()
的数据
这是将列出公司工作组合项目的 WorksPage.js
文件。
import React, { Component } from 'react';
import axios from 'axios';
import './index.css';
class WorksPage extends Component {
constructor(props) {
super(props);
this.state = {itemList: []};
}
componentWillMount(){
const pageID = this.props.match.params.page;
axios.get('/api/works.json').then(function(response){
const result = response.data.find(i => i.id === pageID);
this.setState({ isLoaded: true, itemList: result });
}.bind(this));
}
componentDidMount() {
window.scrollTo(0, 0);
}
render(){
return(
<div className="workListing pageWrapper">
<section className="workListing-process">
<div className="smcontainer center txtc">
{this.state.itemList}
App Type: {this.state.itemList.sub}
App cars: {this.state.itemList.cars.map((car, i) =>
<div key={i}>
{car}
</div>
)}
</div>
</section>
</div>
)
}
}
export default WorksPage;
我的 JSON 的 works.json
是
[{
"id": 0,
"img": "/images/slider.jpg",
"header": "GPS Module",
"sub": "iOS",
"link": "/works/0",
"cars":[ "Ford", "BMW", "Fiat" ]
}{
"id": 1,
"img": "/images/map-slider.jpg",
"header": "GPS Mapping Vectors",
"sub": "iOS",
"link": "/works/1",
"cars":[ ]
},{
"id": 2,
"img": "/images/slider.jpg",
"header": "GPS Module",
"sub": "Android",
"link": "/works/2",
"cars":[ "Ferrari", "BMW", "Land Rover" ]
}]
到目前为止 {this.state.itemList}
return 是空白的。汽车列表循环也不起作用。如果我在 this.setState
之后执行 console.log,Console.log 将 return result
的数据
你在回调函数中使用了'this'关键字,它指的是回调本身而不是组件。
并且还使用componentDidmount,不再使用componenwillmount。
看这里:componentWillMount
使用这个:
componentDidMount(){
let that = this;
const pageID = this.props.match.params.page;
axios.get('/api/works.json').then(function(response){
const result = response.data.find(i => i.id === pageID);
that.setState({ isLoaded: true, itemList: result });
};
}
首先,不要使用componentWillMount,它既是deprecated又不是用来调用API的。请改用 componentDidMount。
我假设问题是 pageID
是字符串而 id
是数字,因此没有任何匹配。在比较之前尝试将 pageID
转换为数字。
const pageID = parseInt(this.props.match.params.page, 10);
我已经尝试了很多教程,到目前为止,我可以显示项目并了解一些 React。
URL 结构是
/works/2
2的查询字符串存储在pageID
然后我触发 ajax 调用并过滤数据库以仅显示具有 .find()
这是将列出公司工作组合项目的 WorksPage.js
文件。
import React, { Component } from 'react';
import axios from 'axios';
import './index.css';
class WorksPage extends Component {
constructor(props) {
super(props);
this.state = {itemList: []};
}
componentWillMount(){
const pageID = this.props.match.params.page;
axios.get('/api/works.json').then(function(response){
const result = response.data.find(i => i.id === pageID);
this.setState({ isLoaded: true, itemList: result });
}.bind(this));
}
componentDidMount() {
window.scrollTo(0, 0);
}
render(){
return(
<div className="workListing pageWrapper">
<section className="workListing-process">
<div className="smcontainer center txtc">
{this.state.itemList}
App Type: {this.state.itemList.sub}
App cars: {this.state.itemList.cars.map((car, i) =>
<div key={i}>
{car}
</div>
)}
</div>
</section>
</div>
)
}
}
export default WorksPage;
我的 JSON 的 works.json
是
[{
"id": 0,
"img": "/images/slider.jpg",
"header": "GPS Module",
"sub": "iOS",
"link": "/works/0",
"cars":[ "Ford", "BMW", "Fiat" ]
}{
"id": 1,
"img": "/images/map-slider.jpg",
"header": "GPS Mapping Vectors",
"sub": "iOS",
"link": "/works/1",
"cars":[ ]
},{
"id": 2,
"img": "/images/slider.jpg",
"header": "GPS Module",
"sub": "Android",
"link": "/works/2",
"cars":[ "Ferrari", "BMW", "Land Rover" ]
}]
到目前为止 {this.state.itemList}
return 是空白的。汽车列表循环也不起作用。如果我在 this.setState
result
的数据
你在回调函数中使用了'this'关键字,它指的是回调本身而不是组件。 并且还使用componentDidmount,不再使用componenwillmount。 看这里:componentWillMount
使用这个:
componentDidMount(){
let that = this;
const pageID = this.props.match.params.page;
axios.get('/api/works.json').then(function(response){
const result = response.data.find(i => i.id === pageID);
that.setState({ isLoaded: true, itemList: result });
};
}
首先,不要使用componentWillMount,它既是deprecated又不是用来调用API的。请改用 componentDidMount。
我假设问题是 pageID
是字符串而 id
是数字,因此没有任何匹配。在比较之前尝试将 pageID
转换为数字。
const pageID = parseInt(this.props.match.params.page, 10);