从入门到放弃之react大盘点 [持续更新ing...]

一、创建 react 项目

1、安装

方式一:npm init react-app 项目名

方式二:yarn create react-app 项目名

方式三:npx create-react-app 项目名  【推荐:无需安装脚手架包就可以使用】

进入项目启动

cd 项目名

yarn start

二、配置路由

1、安装路由

yarn add react-router-dom@5.2.0 【常用版本,也可以不加】

2、配置 

五种路由模式

1、BrowserRouter:浏览器的路由方式【常用】

2、HashRouter:路径前有#号为哈希值,【优点:防止刷新找不到路径】

3、MemoryRouter:没有路由history,所有路由保存在内存里,也不能前进后退

4、NativeRouter:经常配合ReactNative使用,多用于移动端

5、StaticRouter:设置静态路由,需要和后台服务器配合设置,比如设置服务端渲染时使用 

这里我用 HashRouter 模式演示

我的页面

 快速创建页面结构快捷键:ref 或者 rcc,

前提:先安装react工具

router/index.js

import Index from "../views/index/index";
import Msg from "../views/msg/msg";
import  Error from "../views/error/error"; 
  const routes=[
    {
        path:'/',
        element:<Index />
    },
    {
        path:'/msg',
        element:<Msg />
    },
    {
        path:'/error',
        element:<Error/>
    }
]
export default routes

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { HashRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <HashRouter>
    <App />
  </HashRouter>
);

 App.js

import React from "react";
import { useRoutes, Link } from "react-router-dom";
import router from './router/index'
import './App.css'
function App() {
  return (
    <div className="App">
      <div className="list">
        <p className="msg"> <Link to="/msg">好消息</Link></p>
        <p> <Link to="/">首页</Link></p>
      </div>
      <div>{useRoutes(router)}</div>
    </div>
  );
}

export default App;

三、安装ant design 组件库

ui库地址:ant-design

1、安装命令

npm install antd --save

2、配置 App.js

import React from 'react';
import { Button } from 'antd';

const App = () => (
  <div className="App">
    <Button type="primary">Button</Button>
  </div>
);

export default App;
 
四、使用ant design布局

 

 1、创建页面和路由

2、引入Layout布局

 App.js

import React, { useState } from 'react';
import {
  MenuFoldOutlined,
  MenuUnfoldOutlined,
  UploadOutlined,
  UserOutlined,
  VideoCameraOutlined,
} from '@ant-design/icons';
import { Layout, Menu, Button, theme } from 'antd';
const { Header, Sider, Content } = Layout;
const App = () => {
  const [collapsed, setCollapsed] = useState(false);
  const {
    token: { colorBgContainer },
  } = theme.useToken();
  return (
    <Layout>
      <Sider trigger={null} collapsible collapsed={collapsed}>
        <div className="demo-logo-vertical" />
        <Menu
          theme="dark"
          mode="inline"
          defaultSelectedKeys={['1']}
          items={[
            {
              key: '1',
              icon: <UserOutlined />,
              label: 'nav 1',
            },
            {
              key: '2',
              icon: <VideoCameraOutlined />,
              label: 'nav 2',
            },
            {
              key: '3',
              icon: <UploadOutlined />,
              label: 'nav 3',
            },
          ]}
        />
      </Sider>
      <Layout>
        <Header
          style={{
            padding: 0,
            background: colorBgContainer,
          }}
        >
          <Button
            type="text"
            icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
            onClick={() => setCollapsed(!collapsed)}
            style={{
              fontSize: '16px',
              width: 64,
              height: 64,
            }}
          />
        </Header>
        <Content
          style={{
            margin: '24px 16px',
            padding: 24,
            minHeight: 280,
            background: colorBgContainer,
          }}
        >
          Content
        </Content>
      </Layout>
    </Layout>
  );
};
export default App;

tip:如果layout未占满全屏,设置样式即可

#root,html,body{
    width: 100%;
    height: 100%;
}
.ant-layout {
    display: flex;
    width: 100%;
    min-height: 100%;
}
五、设置动态导航菜单
import './App.css'
import './assets/css/normalize.css'
import './assets/css/reset.css'
import React, { useState } from 'react';
import { MenuFoldOutlined, MenuUnfoldOutlined, } from '@ant-design/icons';
import { useRoutes, useNavigate, } from 'react-router-dom'
import { Layout, Menu, Button, theme } from 'antd';
import router from "./router/index";
const { Header, Sider, Content } = Layout;
const { SubMenu } = Menu;
const App = () => {
  const [collapsed, setCollapsed] = useState(false);
  const { token: { colorBgContainer } } = theme.useToken();
  let element = useRoutes(router)
  const navigate = useNavigate()
  const [defaultKey, setDefaultKey] = useState('')
  const handleClick = (e) => {
    navigate(e.key)
    setDefaultKey(e.key)
  };
  return (
    <Layout>
      <Sider trigger={'你好,少年'} collapsible collapsed={collapsed}>
        <div className="demo-logo-vertical" />
        <Menu
          theme="dark"
          mode="inline"
          onClick={handleClick}
          selectedKeys={[defaultKey]}
        >
          {
            // 分为多级菜单和单个菜单
            router.map(item => {
              if (item.children) {
                return <SubMenu key={item.path} title={item.mate.title}>
                  {
                    item.children.map(child => {
                      return <Menu.Item key={child.path}>{child.mate.title}</Menu.Item>
                    })
                  }
                </SubMenu>
              }
              return <Menu.Item key={item.path}>{item.mate.title}</Menu.Item>
            })
          }
        </Menu>
      </Sider>
      <Layout>
        <Header
          style={{
            padding: 0,
            background: colorBgContainer,
          }}
        >
          <Button
            type="text"
            icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
            onClick={() => setCollapsed(!collapsed)}
            style={{
              fontSize: '16px',
              width: 64,
              height: 64,
            }}
          />
        </Header>
        <Content
          style={{
            margin: '24px 16px',
            padding: 24,
            minHeight: 280,
            background: colorBgContainer,
          }}
        >
          {/* 点击显示对应内容 */}
          {element}
        </Content>
      </Layout>
    </Layout>
  );
};
export default App;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值