如何根据按钮点击更新反应数据table(反应数据-table-组件库)
How to update react datatable ( react-data-table-component library) based on button click
我正在使用 react-data-table-component 库从 API 获取数据并将其显示在数据 table 中。我有一个自定义日期过滤器选项,我可以在其中更新 datatable 的数据数组。我需要在更新数据时单独刷新数据table部分。
<DataTable key={number} columns={columns} data={filteredItems} title ='SandBox ' subHeader
subHeaderComponent={subHeaderComponentMemo} pagination
paginationResetDefaultPage={resetPaginationToggle} nation ltr fixedHeader highlightOnHover responsive striped noDataComponent={"No records"}/>
这里的 filteredItems 值我可以在单击按钮时更新,但我需要在数据 table 上显示更新后的数据。我无法刷新页面,因为它将从 API.
获取新数据
useEffect(() => {
fetch( API_LINK)
.then(res => res.json())
.then(
(result) => {
setIsLoaded(true);
console.log(result)
setItems(result);
},
// Note: it's important to handle errors here
// instead of a catch() block so that we don't swallow
// exceptions from actual bugs in components.
(error) => {
setIsLoaded(true);
setError(error);
},
)
} ,[currentLimitVal])
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
// console.log(items)
if ( items.length > 0 )
{
var te ='';
var no_space ='';
function myFunction(item)
{
var letters = /^[A-Za-z]+$/
if (item.indexOf(' ') <= 0 && item.indexOf(':') <= 0 && !/\d/.test(item))
{
te = te+'item.'+item+' && item.'+item+'.toString().toLowerCase().includes(filterText.toLowerCase()) || ';
var sel ='row => row.'+item;
// console.log(sel);
columns.push(
{
name : item,
selector:eval(sel),
sortable: true
}
);
}
}
// console.log(columns);
Object.keys(items[0]).forEach(myFunction);
columnsList = columns.length > 0
&& columns.map((item, i) => {
if ( item.name.toLowerCase().includes('date') )
return (
<option key={i} value={item.name}>{item.name}</option>
)
}, this);
te = te.slice(0, -3);
filteredItems = items.filter(
item => eval(te),
);
}
以上是获取数据和添加过滤条件的代码。
if (typeof(fromDate) == 'undefined' || typeof(toDate) == 'undefined' )
{
message.error('Choose the Range Please ! ');
}
else if (typeof(colmunChoice) == 'undefined')
{
message.error('Choose the Date Column Please ! ');
}
else
{
var Fdate = new Date(fromDate);
var Tdate = new Date(toDate);
console.log( colmunChoice);
const format = ['DD MM YYYY', 'MM DD YYYY', 'YYYY MM DD', 'YYYY DD MM', 'MMM DD YYYY',
'DD MMM YYYY', 'YYYY MMM DD', 'YYYY DD MMM','MM DD YY']
const toFormat = 'YYYY MM DD';
filtered = items.filter(a => {
if(a[colmunChoice])
{
console.log( a[colmunChoice]);
// var date = new Date(a[colmunChoice]);
var date1 = a[colmunChoice].replace(/ +/g, '-')
var date = moment(date1, format).format(toFormat);
var Fdate = moment(fromDate, format).format(toFormat);
var Tdate = moment(toDate, format).format(toFormat);
console.log( date);
return (date >= Fdate && date <= Tdate);
}
});
filteredItems = filtered;
console.log(filteredItems);
// I need to update data with filteredItems here
}
}
在此处处理日期范围搜索。我需要将搜索结果推送到 Data table.
道具 filteredItems
是已经获取的数据,因此您不需要刷新 api。
const onRowDelete = row => () => {
const rows = filteredItems.filter(item => item.id !== row.id)
setFilteredItems(rows)
}
假设你要删除一行,并且filteredItems
一个状态,你可以使用上面的方法来刷新table。根据设计,DataTable
应该在 data
道具更改时为您刷新数据。
我正在使用 react-data-table-component 库从 API 获取数据并将其显示在数据 table 中。我有一个自定义日期过滤器选项,我可以在其中更新 datatable 的数据数组。我需要在更新数据时单独刷新数据table部分。
<DataTable key={number} columns={columns} data={filteredItems} title ='SandBox ' subHeader
subHeaderComponent={subHeaderComponentMemo} pagination
paginationResetDefaultPage={resetPaginationToggle} nation ltr fixedHeader highlightOnHover responsive striped noDataComponent={"No records"}/>
这里的 filteredItems 值我可以在单击按钮时更新,但我需要在数据 table 上显示更新后的数据。我无法刷新页面,因为它将从 API.
获取新数据
useEffect(() => {
fetch( API_LINK)
.then(res => res.json())
.then(
(result) => {
setIsLoaded(true);
console.log(result)
setItems(result);
},
// Note: it's important to handle errors here
// instead of a catch() block so that we don't swallow
// exceptions from actual bugs in components.
(error) => {
setIsLoaded(true);
setError(error);
},
)
} ,[currentLimitVal])
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
// console.log(items)
if ( items.length > 0 )
{
var te ='';
var no_space ='';
function myFunction(item)
{
var letters = /^[A-Za-z]+$/
if (item.indexOf(' ') <= 0 && item.indexOf(':') <= 0 && !/\d/.test(item))
{
te = te+'item.'+item+' && item.'+item+'.toString().toLowerCase().includes(filterText.toLowerCase()) || ';
var sel ='row => row.'+item;
// console.log(sel);
columns.push(
{
name : item,
selector:eval(sel),
sortable: true
}
);
}
}
// console.log(columns);
Object.keys(items[0]).forEach(myFunction);
columnsList = columns.length > 0
&& columns.map((item, i) => {
if ( item.name.toLowerCase().includes('date') )
return (
<option key={i} value={item.name}>{item.name}</option>
)
}, this);
te = te.slice(0, -3);
filteredItems = items.filter(
item => eval(te),
);
}
以上是获取数据和添加过滤条件的代码。
if (typeof(fromDate) == 'undefined' || typeof(toDate) == 'undefined' )
{
message.error('Choose the Range Please ! ');
}
else if (typeof(colmunChoice) == 'undefined')
{
message.error('Choose the Date Column Please ! ');
}
else
{
var Fdate = new Date(fromDate);
var Tdate = new Date(toDate);
console.log( colmunChoice);
const format = ['DD MM YYYY', 'MM DD YYYY', 'YYYY MM DD', 'YYYY DD MM', 'MMM DD YYYY',
'DD MMM YYYY', 'YYYY MMM DD', 'YYYY DD MMM','MM DD YY']
const toFormat = 'YYYY MM DD';
filtered = items.filter(a => {
if(a[colmunChoice])
{
console.log( a[colmunChoice]);
// var date = new Date(a[colmunChoice]);
var date1 = a[colmunChoice].replace(/ +/g, '-')
var date = moment(date1, format).format(toFormat);
var Fdate = moment(fromDate, format).format(toFormat);
var Tdate = moment(toDate, format).format(toFormat);
console.log( date);
return (date >= Fdate && date <= Tdate);
}
});
filteredItems = filtered;
console.log(filteredItems);
// I need to update data with filteredItems here
}
}
在此处处理日期范围搜索。我需要将搜索结果推送到 Data table.
道具 filteredItems
是已经获取的数据,因此您不需要刷新 api。
const onRowDelete = row => () => {
const rows = filteredItems.filter(item => item.id !== row.id)
setFilteredItems(rows)
}
假设你要删除一行,并且filteredItems
一个状态,你可以使用上面的方法来刷新table。根据设计,DataTable
应该在 data
道具更改时为您刷新数据。