【发布时间】:2023-03-11 14:14:01
【问题描述】:
我有一个 react 组件,它使用 redux 向 API 发出请求。此请求执行服务器端分页。
问题是我不明白如何使用 redux 在 datatables.net 中执行此分页。
我确实知道如何在没有数据表的情况下执行分页(实际上,我的组件正在执行它)并且数据表有一个ajax support,作为react-redux-datatable 包。两者都是通过 ajax 直接调用 API,而使用 redux 则不然。
import React, { useEffect, useState, useCallback } from 'react'
import { bindActionCreators } from 'redux'
//...
const [skip, setSkip] = useState(10)
const [page, setPage] = useState(0)
// offset = 0 to page 0, offset 10 to page 1, offset 20 to page 2 and so on
<button onClick={() => props.doList({ offset: page * skip })}>Request</button>
// Table shows the current 10 entries, from a max that is also 10.
<Table data={props.list} columns={predefinedColums}>
//...
// results are acessed by props.list
const mapStateToProps = (state) => {
return ({
list: state.reducer.list,
})
}
const mapDispatchToProps = dispatch =>
bindActionCreators(
{
doList,
},
dispatch
)
目前,我可以显示所需的结果,但不知道如何在数据表组件中对页面更改执行新调用。分页 API 正在工作,所以如果我手动更改页码,它会返回正确的条目。
//Table component
import React, { useEffect } from 'react'
import $ from 'jquery'
import 'datatables.net'
import 'datatables.net-responsive'
import 'datatables.net-select'
// other imports
function Table(props) {
const { columns, data, title } = props
useEffect(() => {
$('#table_id').DataTable().destroy()
$('#table_id').DataTable({
retrieve: true,
data,
columns,
"responsive": true,
"lengthMenu": [
[10, 25, 50, -1],
[10, 25, 50, "All"]
],
"language": {
"emptyTable": i18n.t('emptyDataSourceMessage'),
"paginate": {
"previous": i18n.t('Previous'),
"next": i18n.t('Next'),
"first": i18n.t("First"),
"last": i18n.t("Last"),
},
"infoFiltered": i18n.t("(filtered from _MAX_ total entries)"),
"search": i18n.t('Search'),
"info": i18n.t("Showing _START_ to _END_ of _TOTAL_ entries"),
"infoEmpty": i18n.t("Showing 0 to 0 of 0 entries"),
},
})
}, [columns, data])
return (
<div className="row">
<div className="col s12">
<div class="section section-data-tables">
<div className="card">
<div className="card-content">
<h4 className="card-title">{title}</h4>
<div className="row">
<div className="col s12">
<table id="table_id" className="display">
<thead>
<tr>
{columns.map((column, key) => <th key={key} data-field={column.field}>{column.title}</th>)}
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
{columns.map((column, key) => <th key={key} data-field={column.field}>{column.title}</th>)}
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default Table
表格看起来像:(显示 10 个结果的 10 和唯一的页面)
我想知道如何使用 redux 正确执行服务器端分页。目前可以知道条目的数量以及要显示的当前页面。
【问题讨论】:
-
如果服务器正在进行分页,那么在每个请求中它应该告诉总共有多少条目,你使用的限制是什么,你所在的页面是什么,可能是否有下一个页面与否,这将解决如何在 Redux 中执行此操作,如果您从 API 获得这些信息,我很确定您可以处理其余部分。
-
是的,问题实际上在于使用 redux,因为使用 ajax 属性可以轻松实现分页本身。通过使用 redux,就像让数据准备好使用,但只是一页而不是让所有数据在前端分页。由于我可以拥有一百万个寄存器,因此获取所有数据并不合适。
标签: reactjs redux datatables pagination