Сортировка пользовательского интерфейса материалов Не работает должным образом

#javascript #reactjs #material-ui

#javascript #reactjs #material-ui

Вопрос:

я пытаюсь реализовать простую таблицу с некоторыми данными. вот данные

 export const allPatients = [  {  name: 'Ralph',  email: 'maaloulyRalph@gmail.com',  phoneNumber: 76503675,  numberOfSessions: 3,  joiningDate: '12/3/2021',  },  {  name: 'Hadi',  email: 'hadi@gmail.com',  phoneNumber: 76309480,  numberOfSessions: 4,  joiningDate: '27/10/2021',  },  {  name: 'Victor',  email: 'victor@gmail.com',  phoneNumber: 76390580,  numberOfSessions: 6,  joiningDate: '19/9/2021',  },  {  name: 'Sam',  email: 'sam@gmail.com',  phoneNumber: 76439000,  numberOfSessions: 9,  joiningDate: '28/4/2021',  },  {  name: 'Omar',  email: 'omar@gmail.com',  phoneNumber: 76168432,  numberOfSessions: 2,  joiningDate: '11/7/2021',  },  {  name: 'Omar',  email: 'omar@gmail.com',  phoneNumber: 76168432,  numberOfSessions: 2,  joiningDate: '11/7/2021',  } ]  

и вот заголовок:

 const Headers = ['Name', 'Email', 'Phone Number', 'Number of Sessions', 'Joining Data'];  

Я посмотрел документы для кода пользовательского интерфейса материала и пришел к следующему:

 import * as React from 'react'; import PropTypes from 'prop-types'; import { useTheme } from '@mui/material/styles'; import Box from '@mui/material/Box'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableFooter from '@mui/material/TableFooter'; import TablePagination from '@mui/material/TablePagination'; import TableRow from '@mui/material/TableRow'; import Paper from '@mui/material/Paper'; import IconButton from '@mui/material/IconButton'; import FirstPageIcon from '@mui/icons-material/FirstPage'; import KeyboardArrowLeft from '@mui/icons-material/KeyboardArrowLeft'; import KeyboardArrowRight from '@mui/icons-material/KeyboardArrowRight'; import LastPageIcon from '@mui/icons-material/LastPage'; import { TableHead, TableSortLabel } from '@mui/material'; import { makeStyles } from '@material-ui/core'; import { blackColor, primaryColor, whiteColor } from '../../constants/colors';  const styles = makeStyles({  table: {  "amp; .MuiTableCell-root": {  border: "1px solid rgba(255, 255, 255, 0.2)",  background: '#23232e',  color: whiteColor,  fontSize: 18,  }  },  btn: {  "amp; .css-i4bv87-MuiSvgIcon-root": {  color: whiteColor  }  },  visuallyHidden: {  border: 0,  clip: 'rect(0 0 0 0)',  height: 1,  margin: -1,  overflow: 'hidden',  padding: 0,  position: 'absolute',  top: 20,  width: 1,  }, })  function TablePaginationActions(props) {  const classes = styles();  const theme = useTheme();  const { count, page, rowsPerPage, onPageChange } = props;   const handleBackButtonClick = (event) =gt; {  onPageChange(event, page - 1);  };   const handleNextButtonClick = (event) =gt; {  onPageChange(event, page   1);  };      return (  lt;Box sx={{ flexShrink: 0, ml: 2.5 }}gt;  lt;IconButton  onClick={handleBackButtonClick}  disabled={page === 0}    gt;  lt;KeyboardArrowLeft /gt;  lt;/IconButtongt;  lt;IconButton  onClick={handleNextButtonClick}  disabled={page gt;= Math.ceil(count / rowsPerPage) - 1}  aria-label="next page"    gt;  {theme.direction === 'rtl' ? lt;KeyboardArrowLeft /gt; : lt;KeyboardArrowRight /gt;}  lt;/IconButtongt;    lt;/Boxgt;  ); }  function TableHeader({headers, order,orderBy, onRequestSort }) {  const classes = styles();  const createSortHandler = (property) =gt; (event) =gt; {  onRequestSort(event, property);  };  return (  lt;TableHeadgt;  lt;TableRowgt;  {headers.map(header =gt; (  lt;TableCell key={header} align="center" sortDirection={orderBy === header ? order : false}gt;  lt;TableSortLabel active={orderBy === header}  direction={orderBy === header ? order : 'asc'}  onClick={createSortHandler(header)}gt;   {header}  {orderBy === header ? (  lt;span className={classes.visuallyHidden}gt;  {order === 'desc' ? 'sorted descending' : 'sorted ascending'}  lt;/spangt;  ) : null}  lt;/TableSortLabelgt;  lt;/TableCellgt;  ))}  lt;/TableRowgt;  lt;/TableHeadgt;  ); }  function descendingComparator(a, b, orderBy) {  if (b[orderBy] lt; a[orderBy]) {  return -1;  }  if (b[orderBy] gt; a[orderBy]) {  return 1;  }  return 0; }  function getComparator(order, orderBy) {  return order === 'desc'  ? (a, b) =gt; descendingComparator(a, b, orderBy)  : (a, b) =gt; -descendingComparator(a, b, orderBy); }  function stableSort(array, comparator) {  const stabilizedThis = array.map((el, index) =gt; [el, index]);  stabilizedThis.sort((a, b) =gt; {  const order = comparator(a[0], b[0]);  if (order !== 0) return order;  return a[1] - b[1];  });  return stabilizedThis.map((el) =gt; el[0]); }   export default function CustomPaginationActionsTable({data, headers, rowsPerPage}) {  const [page, setPage] = React.useState(0);   const [order, setOrder] = React.useState('asc');  const [orderBy, setOrderBy] = React.useState('numberOfSessions');     const classes = styles();  const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - page * rowsPerPage);   const handleChangePage = (event, newPage) =gt; {  setPage(newPage);  };   const handleRequestSort = (event, property) =gt; {   const isAsc = orderBy === property amp;amp; order === 'asc';  setOrder(isAsc ? 'desc' : 'asc');  setOrderBy(property);  };   return (  lt;TableContainer component={Paper} style={{background: 'transparent'}}gt;  lt;Table sx={{ minWidth: 500}} className={classes.table}gt;  lt;TableHeader   headers={headers}   order={order}  orderBy={orderBy}  onRequestSort={handleRequestSort} /gt;  lt;TableBody gt;  {stableSort(data, getComparator(order, orderBy))  .slice(page * rowsPerPage, page * rowsPerPage   rowsPerPage)  .map(patient =gt; {  return (  lt;TableRow gt;  lt;TableCellgt;{patient.name}lt;/TableCellgt;  lt;TableCellgt;{patient.email}lt;/TableCellgt;  lt;TableCellgt;{patient.phoneNumber}lt;/TableCellgt;  lt;TableCellgt;{patient.numberOfSessions}lt;/TableCellgt;  lt;TableCellgt;{patient.joiningDate}lt;/TableCellgt;  lt;/TableRowgt;  );  })}  {emptyRows gt; 0 amp;amp; (  lt;TableRow style={{ height: 33 * emptyRows }}gt;  lt;TableCell colSpan={6} /gt;  lt;/TableRowgt;  )}  lt;/TableBodygt;  lt;TableFootergt;  lt;TableRow className={classes.btn}gt;  lt;TablePagination  rowsPerPageOptions={rowsPerPage}  count={data.length}  rowsPerPage={rowsPerPage }  page={page}  SelectProps={{  inputProps: {  'aria-label': 'rows per page',  },  native: true,  }}  onPageChange={handleChangePage}  ActionsComponent={TablePaginationActions}    /gt;  lt;/TableRowgt;  lt;/TableFootergt;  lt;/Tablegt;  lt;/TableContainergt;  ); }  

the selected header gets sorted after I click on it, but after that, I can’t sort any other header and I can’t sort the selected header in reverse.