您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Navbar.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import React, { useState, useMemo, useContext } from 'react';
  2. import {
  3. AppBar,
  4. Badge,
  5. Box,
  6. IconButton,
  7. Toolbar,
  8. Typography,
  9. List,
  10. ListItem,
  11. ListItemButton,
  12. ListItemIcon,
  13. ListItemText,
  14. useMediaQuery,
  15. } from '@mui/material';
  16. import { useTheme } from '@mui/system';
  17. import MenuOutlinedIcon from '@mui/icons-material/MenuOutlined';
  18. import ShoppingBasketIcon from '@mui/icons-material/ShoppingBasket';
  19. import Brightness4Icon from '@mui/icons-material/Brightness4';
  20. import Brightness7Icon from '@mui/icons-material/Brightness7';
  21. import MenuList from './MenuList';
  22. import Drawer from './DrawerComponent';
  23. import { ColorModeContext } from '../../context/ColorModeContext';
  24. const Navbar = () => {
  25. const [openDrawer, setOpenDrawer] = useState(false);
  26. const theme = useTheme();
  27. const matches = useMediaQuery(theme.breakpoints.down('sm'));
  28. const toggleColorMode = useContext(ColorModeContext);
  29. const handleToggleDrawer = () => {
  30. setOpenDrawer(!openDrawer);
  31. };
  32. const drawerContent = useMemo(
  33. () => (
  34. <List>
  35. <ListItemButton divider onClick={handleToggleDrawer}>
  36. <ListItemIcon>
  37. <ListItemText>Link 1</ListItemText>
  38. </ListItemIcon>
  39. </ListItemButton>
  40. <ListItem divider onClick={handleToggleDrawer}>
  41. <ListItemIcon>
  42. <ListItemText>Link 2</ListItemText>
  43. </ListItemIcon>
  44. </ListItem>
  45. <ListItem divider onClick={handleToggleDrawer}>
  46. <ListItemText>Link 3</ListItemText>
  47. </ListItem>
  48. <ListItem divider>
  49. <IconButton onClick={toggleColorMode}>
  50. <ListItemText>Toggle {theme.palette.mode} mode</ListItemText>
  51. {theme.palette.mode === 'dark' ? (
  52. <Brightness7Icon />
  53. ) : (
  54. <Brightness4Icon />
  55. )}
  56. </IconButton>
  57. </ListItem>
  58. </List>
  59. ),
  60. [handleToggleDrawer]
  61. );
  62. return (
  63. <AppBar
  64. elevation={2}
  65. sx={{ backgroundColor: 'background.default', position: 'relative' }}
  66. >
  67. <Toolbar>
  68. <Box
  69. component="div"
  70. sx={{
  71. display: 'flex',
  72. justifyContent: 'space-between',
  73. alignItems: 'center',
  74. width: '100%',
  75. }}
  76. >
  77. {matches ? (
  78. <Drawer
  79. open={openDrawer}
  80. toggleOpen={handleToggleDrawer}
  81. content={drawerContent}
  82. />
  83. ) : (
  84. <Box sx={{ display: 'flex' }}>
  85. <Typography
  86. variant="h6"
  87. sx={{
  88. marginRight: 3,
  89. cursor: 'pointer',
  90. color: 'text.primary',
  91. }}
  92. >
  93. Link 1
  94. </Typography>
  95. <Typography
  96. variant="body1"
  97. sx={{
  98. marginRight: 3,
  99. cursor: 'pointer',
  100. color: 'text.primary',
  101. }}
  102. >
  103. Link 2
  104. </Typography>
  105. <Typography
  106. variant="subtitle1"
  107. sx={{
  108. marginRight: 3,
  109. cursor: 'pointer',
  110. color: 'text.primary',
  111. }}
  112. >
  113. Link 3
  114. </Typography>
  115. </Box>
  116. )}
  117. <Box>
  118. <MenuList />
  119. </Box>
  120. <Box
  121. sx={{
  122. display: 'flex',
  123. justifyContent: 'center',
  124. alignItems: 'center',
  125. }}
  126. >
  127. {matches ? (
  128. <Box>
  129. <IconButton onClick={handleToggleDrawer}>
  130. <MenuOutlinedIcon />
  131. </IconButton>
  132. </Box>
  133. ) : (
  134. <Box>
  135. <IconButton>
  136. <Badge badgeContent={3} color="primary">
  137. <ShoppingBasketIcon color="action" />
  138. </Badge>
  139. </IconButton>
  140. <IconButton sx={{ ml: 1 }} onClick={toggleColorMode}>
  141. {theme.palette.mode === 'dark' ? (
  142. <Brightness7Icon />
  143. ) : (
  144. <Brightness4Icon />
  145. )}
  146. </IconButton>
  147. </Box>
  148. )}
  149. </Box>
  150. </Box>
  151. </Toolbar>
  152. </AppBar>
  153. );
  154. };
  155. export default Navbar;