#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 для справки.