2024-06-07 渥太华微生活
相关链接:
采用 React Bootstrap 创建React响应式导航栏
采用 Material UI 创建React响应式导航栏
参考Material UI官方网站:
https://mui.com/
1、安装 React及其依赖
1) 安装 react, react-dom,@vitejs/plugin-react,react-router-dom,@material-ui/core,和 @material-ui/icons:
npm install react react-dom @vitejs/plugin-react react-router-dom @material-ui/core @material-ui/icons
2) 更新 vite.config.js:
import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.jsx'], refresh: true, }), react(), ], });
2、更新主页:
更新 resources\views\welcome.blade.php
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>React Test</title> @viteReactRefresh @vite('resources/js/app.jsx') </head> <body> <div id="app"></div> </body> </html>
3、创建路由
resources/js/app.jsx:
import 'bootstrap/dist/css/bootstrap.min.css'; import '../css/app.css'; import ReactDOM from 'react-dom/client'; import { Route, BrowserRouter as Router, Routes } from 'react-router-dom'; import Navbar from './components/Navbar'; import Home from './pages/Home'; import About from './pages/About'; import Contact from './pages/Contact'; import Faq from './pages/Faq'; import NotFound from './pages/NotFound'; ReactDOM.createRoot(document.getElementById('app')).render( <div className=""> <Router> <Navbar /> <Routes> <Route exact path='/' element={ <Home /> } /> <Route path='/about' element={ <About /> } /> <Route path='/contact' element={ <Contact /> } /> <Route path='/faq' element={ <Faq /> } /> <Route path="*" element={ <NotFound /> } /> </Routes> </Router> </div> )
4、创建所有页面
1) resources\js\pages\Home.jsx
export default function Home() { return (<h1>Home Page content</h1>); }
2) resources\js\pages\About.jsx
export default function About() { return (<h1>About Page content</h1>); }
3) resources\js\pages\Contact.jsx
export default function Contact() { return (<h1>Contact Page content</h1>); }
4) resources\js\pages\Faq.jsx
export default function Faq() { return (<h1>Faq Page content</h1>); }
5) resources\js\pages\NotFound.jsx
export default function NotFound() { return (<h1>NotFound Page content</h1>); }
5、创建导航栏组件
1) 创建基本导航栏组件(为大屏幕用):
resources\js\components\Navbar.jsx
import { AppBar, CssBaseline, Toolbar, Typography, makeStyles } from "@material-ui/core"; import { BorderBottom } from "@material-ui/icons"; import { Link } from "react-router-dom"; const useStyles = makeStyles((theme) => ({ navlinks: { marginLeft: theme.spacing(10), display: "flex", }, logo: { flexGrow: "1", cursor: "pointer" }, link: { textDecoration: "none", color: "white", fontSize: "20px", marginLeft: theme.spacing(20), "&:hover": { color: "yellow", BorderBottom: "1px solid white", }, }, })); export default function Navbar() { const classes = useStyles(); return ( <AppBar position="static"> <CssBaseline /> <Toolbar> <Typography variant="h4" className={classes.logo}> Navbar </Typography> <div className={classes.navlinks}> <Link to="/" className={classes.link}> Home </Link> <Link to="/about" className={classes.link}> About </Link> <Link to="/contact" className={classes.link}> Contact </Link> <Link to="/faq" className={classes.link}> FAQ </Link> </div> </Toolbar> </AppBar> ); }
2) 创建 Drawer 组件(为小屏幕用):
resources\js\components\Drawer.jsx
import { Drawer, IconButton, List, ListItem, ListItemText, makeStyles } from "@material-ui/core"; import MenuIcon from '@material-ui/icons/Menu'; import { useState } from "react"; import { Link } from "react-router-dom"; const useStyles = makeStyles(() => ({ link: { textDecoration: "none", color: "blue", fontSize: "20px" }, icon: { color: "white" } })); export default function DrawerComponent() { const classes = useStyles(); const [openDrawer, setOpenDrawer] = useState(false); return ( <> <Drawer open={openDrawer} onClose={() => setOpenDrawer(false)} > <List> <ListItem onClick={() => setOpenDrawer(false)}> <ListItemText> <Link to="/" className={classes.link}>Home</Link> </ListItemText> </ListItem> <ListItem onClick={() => setOpenDrawer(false)}> <ListItemText> <Link to="/about" className={classes.link}>About</Link> </ListItemText> </ListItem> <ListItem onClick={() => setOpenDrawer(false)}> <ListItemText> <Link to="/contact" className={classes.link}>Contact</Link> </ListItemText> </ListItem> <ListItem onClick={() => setOpenDrawer(false)}> <ListItemText> <Link to="/faq" className={classes.link}>FAQ</Link> </ListItemText> </ListItem> </List> </Drawer> <IconButton onClick={() => setOpenDrawer(!openDrawer)}> <MenuIcon /> </IconButton> </> ); }
3) 组合上面两个,修改Navbar.jsx成为响应式导航栏(大小屏幕使用均可):
resources\js\components\Navbar.jsx
import { AppBar, CssBaseline, Toolbar, Typography, makeStyles, useMediaQuery, useTheme } from "@material-ui/core"; import { Link } from "react-router-dom"; import DrawerComponent from "./Drawer"; const useStyles = makeStyles((theme) => ({ navlinks: { marginLeft: theme.spacing(5), display: "flex", }, logo: { flexGrow: "1", cursor: "pointer" }, link: { textDecoration: "none", color: "white", fontSize: "20px", marginLeft: theme.spacing(20), "&:hover": { color: "yellow", borderBottom: "1px solid white", }, }, })); export default function Navbar() { const classes = useStyles(); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("md")); console.log(isMobile); return ( <AppBar position="static"> <CssBaseline /> <Toolbar> <Typography variant="h4" className={classes.logo}> Navbar </Typography> {isMobile ? ( <DrawerComponent /> ) : ( <div className={classes.navlinks}> <Link to="/" className={classes.link}> Home </Link> <Link to="/about" className={classes.link}> About </Link> <Link to="/contact" className={classes.link}> Contact </Link> <Link to="/faq" className={classes.link}> FAQ </Link> </div> )} </Toolbar> </AppBar> ); }
6、运行测试
在一个终端运行 VITE server
npm run dev
在另一个终端运行 Laravel server
php artisan serve
测试结果如下图:
在电脑屏幕上:
在手机屏幕上:
编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。
全部评论 (0) |
---|