reactjs - 获取 JSON 数据数组,如何将其与 React Bootstrap Table 一起使用?
问题描述
在这里查看我的代码:
class HomePage extends React.Component {
constructor() {
super();
this.state = {
listing: [],
};
}
componentDidMount() {
fetch('https://api.coinmarketcap.com/v2/ticker/?convert=USD&structure=array')
.then(data => {
return data.json();
}).then(data => {
let listing = data.data.map((list) => {
return (
<tr key={list.id}>
<td>{list.id}</td>
<td>{list.rank}</td>
<td>{list.name} </td>
<td>{list.quotes? (list.quotes.USD||{}).price||0 : 0}</td>
<td>{list.symbol}</td>
<td>{list.quotes.USD.volume_24h}</td>
<td>{list.quotes.USD.percent_change_24h}%</td>
</tr>
)
});
this.setState({listing: listing});
console.log("state", this.state.listing);
})
}
render() {
return (
<div>
<div className="jumbotron">
<div className="container">
<h3>Cryptocurrency Statistics</h3>
<br/>
<BootstrapTable data={this.state.listing} striped hover>
<TableHeaderColumn isKey dataField='id'>ID</TableHeaderColumn>
<TableHeaderColumn dataField='name'>Name</TableHeaderColumn>
<TableHeaderColumn dataField='price'>Price</TableHeaderColumn>
<TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn>
<TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn>
<TableHeaderColumn dataField='price'>Product Price</TableHeaderColumn>
</BootstrapTable>
</div>
</div>
</div>
);
}
}
export default HomePage;
我正在使用 coinmarketcap api。检索在普通 html 表中工作,但此 api 中的最大数据为 100 个元素。所以我想改用分页表。如果此结构不起作用,请提出其他解决方案。
解决方案
我不熟悉 React Bootstrap Table,但我建议的逻辑可能适合任何数据表。
对于我很快看到的 API 支持start
和limit
选项,因此,您需要做的是将获取逻辑移动到特定方法并在内部调用componentDidMount
一次。然后,按钮Next
和 Prev
可以在您想要对数据进行分页时调用此方法。您必须跟踪当前页面。
PS:请记住,我没有测试过这个,但我希望你能理解它背后的逻辑。
class HomePage extends React.Component {
state = { currentPage: 0, data: [], isLoading: false }
fetchData = page => {
this.setState({ isLoading: true })
//Set it to the amount of records you want per page
const rowsPerPage = 100
const start = this.state.currentPage * rowsPerPage
fetch(`https://api.coinmarketcap.com/v2/ticker/?convert=USD&structure=array&start=${start}`)
.then(data => data.json())
.then(({ data }) => {
this.setState({
data,
currentPage: page,
isLoading: false
})
})
}
componentDidMount() {
this.fetchData(this.state.currentPage)
}
render() {
const { currentPage, data, isLoading } = this.state
// Always a good thing to check if the data is loaded
if (isLoading)
return <div>Loading...</div>
// Maybe you'll need a better logic here
const prevPage = currentPage === 0 ? 0 : currentPage - 1;
const nextPage = currentPage + 1;
// Implement your rendering logic here
const rows = data.map(row => <tr><td>{row.name}</td></tr>)
// Render the table
// Take a look at the onClick handlers
return (
<div>
<table>
<tbody>
{rows}
</tbody>
</table>
<button onClick={() => this.fetch(prevPage)}>Prev</button>
<button onClick={() => this.fetch(nextPage)}>Next</button>
</div>
)
}
}
}
推荐阅读
- websocket - React Native Android 无法连接到 WebSocket
- java - 我如何将坐标找到为整数
- r - 用数据帧中变量的可变长度数字序列替换 NA 时出错
- python-3.x - 想让 Excel 文件标题加粗
- php - 在 Laravel 控制器或模型中自动加载模块或库
- javascript - 获取元素数据属性并将它们插入到按钮中
- c# - 如何提供存储在 FTP 空间中的文件
- php - 尝试使用 PHP 保存 csv 文件需要很长时间
- flutter - 当使用flutter web部署的页面没有打开文件上传时
- azure-functions - 如何使用 Azure 数据工厂生成动态批处理文件并执行它