import React, { Component, useState, useMemo } from 'react';
import Table, { StylesSimple, SelectColumnFilter, NumberRangeColumnFilter } from
'../Tables/TableSimple';
import {GetCompanyRequesteddata } from '../APICalls/dbCompany';
var config = { "Access-Control-Allow-Origin": "*" }
export class CompanySearch extends Component {
constructor(props) {
super(props);
this.state = {
isLoading: false,
requestedData: [],
totalPageCount: 0,
defaultPageSize: 10,
pagereset: false,
};
fetchData = (state, instance) => {
this.setState({ isLoading: true });
const pasdata = {
pageIndex: state.pageIndex,
pageSize: state.pageSize,
};
GetCompanyRequesteddata(config, pasdata, (res) => {
this.setState({ requestedData: res.data.basicCompanyDataList, isLoading: false, defaultPageSize: state.pageSize, totalPageCount: res.data.totalPageCount, pageIndex: state.pageIndex });
},
(err) => {
});
}
render() {
return (
//you may have other components here
<div className="container-fluid">
<StylesSimple>
<Table
data={this.state.requestedData || []}
columns={columns}
onFetchData={this.fetchData}
loading={this.state.isLoading}
pageCount={this.state.totalPageCount}
skipPageReset={this.state.pageReset}
/>
</StylesSimple>
</div>
</div>
</div>
</div >);
}
} }
const columns = [
{
Header: 'RowId',
accessor: (row, i) => i + 1,
width: 150,
maxWidth: 150,
minWidth: 150
},
{
Header: 'Company',
columns: [
{
Header: 'Name',
accessor: 'companyName',
aggregate: 'count',
Aggregated: ({ cell: { value } }) => `${value} Names`,
width: 250,
maxWidth: 250,
minWidth: 250
},
{
Header: 'Number',
accessor: 'companyNumber',
// Use our custom `fuzzyText` filter on this column
filter: 'fuzzyText',
// Use another two-stage aggregator here to
// first count the UNIQUE values from the rows
// being aggregated, then sum those counts if
// they are aggregated further
aggregate: 'uniqueCount',
Aggregated: ({ cell: { value } }) => `${value} Unique Names`,
width: 150,
minWidth: 100,
maxWidth: 400,
},
],
},],
вызов веб-API в отдельном javascript файле, который я поместил в
import {GetCompanyRequesteddata} из '../APICalls/dbCompany';
export async function GetCompanyRequesteddata(config, payload, callback, errorcallback) {
await axios({
method: 'post',
url: 'api/v1/companydata/GetCompanyRequestedData',
data: JSON.stringify(payload),
headers: {
'secret-key': 'your secret key',
'Content-Type': 'application/json'
}
})
.then(res => {
if (callback !== null) {
callback(res)
}
}).catch(err => {
if (errorcallback !== null) {
errorcallback(err);
}
})
}
фактической таблицы, которая у меня есть помещается в отдельный javascript файл с именем TableSimple и экспортируется как функциональный компонент
function Table({ columns, data, onFetchData, loading, pageCount: controlledPageCount, skipPageReset }) {
const [filterInput, setFilterInput] = useState('');
const filterTypes = React.useMemo(
() => ({
// Add a new fuzzyTextFilterFn filter type.
fuzzyText: fuzzyTextFilterFn,
// Or, override the default text filter to use
// "startWith"
text: (rows, id, filterValue) => {
return rows.filter(row => {
const rowValue = row.values[id]
return rowValue !== undefined
? String(rowValue)
.toLowerCase()
.startsWith(String(filterValue).toLowerCase())
: true
})
},
}),
[]
)
const defaultColumn = React.useMemo(
() => ({
// Let's set up our default Filter UI
Filter: DefaultColumnFilter,
minWidth: 30,
width: 50,
maxWidth: 400,
}),
[]
)
const {
getTableProps,
getTableBodyProps,
headerGroups,
prepareRow,
page,
canPreviousPage,
canNextPage,
pageOptions,
pageCount,
gotoPage,
nextPage,
previousPage,
setPageSize,
state: { pageIndex, pageSize },
} = useTable(
{
columns,
data,
initialState: { pageIndex: 0 },
manualPagination: true,
pageCount: controlledPageCount,
defaultColumn,
filterTypes,
disableMultiSort: true,
***autoResetPage: skipPageReset,***
},
useFilters,
useGroupBy,
useSortBy,
useExpanded,
. Самая важная проблема, которую следует помнить при извлечении данных на стороне сервера, - это autoResetPage: skipPageReset
, если вам не удается управляя {this.state.pageReset}, он может дважды вызвать fetchData, в результате вы увидите одни и те же данные страницы