Skip to main content

Command Palette

Search for a command to run...

从零开始搭建react项目

Published
3 min read
Q

Learner / Front-End Developer / Social Media Writer. I'm available for everything tech!

首先说明为什么要写这个文章呢?是为了方便以后用react创建项目更方便不用做重复的事。

一、最熟悉的操作利用create-react-app搭建项目
1、全局安装create-react-app,执行:npm install -g create-react-app 命令进行安装
2、进入要安装项目的文件夹,执行:npx create-react-app react-blog 创建一个react-blog项目
3、进入项目cd react-blog,执行:npm start 编译启动项目即可
4、在项目src目录创建views文件夹,放置页面组件,这里我创建了login和main两个文件夹并创建了对应的Login.js、Main.js页面组件

// Login.js
import React from 'react'
export default function Login() { 
 return (  
  <div>Login</div>  
)
}
// Main.jsimport React from 'react'export default function Main() {  return (    <div>Main</div>  )}

5、在项目src目录创建components文件夹,放置公共组件

二、安装配置路由
1、首先安装路由组件,这里我使用的是5.0版本的配置:npm install react-router-dom@5 --save-dev
2、在src目录创建路由文件夹router并创建index,js
3、这里我做了token判断是否登陆,显示对应页面组件

import React from 'react';import { BrowserRouter ,Route, Switch, Redirect} from "react-router-dom";import Login from '@/views/login/Login';  //  导入登陆组件import Main from '@/views/main/Main';  // 导入登陆后要显示的main组件export default function IndexRouter() {  return (    <BrowserRouter>        <Switch>            <Route path='/login'  component={Login}></Route>            {/* <Route path='/'  component={Main}></Route> */}            <Route path='/'  render={()=>{                return localStorage.getItem('token')? <Main></Main> :  <Redirect to='/login'></Redirect>            }}></Route>        </Switch>    </BrowserRouter>  )}

3、修改src/App.js,引入我们的路由入口文件@/router/index

import React from 'react';import './App.css';import RouterView from '@/router/index';function App() {  return (    <RouterView></RouterView>  );}export default App;

好了,这样就可以访问我们的views目录下的login和sandbox页面组件了,哈哈哈~

三、提供将src根路径替换成@的方法
1、安装react-app-rewired:npm install react-app-rewired --save-dev
修改package.json文件

{  // ...  "scripts": {    "start": "react-app-rewired start",    "build": "react-app-rewired build",    "test": "react-app-rewired test",    "eject": "react-scripts eject"  },  // ...}

2、根路径下,添加config-overrides.js

const { resolve } = require('path')module.exports  =  function override(config, env){    config.resolve.alias = {        ...config.resolve.alias,        '@':resolve(__dirname, 'src')    }    return config;}

3、配置好上面文件后,npm start重启项目,在项目里就可以直接使用@符号来代理src目录路径了

四、这里引入的是Ant Design框架,也可以引入其他的UI框架
1、安装框架:npm install antd -D
2、修改 src/App.css,在文件顶部引入 antd/dist/antd.css
@import '~antd/dist/antd.css';
3、我们可以测试一下antd是否引入成功生效,修改 src/view/login/Login.js,引入 antd 的按钮组件

import React from 'react'import { Button } from 'antd';export default function Login() {  return (    <div>        <Button type="primary">Button</Button>    </div>  )}

好了,现在你应该能看到页面上已经有了 antd 的蓝色按钮组件,接下来就可以继续选用其他组件开发应用了。

五、配置main页面组件实现登陆后的布局
1、在components目录创建SideMenu.js菜单组件

import React from 'react';import { withRouter } from 'react-router-dom'; // 使用高阶函数 才能使用props.historyimport { Layout, Menu } from 'antd';import {    UserOutlined} from '@ant-design/icons';const { SubMenu } = Menu;const { Sider } = Layout;function SideMenu(props) {    const menu = [  // 这里一般是后台请求接口获取,这里只做了简单的展示        {            id: 1,            title: "首页",            key: "/home",            children: []        },        {            id: 2,            title: "用户管理",            key: "/user-manage",            children: [                {                    id: 6,                    title: "用户列表",                    key: "/user-manage/list"                }            ]        },    ]    const renderMenu = (menulist) => {        return menulist.map((item) => {            if (item.children?.length > 0) {                return (                    <SubMenu key={item.key} icon={<UserOutlined />} title={item.title}>                        {renderMenu(item.children)}                    </SubMenu>                )            }            return (                <Menu.Item key={item.key} icon={<UserOutlined />} onClick={() => {                    props.history.push(item.key)                }}>{item.title}</Menu.Item>            )        })    }    const selectKey = props.location.pathname    const openkey = '/' + props.location.pathname.split('/')[1]    return (        <Sider trigger={null} collapsible>            <div style={{ display: 'flex', height: '100%', flexDirection: 'column' }}>                <div className="logo">后台管理系统</div>                <Menu theme="dark" mode="inline" style={{ flex: 1, overflow: 'auto' }} selectedKeys={selectKey} defaultOpenKeys={[openkey]}>                    {renderMenu(menu)}                </Menu>            </div>        </Sider>    );}export default withRouter(SideMenu);

2、在components目录创建TopHeader.js公共头部组件

import React, { useState } from 'react';import { Layout ,Dropdown,Avatar,Menu} from 'antd';import {  MenuUnfoldOutlined,  MenuFoldOutlined,  UserOutlined} from '@ant-design/icons';import { withRouter } from 'react-router-dom';const { Header } = Layout;function TopHeader(props) {  const [collapsed,setCollapsed]  =  useState(false)  const changeCollapse = ()=>{    setCollapsed(!collapsed)  }  const menu = (    <Menu>      <Menu.Item  key={'1'}>        超级管理员      </Menu.Item>      <Menu.Item  key={'2'} danger onClick={()=>{        localStorage.removeItem("token")        props.history.replace('/login')      }}>        退出      </Menu.Item>    </Menu>  );  return (        <Header className="site-layout-background" style={{ padding: '0 16px'}}>            {collapsed?<MenuUnfoldOutlined  onClick={changeCollapse}/>:<MenuFoldOutlined  onClick={changeCollapse}/>}            <div  style={{float:'right'}}>              <span style={{paddingRight:'10px'}}>欢迎<span  style={{color:'#1890ff'}}>admin</span>回来</span>              <Dropdown overlay={menu} placement="bottomRight" arrow>                  <Avatar size="large" icon={<UserOutlined />} />              </Dropdown>            </div>        </Header>  );}export default withRouter(TopHeader);

3、在src/router创建其他路由配置MainRouter.js

import React from 'react'import { Switch,Route ,Redirect} from 'react-router-dom';import Home from '@/views/home/Home';import UserList from '@/views/user-manage/UserList';export default function MainRouter() {  return (    <Switch>        <Route  path='/home' component={Home}></Route>        <Route  path='/user-manage/list' component={UserList}></Route>        <Redirect from="/"  to="/home" exact></Redirect>    </Switch>  )}

4、实现Main.js页面组件

import React from 'react';import SideMenu from '@/components/SideMenu';import TopHeader from '@/components/TopHeader';import MainRouter from '@/router/MainRouter';import { Layout } from 'antd';const {Content } = Layout;export default function Main() {  return(    <Layout>      <SideMenu></SideMenu>      <Layout className='site-layout'>          <TopHeader></TopHeader>          <Content            className="site-layout-background"            style={{              margin: '24px 16px',              padding: 24,              minHeight: 280,              overflow:'auto'            }}          >              <MainRouter></MainRouter>          </Content>      </Layout>          </Layout>  );}

5、所用到的css样式,这里我全部写在了App.css里

@import '~antd/dist/antd.css';html,body{  width: 100%;  height: 100%;}#root,.ant-layout{  height: 100%;}.ant-layout-header{  background-color: #fff;}.site-layout .site-layout-background{  background-color: #fff;}.logo{  background-color: rgba(255, 255, 255, 0.3);  color: #fff;  font-size: 20px;  line-height: 35px;  text-align: center;  margin: 10px;}

6、完成以上配置搭建后显示出来的效果

首页面

More from this blog

一些常见的移动端适配方案,你了解吗?

移动端设备的尺寸很多,而 UI 设计稿一般只会基于一个尺寸(一般是 375px 或 750px )进行设计。 目前移动端适配方案有多种,本文将介绍一些具有代表性的适配方案。 媒体查询 @media CSS3 中的媒体查询属性 @media 分别为不同屏幕尺寸的移动设备编写不同尺寸的 css 属性,示例如下所示: /* <375px */ @media screen and (max-width:375px) { .box { width: 100%; } } /* >=375p...

Feb 16, 20232 min read

Front-end Responsive Layout Principle and Scheme

就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。 响应式布局指的是同一页面在不同屏幕尺寸下有不同的布局。传统的开发方式是PC端开发一套,手机端再开发一套,而使用响应式布局只要开发一套就够,缺点就是CSS比较重。下面是博客网站对不同设备适配后的结果,分别是iPhone5/SE,iphone6/7/8,iphone 6/7/8 plus,ipad pro,dell台式宽屏(1440 X 900)。 寸下有不同的布局。传统的开发方式是PC端开发一套,手机端再开发一套,而使用响应式布局...

Jan 9, 20236 min read

2022's Conclusion

工作方面 主业: 从互联网公司离职,拿到数据产品的offer,涨薪差不多有60%,但我放弃了,我开始进入web3领域甚至开始转码。 这个行业,尤其在深圳充满了骗子,rug,cx等等不好的东西,身边很多朋友也都很抗拒,不理解。但我相信web3就是未来,所以我还是想冒险一把。也因此机缘巧合我去到了大理,在那里有纯粹的web3开发者,人均builder,让我更加坚定了web3的未来。 所以我没有去公司上班,我选择在web3探索,也跟姊妹一起做了我们的web3社区,还参加了开发者活动,真正去开发项目,还...

Jan 5, 20231 min read

2022: My exploring on Web3

2022年是我的疯狂元年。 #无法融入圈子 我对工作失去了兴趣,开始探索web3,可在深圳我所接触到的web3,搞挖矿的居多,还有defi/搞公链,线下大会各种老头老太,不说我很年轻吧,但我总觉得格格不入,聊的内容都是各种盘各种投机项目,加的线上社区呢,又都是一群蝻的,虽然聊项目但很多时候是在开车,各种小黄图各种pornhub内容,对于我来说真的很痛苦,所以我在想我真的是融于不了web3这个圈子。离开吧但我也有些不甘心,从还没接触web3就一直听着各种造富神话,我没有捞到钱就算了,还付出时间和金...

Jan 4, 20231 min read
2022: My exploring on Web3

qiuqiu

5 posts