添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
呐喊的乌冬面  ·  Configure ESLint to ...·  1 年前    · 
叛逆的长颈鹿  ·  java ...·  1 年前    · 
腹黑的剪刀  ·  openGauss ...·  1 年前    · 
求醉的莴苣  ·  Android ...·  1 年前    · 

后台管理系统是前端永远绕不开的话题,无论技术怎么革新,检验技术最好的标准就是如何做好产品。如今的前端可谓是百花齐放,百家争鸣,甚至学不过来了!吐血~ 本节主要讲述如何使用react、react-router-dom封装侧边栏。

下载react-router-dom

yarn add react-router-dom

react-router-dom : 基于 react-router ,加入了在浏览器运行环境下的一些功能:

  • Link 组件,会渲染一个 a 标签;

  • BrowserRouter 组件,使用 pushState popState 事件构建路由;

  • HashRouter 组件,使用 window.location.hash hashchange 事件构建路由。

  • react-router-native : 基于 react-router ,类似 react-router-dom ,加入了 react-native 运行环境下的一些功能。

描述 :图例就是简单的后台管理系统模板,左侧的导航栏通过路由控制内容区域的显示。页面过于简单,后面会重新替换,见谅!项目的ui是基于antD。

  • 新建views文件夹放置页面
  • 在views下分模块放置各类页面(首页:home)
import React, { Component } from "react";
// layout组件
import LayoutAside from "./components/aside";
import LayoutHeader from "./components/header";
import ContainerMain from "../../components/containerMain/Index";
// css
import "./layout.scss";
// antD
import { Layout } from "antd";
const { Sider, Header, Content } = Layout;
export default class Index extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  render() {
    return (
      <Layout className="layout-wrap">
        <Header className="layout-header">
          <LayoutHeader />
        </Header>
        <Layout>
          <Sider className="layout-side">
            <LayoutAside />
          </Sider>
          <Content className="layout-main">
            <ContainerMain />
          </Content>
        </Layout>
      </Layout>

描述:首页是由登录页面进来的。我们从外部引入三个组件LayoutAside、LayoutHeader、ContainerMain,分别展示侧边栏、头部、内容区。

  • LayoutAside
import React, { Component } from "react";
//asideMenu
import AsideMenu from "../../../components/asideMenu/index";
export default class Aside extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  render() {
    return <AsideMenu />;
  •  LayoutHeader
import React, { Component, Fragment } from "react";
//css
import "./aside.scss";
export default class Header extends Component {
  constructor(prpos) {
    super(prpos);
    this.state = {};
  render() {
    return (
      <Fragment>
        <h1 className="logo">
          <span>LOGO</span>
      </Fragment>
  • ContainerMain 
import React, { Component, Fragment } from "react";
import { Switch } from "react-router-dom";
import User from "../../views/user/index";
import UserAdd from "../../views/user/Add";
//私有路由组件
//私有组件方法
import PrivateRouter from "../privateRouter/index";
export default class ContainerMain extends Component {
  constructor(prpos) {
    super(prpos);
    this.state = {};
  render() {
    return (
      <Fragment>
        <Switch>
          <PrivateRouter exact path="/home/user/list" component={User}></PrivateRouter>
          <PrivateRouter exact path="/home/user/add" component={UserAdd}></PrivateRouter>
        </Switch>
      </Fragment>

描述:这个页面是根据路由来展示不同的页面,里面引入私有组件方法匹配路由。

  • PrivateRouter 
import React from "react";
import { Route, Redirect } from "react-router-dom";
//获取token
import { getToken } from "../../utils/session";
const PrivateRouter = ({ component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={
        (routePrpos) =>
          getToken() ? <Component {...routePrpos} /> : <Redirect to="/" /> //判断token,是否重定向到登录页
export default PrivateRouter;

描述:这个私有组件是react-router-dom官方提供的,我们在这个方法中做了路由重定向,防止通过路径访问。

  • AsideMenu 
import React, { Component, Fragment } from "react";
import { Link } from "react-router-dom";
//antd
import { UserOutlined } from "@ant-design/icons";
import { Menu } from "antd";
import Router from "../../router/index";
const { SubMenu } = Menu;
export default class AsideMenu extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  // 无子级菜单处理
  renderMenu = ({ title, key }) => {
    return (
      <Menu.Item key={key}>
        <Link to={key}>{title}</Link>
      </Menu.Item>
  // 子级判断处理(递归)
  renderSubMenu = ({ title, key, child }) => {
    return (
      <SubMenu key={key} icon={<UserOutlined />} title={title}>
        {child &&
          child.map((item) => {
            return item.child && item.child.length > 0
              ? this.renderSubMenu(item)
              : this.renderMenu(item);
      </SubMenu>
  render() {
    return (
      <Fragment>
          mode="inline"
          defaultSelectedKeys={["1"]}
          defaultOpenKeys={["sub1"]}
          style={{ height: "100%", borderRight: 0 }}
          theme="dark"
          {Router &&
            Router.map((firstItem) => {
              return firstItem.child && firstItem.child.length > 0
                ? this.renderSubMenu(firstItem)
                : this.renderMenu(firstItem);
        </Menu>
      </Fragment>

描述:LayoutAside组件中引入AsideMenu组件,AsideMenu组件主要是根据路由文件动态展示导航栏目录,其中renderMenu 、renderSubMenu这两个方法是最关键的,分别对应无子级菜单处理、子级判断处理(递归),然后再render函数中渲染,根据路由文件是否存在子路由来判断显示对应方法。

  • Router 
const router = [
    title: "控制台",
    icon: "home",
    key: "/home",
    title: "用户管理",
    icon: "laptop",
    key: "/home/user",
    child: [
        key: "/home/user/list",
        title: "用户列表",
        icon: "",
        key: "/home/user/add",
        title: "添加用户",
        icon: "",
    title: "部门管理",
    icon: "bars",
    key: "/home/navigation",
    child: [
        key: "/home/navigation/dropdown",
        title: "部门列表",
        icon: "",
        key: "/home/navigation/menu",
        title: "添加部门",
        icon: "",
        child: [
            key: "/home/navigation/dropdown",
            title: "部门列表",
            icon: "",
            key: "/home/navigation/menu",
            title: "添加部门",
            icon: "",
    title: "职位管理",
    icon: "edit",
    key: "/home/entry",
    child: [
        key: "/home/entry/form/basic-form",
        title: "职位列表",
        icon: "",
        key: "/home/entry/form/step-form",
        title: "添加职位",
        icon: "",
    title: "请假",
    icon: "info-circle-o",
    key: "/home/about1",
    title: "加班",
    icon: "info-circle-o",
    key: "/home/about",
export default router;

描述:统一放置路由地址的文件是以这样形式,判断是否有子路由是根据child判断的,所以这边修改要同时修改AsideMenu文件中的child判断。

App.js

import React, { Component } from "react";
import { Switch, Route, BrowserRouter } from "react-router-dom";
import "./app.scss";
// import Home from "./views/Home.js";
import Login from "./views/login/Index";
import Home from "./views/home/Index";
//私有组件
import PrivateRouter from "./components/privateRouter/index";
export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  render() {
    return (
      <div className="title">
        <BrowserRouter>
          <Switch>
            <Route exact render={() => <Login />} path="/" />
            <PrivateRouter component={Home} path="/home" />
            {/* <Route exact render={() => <Home />} path="/home" /> */}
          </Switch>
        </BrowserRouter>

描述:这是页面路由的入口文件,放置登录路由、以及首页路由。

gitHub地址,欢迎滴滴

前言后台管理系统是前端永远绕不开的话题,无论技术怎么革新,检验技术最好的标准就是如何做好产品。如今的前端可谓是百花齐放,百家争鸣,甚至学不过来了!吐血~ 本节主要讲述如何使用react、react-router-dom封装侧边栏。介绍下载react-router-domyarn add react-router-domreact-router-dom: 基于react-router,加入了在浏览器运行环境下的一些功能: Link组件,会渲染一个a标签; Browse.. React的侧面导航组件 react-sidenav被导出为es模块,因此您需要捆绑程序才能使用它。 它也是用Typescript编写的,因此也可以直接与Typescript项目一起使用。 React16.8 导航上下文 由于当前版本的react-sidenav没有任何固定的渲染模板,因此用户可以自由渲染Nav项目。 为了有条件地渲染项目,可以获取包含以下属性的上下文: 如果选择此导航项目 Nav的id(根据props.id) pathId 路径ID,将为parentId 导航级别从1开始 isLeaf 如果为true,则此Nav没有子代 以下是有关如何使用它的示例。 const Item = ( ) => { const context = Reac import React, { PureComponent } from "react"; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import Home1 from "./Home/Home1"; import Home2 from "./Home/Home2"; React Sidebar是React 0.14+的补充工具栏组件。 它具有以下功能: 侧边栏可以在主要内容上滑动,也可以停靠在其旁边。 启用触摸功能:像在本机移动应用程序上一样滑动以打开和关闭侧边栏。 易于与媒体查询结合使用,仅在屏幕宽度足够大时才显示侧边栏()。 在左侧和右侧均可使用。 微小大小:<2.5kB(已压缩) 麻省理工学院执照 React侧边栏的触摸交互模仿了实现材料设计规范的Android应用程序所支持的交互: 关闭侧边栏后,从屏幕左侧拖动将使侧边栏的右侧跟随您的手指。 打开侧边栏后,将手指滑过屏幕只会在侧边栏上滑动手指时影响到侧边栏。 在释放时,它会调用onSetOpen道具,如果工具条被拖的距离不是更dragToggleDistance道具。 注意:由于“滑动后退”功能,侧边栏触摸功能在IOS上不起作用。 因此,该功能已在 React Navigation介绍 React Navigation为React Native提供的路由管理库,利用该库可以很好的管理页面跳转,及导航栏的配置。利用该库可以实现普通的页面跳转,但是在涉及拦截器使用的时候,实现起来就比较麻烦。我们举例说明一下,假如我们程序有如下几个页面 |-- pages |-- login.js 登录页面 |-- record.js 我的订单页面 大家应该都有所体会,我们在一般应用都有跨tab跳转的需求, 这就需要特别处理下路由,所以 下面是使用react-navigation作为路由组件的一种方式. 具体情境是: app分三大模块Home主页, Bill账单和Me我的, 对应三个tab. 现在需求是 Home push HomeTwo, HomeTwo push BillTwo, BillTwo 返回到 Bill账单首页. 方法如下: 首先选择路由结构, 选择使用最外层是StackNavigator, 然后包含3个TabNavigator和其他组件. const Components = { HomeTwo: { scree
RN项目之Navigation react navigation地址:https://reactnavigation.org/ 在任何一个项目都离不开路由、关于RN的路由总结以下几点 一、**基本** 首先安装基本模块npm install @react-navigation/native -S或yarn add @react-navigation/native 然后再安装npm install @react-navigation/stack import { NavigationContainer } from '@react-navigation/native' import React, { Component } from 'react'; import classNames from 'classnames'; require('./index.less') const navArr = [ '推荐','JK','Lo','汉服','Coser','动漫','手绘','小说' class HomePage extend..
这只能用路由跳,不想用路由还有一个办法,那就是把菜单栏复制到各个界面,这样不管到哪个界面都有菜单栏。。。哈哈哈开个玩笑,进入正题 这几天真的被路由给搞吐了,认认真真的改了一天 多,今天来到公司之后,我又重新梳理了一下,可能就是昨天脑子确实转不动了,今天就顺着就给搞出来了,那激动的心,颤抖的手,赶紧过来记录一下。主要是怕我以后再忘了。。这次真的进入正题 语言:react+ant design 编译器:VS code 环境:macOS Big Sur 这次主要涉及三个界面,看结...
import React from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; 创建路由组件: const RouterComponent = () => { return ( <Router> <Switch> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> <Route path="/users/:id" component={Users} /> <Route path="*" component={NotFound} /> </Switch> </Router> 注意其中: - BrowserRouter负责监听浏览器的变化,并将对应url匹配到对应的Route - Switch保证只会有一个Route匹配成功 - exact表示只有路径为"/"的时候,才会渲染Home组件 - 通过path='/users/:id'匹配路由参数:id - path="*"渲染没有匹配到Route的NotFound组件 创建对应的组件: const Home = () => <h2>Home</h2>; const About = () => <h2>About</h2>; const Contact = () => <h2>Contact</h2>; const Users = ({ match }) => <h2>{match.params.id}</h2>; const NotFound = () => <h2>Page not found</h2>; 最后通过RouterComponent的方式将路由放入整个App中: function App() { return ( <div className="App"> <RouterComponent /> export default App; 以上就是封装React路由的基本方式,您可以根据需要对其进行扩展。