Как передать реквизит в меню в стиле MUI для достижения определенного условного стиля?

#reactjs #material-ui

Вопрос:

Как передать реквизиты в уже оформленное меню mui , я хочу иметь возможность использовать условный стиль в меню, чтобы оно могло иметь 2 типа минимальной ширины.. в зависимости от каждого случая для меня проблема заключается в том, что меню имеет стиль со стороны компонента, который получает реквизиты, которые я хочу сверить с его типом, так как он может этого достичь ?

 const StyledMenu = styled((props: MenuProps) =gt; (  lt;Menu  elevation={0}  anchorOrigin={{  vertical: 'bottom',  horizontal: 200,  }}  transformOrigin={{  vertical: 'top',  horizontal: 'right',  }}  {...props}  /gt; ))(({ theme }) =gt; ({  backgroundColor: 'rgba(255, 255, 455, 0.455)',  backdropFilter: 'blur(1px)',  'amp; .MuiPaper-root': {  borderRadius: 3,  //{props === 'Type' ? { minWidth: 1360 } : { minWidth: 250 }},  {props === 'Type' ? { minWidth: 1360 } : { minWidth: 250 }}  marginTop: theme.spacing(1),  color: theme.palette.mode === 'light' ? 'rgb(55, 65, 81)' : theme.palette.grey[300],  boxShadow: 'rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.05) 0px 4px 6px -2px',  'amp; .MuiMenu-list': {  padding: '4px 0',  },  'amp; .MuiMenuItem-root': {  'amp; .MuiSvgIcon-root': {  fontSize: 18,  color: theme.palette.text.secondary,  marginRight: theme.spacing(1.5),  },  'amp;:active': {  backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity),  },  },  }, }));  export const Expandable: React.FClt;Propsgt; = ({ source, type, date, icon }) =gt; {  const context = useContext(movementsContext);  //useEffect(() =gt; {}, [context.StabelItems]);  const [anchorEl, setAnchorEl] = React.useStatelt;null | HTMLElementgt;(null);  const open = Boolean(anchorEl);  const handleClick = (event: React.MouseEventlt;HTMLElementgt;) =gt; {  setAnchorEl(event.currentTarget);  };  const handleClose = () =gt; {  setAnchorEl(null);  };   return (  lt;Box style={{ margin: 'auto', display: 'flex', justifyContent: 'center' }}gt;  lt;StyledMenu  id='demo-customized-menu'  MenuListProps={{  'aria-labelledby': 'demo-customized-button',  }}  anchorEl={anchorEl}  open={open}  onClose={handleClose}  gt;  lt;/Boxgt;  lt;/Boxgt;  ); }; 

Ответ №1:

Недавно я разработал два разных способа условного стиля, используя MUI withStyle и makeStyle

Подход № 1

Создайте два разных стиля класса и условно примените их к своему элементу

 const useStyles = React.makeStyles(theme =gt; ({  blueStyle: {  color: 'blue'  },  redStyle: {  color: 'red'  }, }));  export default const YourComponent = () =gt; {  const classes = useStyles();  const [condition, setCondition] = React.useState(true);    return lt;div className={condition ? classes.blueStyle : classes.redStyle}gt;Hello World!lt;/divgt; }  

Подход № 2

Вы можете условно оформить ячейку таблицы (или любой элемент по вашему выбору) в зависимости от размера экрана

 const StyledDiv = withStyles((theme) =gt; ({  root: {  color: 'blue', // default style of color is blue  [theme.breakpoints.up('sm')]: { // you can use sx, sm, md, lg or xl for different screen conditions  color: 'red', // style of color is red if screen size is sm or sx  // other styles can go here  },  } }))(div);  export default const YourComponent = () =gt; {    return lt;StyledDiv gt;Hello World!lt;/StyledDivgt; }