#reactjs #pagination #material-table
#reactjs #разбивка на страницы #material-table
Вопрос:
У меня более миллиона строк, и я хочу отобразить их в material-table reactjs. Как мне получить данные из серверной части только для строк на одной странице, а затем получить следующий набор строк при нажатии на следующую страницу?
import React, { useState, useEffect } from 'react';
import MaterialTable from 'material-table';
import Axios from 'axios'
export default function MaterialTableDemo() {
var columns = [
{title: "stationid", field: "stationid", editable: 'never'},
{title: "model", field: "model", editable: 'never'},
{title: "version", field: "version", editable: 'never'},
{title: "lat", field: "lat", editable: 'never'},
{title: "lon", field: "lon", editable: 'never'},
{title: "status", field: "status"}
]
const [data, setData] = useState([]);
useEffect(() => {
Axios.get("/ListView")
.then(res => {
setData(res.data.data)
console.log(res.data.data)
})
.catch(error=>{
console.log("Error")
})
}, [])
const handleRowUpdate = (newData, oldData, resolve) => {console.log("updating row")
let errorList = []
if(newData.status === ""){
errorList.push("Please enter Status")
}
if(errorList.length < 1){
Axios.post("/update", newData)
.then(res => {
const dataUpdate = [...data];
const index = oldData.tableData;
dataUpdate[index] = newData;
setData([...dataUpdate]);
resolve()}
)
.catch(error => {
resolve()
})
}else{
resolve()
}
window.location.reload(true);
}
const handleRowDelete = (oldData, resolve) => {
Axios.post("/delete", oldData)
.then(res => {
const dataDelete = [...data];
const index = oldData.tableData;
dataDelete.splice(index, 1);
setData([...dataDelete]);
resolve()
})
.catch(error => {
resolve()
})
window.location.reload(true);
}
return (
<MaterialTable
title="Station MetaData from DB"
columns={columns}
data={data}
options={{
exportButton: true,
showFirstLastPageButtons: false,
}}
localization={{
pagination: {
labelDisplayedRows: '{from}-{to}'
},
}}
editable={{
onRowUpdate: (newData, oldData) =>
new Promise((resolve) => {
handleRowUpdate(newData, oldData, resolve);
}),
onRowDelete: (oldData) =>
new Promise((resolve) => {
handleRowDelete(oldData, resolve)
}),
}}
/>
);
}
Как мне заставить получать только как можно больше строк из серверной части на 1 странице для отображения? Например, если я хочу отображать только 5 строк на странице, тогда я должен получить только 5 строк из серверной части и при нажатии на следующую страницу получить следующие 5 строк.
Комментарии:
1. Что вы пробовали? где вы застряли?
2. Я попробовал реализовать material-table в соответствии с примером на их странице, чтобы соответствующим образом извлекать данные. Но он извлекает все строки одновременно. Как я могу использовать material-table для передачи параметров для извлечения только определенных строк? например, 1-100, затем 101-200 строк (на страницу).
3. Вам нужно поделиться частью вашего кода. Если вы используете код с веб-сайта, он работает.
4. отредактировал мой вопрос с помощью фрагмента кода, над которым я работаю.
Ответ №1:
Я знаю, что это немного поздно, но, возможно, это поможет другим с тем же вопросом. Вы должны переопределить разбивку на страницы в компонентах:
<MaterialTable
options={options}
data={data}
columns={columns}
editable={{onRowUpdate}}
localization={localization}
components={{
Pagination: (props) =>
<CustomPagination
props={props}
rowsPerPage={pageSize}
pageIndex={pageIndex}
setPageIndex={setPageIndex}
setPageSize={setPageSize}/>
}
}}
/>
где
<CustomPagination
rowsPerPageOptions={rowsPerPageOptions}
rowsPerPage={rowsPerPage}
count={totalPages}
page={pageIndex}
onChangePage={(event, page) => {
props.onChangePage(event, page);
setPageIndex(page)
}}
onChangeRowsPerPage={event => {
props.onChangeRowsPerPage(event);
setPageSize(parseInt(event.target.value));
}}
/>
Все поля в CustomPagination являются перехватчиками из его родительского компонента, так что вы будете выполнять свои вызовы api и повторно отображать при их изменении.
Используя тот же способ, которым вы можете изменить текст этих кнопок, пожалуйста, проверьте этот пример https://material-table.com/#/docs/features/localization.