美文网首页
三、使用rsuite ui框架

三、使用rsuite ui框架

作者: 风之伤_3eed | 来源:发表于2019-12-10 10:26 被阅读0次

1 、安装rsuite

npm i rsuite --save

注:rsuite文档官网

2、项目引入rsuite样式

在src/App.tsx文件中引入

import 'rsuite/dist/styles/rsuite-default.css';

3、修改src/App.tsx文件

将/路径指向layout文件

import React from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from "react-router-dom";
import {
  Login
} from './pages';
import Layout from './layout';
import 'rsuite/dist/styles/rsuite-default.css';
import "./App.css";

const App = () => {
  return (
    <Router>
      <Switch>
        <Route exact path="/login" component={Login} />
        <Route path="/" component={Layout} />
      </Switch>
    </Router>
  );
};

export default App;

4、使用rsuite中的左侧导航布局

新建src/layout/index.tsx文件
(由于采用了hook对rsuite的代码进行了细微调整)整体代码如下:

import React, { useState } from "react";
import { Container, Header, Content, Nav, Navbar, Dropdown, Icon, Sidebar, Sidenav } from 'rsuite';
import 'rsuite/lib/styles/index.less'; 
import "./style.css";

const headerStyles: any = {
  padding: 18,
  fontSize: 16,
  height: 56,
  background: "#34c3ff",
  color: " #fff",
  whiteSpace: "nowrap",
  overflow: "hidden"
};

const iconStyles: any = {
  width: 56,
  height: 56,
  lineHeight: "56px",
  textAlign: "center"
};

const NavToggle = ({ expand, onChange }: any) => {
  return (
    <Navbar appearance="subtle" className="nav-toggle">
      <Navbar.Body>
        <Nav>
          <Dropdown
            placement="topStart"
            trigger="click"
            renderTitle={children => {
              return <Icon style={iconStyles} icon="cog" />;
            }}
          >
            <Dropdown.Item>Help</Dropdown.Item>
            <Dropdown.Item>Settings</Dropdown.Item>
            <Dropdown.Item>Sign out</Dropdown.Item>
          </Dropdown>
        </Nav>

        <Nav pullRight>
          <Nav.Item
            onClick={onChange}
            style={{ width: 56, textAlign: "center" }}
          >
            <Icon icon={expand ? "angle-left" : "angle-right"} />
          </Nav.Item>
        </Nav>
      </Navbar.Body>
    </Navbar>
  );
};

const Home = () => {
  const [expand, setExpand] = useState<boolean>(true);

  const handleToggle = () => {
    setExpand(!expand);
  };
  return (
    <div className="show-fake-browser sidebar-page">
      <Container>
        <Sidebar
          style={{ display: "flex", flexDirection: "column" }}
          width={expand ? 260 : 56}
          collapsible
        >
          <Sidenav.Header>
            <div style={headerStyles}>
              <Icon
                icon="logo-analytics"
                size="lg"
                style={{ verticalAlign: 0 }}
              />
              <span style={{ marginLeft: 12 }}> BRAND</span>
            </div>
          </Sidenav.Header>
          <Sidenav
            expanded={expand}
            defaultOpenKeys={["3"]}
            appearance="subtle"
          >
            <Sidenav.Body>
              <Nav>
                <Nav.Item eventKey="1" active icon={<Icon icon="dashboard" />}>
                  Dashboard
                </Nav.Item>
                <Nav.Item eventKey="2" icon={<Icon icon="group" />}>
                  User Group
                </Nav.Item>
                <Dropdown
                  eventKey="3"
                  trigger="hover"
                  title="Advanced"
                  icon={<Icon icon="magic" />}
                  placement="rightStart"
                >
                  <Dropdown.Item eventKey="3-1">Geo</Dropdown.Item>
                  <Dropdown.Item eventKey="3-2">Devices</Dropdown.Item>
                  <Dropdown.Item eventKey="3-3">Brand</Dropdown.Item>
                  <Dropdown.Item eventKey="3-4">Loyalty</Dropdown.Item>
                  <Dropdown.Item eventKey="3-5">Visit Depth</Dropdown.Item>
                </Dropdown>
                <Dropdown
                  eventKey="4"
                  trigger="hover"
                  title="Settings"
                  placement="rightStart"
                  icon={<Icon icon="gear-circle" />}
                >
                  <Dropdown.Item eventKey="4-1">Applications</Dropdown.Item>
                  <Dropdown.Item eventKey="4-2">Websites</Dropdown.Item>
                  <Dropdown.Item eventKey="4-3">Channels</Dropdown.Item>
                  <Dropdown.Item eventKey="4-4">Tags</Dropdown.Item>
                  <Dropdown.Item eventKey="4-5">Versions</Dropdown.Item>
                </Dropdown>
              </Nav>
            </Sidenav.Body>
          </Sidenav>
          <NavToggle expand={expand} onChange={handleToggle} />
        </Sidebar>

        <Container>
          <Header>
            <h2>Page Title</h2>
          </Header>
          <Content>Content</Content>
        </Container>
      </Container>
    </div>
  );
};

export default Home;

样式style.less文件(采用less自动生成css,vscode编辑器插件)

@divider-border-color: 1px solid #e5e5ea;
@show-fake-browser-bg: #f7f7fa;
@default-box-shadow: 4px 4px rgba(0,0,0,.12), 0 0 10px rgba(0,0,0,.06);
@show-fake-browser-content-bg: #fff;

.show-fake-browser {
 border: 1px solid @divider-border-color;
 box-shadow: 0 0.1em 0.5em 0 rgba(0, 0, 0, 0.28);
 border-radius: 4px;
 background: @show-fake-browser-bg;

 &.sidebar-page {
   .rs-sidebar {
     height: calc(100vh);
     box-shadow: @default-box-shadow;
   }

   .rs-sidenav {
     flex: 1 1 auto;
     width: 100%;

     &-collapse-in {
       overflow-y: auto;
     }
   }

   .rs-header {
     padding: 0 20px;
   }

   .rs-content {
     padding: 20px;
     margin: 20px;
     background: @show-fake-browser-content-bg;
   }

   .nav-toggle {
     border-top: @divider-border-color;
   }
 }
}

效果如下图

image.png

相关文章

网友评论

      本文标题:三、使用rsuite ui框架

      本文链接:https://www.haomeiwen.com/subject/zprcgctx.html