Как изменить цвет для альтернативной строки в таблице MUI v4?

#reactjs #material-ui

Вопрос:

Ниже приведен мой код. Я попытался установить tableRowRoot в стиле.js, но цвет фона строки для альтернативной строки не изменился. Я надеюсь просто установить корень для строки таблицы, чтобы мне не нужно было добавлять какой-либо класс или логику в строки и т. Д. Надеюсь, вы, ребята, сможете показать мне правильный способ сделать это.

 import { makeStyles } from '@material-ui/core/styles';

export default makeStyles((theme) => ({
  tableRowRoot: {
    'amp;:nth-of-type(odd)': {
      backgroundColor: theme.palette.action.hover,
    },
  },
}));
 
 import useStyles from './styles';

const Event = ({ pendingEvents, handleUpdateEvent }) => {
  const classes = useStyles();

  return (
    <Container className={classes.content}>
      <div className={classes.toolbar} />
      <Typography className={classes.title} variant='h3' gutterBottom>
        List of Pending Request
      </Typography>
      <TableContainer component={Paper}>
        <Table className={classes.table} aria-label='simple table'>
          <TableHead>
            <TableRow>
              <TableCell className={classes.th}>Email</TableCell>
              <TableCell className={classes.th}>Name</TableCell>
              <TableCell className={classes.th}>Reason</TableCell>
              <TableCell className={classes.th}>Start Date</TableCell>
              <TableCell className={classes.th}>End Date</TableCell>
              <TableCell className={classes.th}>Approve / Reject</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {pendingEvents.map((event) => (
              <TableRow key={event.id}>
                <TableCell component='th' scope='row'>
                  {event.email}
                </TableCell>
                <TableCell>{event.name}</TableCell>
                <TableCell>{event.reason}</TableCell>
                <TableCell>{new Date(event.start).toDateString()}</TableCell>
                <TableCell>{new Date(event.end).toDateString()}</TableCell>
                <TableCell>
                  <IconButton
                    aria-label='Approve'
                    color='inherit'
                    onClick={() => handleUpdateEvent(event, 'approved')}
                  >
                    <ThumbUpIcon color='primary' />
                  </IconButton>
                  <IconButton
                    aria-label='Reject'
                    color='inherit'
                    onClick={() => handleUpdateEvent(event, 'rejected')}
                  >
                    <ThumbDownIcon color='secondary' />
                  </IconButton>
                </TableCell>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>
    </Container>
  );
};

export default Event;
 

Ответ №1:

У вас есть tableRowRoot правило, но я не вижу, чтобы вы устанавливали имя класса в поле TableRow для применения пользовательских стилей:

 <TableRow key={event.id} className={classes.tableRowRoot} /* <------- Add this */>
 

Из документов вы также можете использовать withStyles для создания стилизованного компонента на основе исходного:

 const StyledTableRow = withStyles((theme) => ({
  root: {
    'amp;:nth-of-type(odd)': {
      backgroundColor: theme.palette.action.hover,
    },
  },
}))(TableRow);
 
 <TableBody>
  {pendingEvents.map((event) => (
    <StyledTableRow key={event.id}>
      {...}
    </StyledTableRow>
  ))}
</TableBody>
 

Комментарии:

1. @JasonTan Я обновил ответ, используя withStyles его в качестве альтернативы.

2. @JasonTan имя класса .MuiTableRow-root сопоставляется с именем правила root , если вы используете withStyles , если вы используете makeStyles , объявите любые стили, которые вы хотите, и передадите имя TableRow класса, которое является стилями корневого компонента (таким же, как withStyles ).

3. @JasonTan вы либо используете makeStyles , либо withStyles для создания пользовательских стилей для своих компонентов, вы не можете использовать и то, и другое. Используйте withStyles , если вы хотите создать совершенно новый компонент с пользовательскими стилями. Используйте makeStyles , если вы хотите повторно использовать стили и создать набор имен классов, которые вы можете передать любым компонентам.

4. @JasonTan вы можете повторно использовать компонент, вставив StyledTableRow другой файл и импортировав его в свой основной файл.

5. @JasonTan вы можете посмотреть эту демонстрацию codesandbox для справки.