问题
I want my users to be able to drag the columns on the material table and keep that state persistent. I can get the states of my columns and their orders at any time. I do save them. However, when I try to render with the saved order of my columns it doesn't seem to update my material table.
I'm using react Material-Table from material-table.com
Here is the code I'm trying to do:
const tableHeaders = [];
tableHeaders.push({ title: 'a', field: 'a' });
tableHeaders.push({ title: 'b', field: 'b' });
tableHeaders.push({ title: 'c', field: 'c' });
const Table = (props) => {
const [state, setState] = useState({
headers: tableHeaders,
data: data // some data
});
const handleColumnDragged = (start, end) => {
// process the order of columns
// create as an array i.e. order = [2, 1, 0]
updateOrder(order);
// save to database
}
const updateHeaderOrder = (order) => {
let newHeaders = [];
order.forEach( i => {
newHeaders.push(tableHeaders[i]);
});
setState({ ...state, headers: newHeaders });
}
useEffect(() => {
resource.fetchHeaderOrder( order => {
updateHeaderOrder(order);
});
}, [resource]);
return (
<MaterialTable
columns={state.headers}
data={state.data}
onColumnDragged={handleColumnDragged}
/>
}
Is it possible to do this or not? Is material designed to only have the same column order everytime? It's weird that they allow drag event though if that is the case?
回答1:
I use the following approach to store the column order in localStorage. You can enhance it to store column order in the database.
export default function Monitor() {
let columns = [];
let data = [...]
// Checking if key exists in local storage
if (localStorage.getItem('table1') === null) {
// If key doesn't exists then store the actual column order in local storage
localStorage.setItem(
'table1',
JSON.stringify({
0: { title: 'Avatar', field: 'avatar', removable: false },
1: { title: 'First Name', field: 'first_name' },
2: { title: 'Last Name', field: 'last_name' },
3: { title: 'Last Change', field: 'lastChange' },
4: { title: 'Last Changed By', field: 'lastChangedBy' }
})
);
}
let savedColumns = JSON.parse(localStorage.getItem('table1'));
for (var columnIndex in savedColumns) {
columns.push(savedColumns[columnIndex]);
}
function handleColumnDrag(sourceIndex, destinationIndex) {
const sourceColumn = savedColumns[sourceIndex];
const destinationColumn = savedColumns[destinationIndex];
// Swapping the column order
savedColumns[sourceIndex] = destinationColumn;
savedColumns[destinationIndex] = sourceColumn;
localStorage.setItem('table1', JSON.stringify(savedColumns));
}
return (
<MaterialTable
columns={columns}
data={data}
onColumnDragged={handleColumnDrag}
icons={tableIcons}
/>
);
}
回答2:
You can store the order on the server in the database or locally in the localStorage, but sustaining the persistence is fully up to you.
On the other hand material-table
will render the columns in the order declared by you. Doesn't the order change if you push headers in the different order at the top? E.g:
tableHeaders.push({ title: 'c', field: 'c' });
tableHeaders.push({ title: 'b', field: 'b' });
tableHeaders.push({ title: 'a', field: 'a' });
来源:https://stackoverflow.com/questions/58190752/is-it-possible-to-save-the-order-of-the-column-of-material-table-to-a-database-t