React全家桶开发后台管理系统项目笔记

前言

本文基于React共享单车后台管理系统的开发进行学习记录,内含React生态系统的整体介绍及相关内容整理,方便自己查阅,也希望对小伙伴有所帮助
React全家桶开发后台管理系统项目笔记_第1张图片

React基本介绍

Facebook开源的一个JavaScript库

React结合生态构成的一个MV* 框架

React特点

  • Declarative(声明式编码)
  • Component-Based(组件化编码)
  • 高效-高效的Dom Diff算法,最小化页面重绘
  • 单向数据流

生态介绍

Vue生态:

Vue+Vue-Router+Vuex+Axios+Babel+Webpack

React生态:

React+React-Router-Redux+Axios+Babel+Webpack

React生命周期介绍

getDefaultProps

通过这个方法,来初始化一个Props属性,Props就来自于父组件

getInitialState

初始化state,可以直接在constructor中定义this.state

componentwillMount

组件加载时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state

render

是一个React组件必须定义的生命周期,用来渲染dom,是使用最多,最重要的放方法

componetDidMount

组件渲染之后调用,只调用一次

componentwillReceiveProps

组件加载时不调用,组件接受新的props时调用

shouldComponentUpdate

组件接收新的props或者state时调用

componentwillUpdate

在组件接收新的props或者state但还没有render时被调用,在初始化时不会被调用

componentDidUpdate

组件完成更新后立即调用,在初始化时不会被调用

componentWillUnmount

在组件从DOM中移除之前立刻被调用

Redux

Redux基本介绍

单项数据流:

从父组件流向子组件,兄弟组件无法共享数据

state:

React中的状态,是只读对象,不可直接修改

Reducer:

基本函数,用于对state的业务处理

Action:

普通对象,用于描述事件行为,改变state

Redux安装

yarn add redux --save
yarn add react-redux --save

Redux集成

创建Action模块

创建Reducer模块

创建Store模块

通过connect方法将React组件和Redux连接起来

添加Provider作为项目的根组件,用于数据的存储

Redux调试工具安装

在Chrome中安装Redux Devtools扩展

yarn add redux-devtools-extension

React脚手架、Yarn介绍

安装React脚手架

npm install -g create-react-app  //安装这个脚手架
create-react-app may-app    //初始化一个项目
cd my-app   //切换
npm start   //启动进入

什么是Yarn?

Yarn是新一代的包管理工具

为什么使用Yarn?

  • 速度快
  • 安装版本统一,更安全
  • 更简洁的输出
  • 更好的语义化

如何使用Yarn?

yarn init   //初始化一个项目
yarn add    //安装一个包
yarn remove     //删除一个包
yarn / yarn install     //安装依赖包

源码仓库地址

源码地址:https://github.com/shifengmin...

搭建运行环境

安装脚手架

npm install -g create-react-app

查看版本号,看是否安装成功

create-react-app --version

初始化这个项目

create-react-app imoocmanager

切换

cd imoocmanager

启动进入

npm start

安装yarn

npm install -g yarn

查看版本号,看是否安装好

yarn --version

注:

这个项目没有webpack配置,这就是脚手架的特色,脚手架把webpack的配置全部给它封装起来了,所以只需要关心src的源码部分

项目所需要安装的插件

引入antd(安装支付宝的UI框架)

yarn add antd --save

加入其它依赖

yarn add axios --save  //Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中
yarn add jsonp --save //跨域请求
yarn add less --save //(2.7.3的版本),超过此版本,antd按需加载报错.bezierEasingMixin();
yarn add less-loader --save  //antd 用的是less预处理,所以也添加less,保持一致。
yarn add moment --save //日期处理
yarn add babel --svae  //转换react jsx语法和转换es6 语法后才能兼容智障浏览器
yarn add babel-polyfill --save 
yarn add babel-plugin-import --save //不添加的话 IE会报错TypeError: 对象不支持“startsWith”属性或方法

开发过程中重点问题总结

主页面架构设计

页面结构定义

  • 左侧导航栏,右侧显示内容
  • 右侧显示内容分别分为Header、中Content和下Footer部分

目录结构定义

  • 定义components包,分别加入Footer、Header、NavLeft包,内部加入index.js文件,导入时可以导入到包的级别,系统会自动寻找包下的index.js文件
  • 定义style包,内部加入common.less文件定义全局样式

栅格系统使用

  • 栅格系统一共24列
  • Antd中行用Row组件,列使用Col组件,列存在span属性(span={长度值}的方式写入span属性),同一Row下的Col span总和为24

calc计算方法使用

  • clac()是less中动态计算长度值
  • 任何长度值都可以用clac()函数进行计算
  • calc(100vh):vh的含义相当于1%,100vh即是100%

例子使用:

width:clac(100%-50px)   //表示宽度属性是整个布局的100%减去50px的长度

关于less

  • less是预编辑器
  • 在div下有a标签,想设定a的样式和div的样式,在less中可以在定义时嵌套
//css中
div{...}
div a{...}

//less中
div{
    ...
    a:{
      ...  
    }
}
  • less可以使用定义的变量
@colorA:'red'
div{
    color:@colorA
    a:{
        color:black  
    }
}

实例公共代码

admin.js

import React,{Component} from 'react'
import { Row,Col } from 'antd';
import Header from './components/Headers/index'
import Footer from './components/Footer/index'
import NavLeft from './components/NavLeft/index'
import './style/common.less'
// import Row from './components/NavLeft/index'
export default class Admin extends Component{
    render (){
        return(
           
               
                   
               
               
                   
{this.props.children}
) } }

src/style/commmon.less

.container{
    display: flex;
    .nav-left{
        background-color:#001529;
        color: #ffffff;
        height: calc(100vh);
    }
    .main{
        height: calc(100vh);
        background-color: @colorL;
        overflow: auto;
    }
    .content{
        position: relative;
        padding: 20px;
    }
}

实例代码-左侧导航栏内容

src/components/NavLeft/index.js

import React,{Component} from 'react'
import { Menu, Icon } from 'antd';
import MenuConfig from './../../config/menuConfig'
import './index.less'

const SubMenu = Menu.SubMenu;

export default class NavLeft extends Component{
    componentWillMount(){
        const menuTreeNode = this.renderMenu(MenuConfig);

        this.setState ({
            menuTreeNode
        })
    }
    //菜单渲染
    renderMenu =(data)=>{
        return data.map((item)=>{
            if(item.children){
                return (
                    
                        {this.renderMenu(item.children)}
                    
                )
            }
            return {item.title}
        })
    }
    render (){
        return(
            

BikeSharing

{ this.state.menuTreeNode }
) } }

在public文件夹下添加assets文件夹,放置logo-ant.svg图片

注意:public文件是build文件是build之后存储内容的文件,通常内部放置静态资源,public下的文件内容在访问时全是通过根目录直接访问文件地址

编写Navleft组件内容/src/Navleft/index.js,使用antd中的Menu和Icon组件,Menu组件的theme属性可以设置菜单样式。对应的SubMenu组件需要设置title和key属性值,Menu.Item组件需要设置title和key属性值和组件内容

src/NavLeft/index.less

编写Navleft组件样式
.logo{
    line-height: 90px;
    padding-left: 20px;
    background-color: #002140;
    img{
        height: 35px;
    }
    h1{
        color: #ffffff;
        font-size: 20px;
        display: inline-block;
        vertical-align: middle;
        margin: 0 0 0 10px;
    }
}

src/config/menuConfig.js

const menuList = [
    {
        title:'首页',
        key:'/admin/home'
    },
    {
        title:'UI',
        key:'/admin/ui',
        children:[
            {
                title:'按钮',
                key:'/admin/ui/buttons',
            },
            {
                title:'弹框',
                key:'/admin/ui/modals',
            },
            {
                title:'Loading',
                key:'/admin/ui/loadings',
            },
            {
                title:'通知提醒',
                key:'/admin/ui/notification',
            },
            {
                title:'全局Message',
                key:'/admin/ui/messages',
            },
            {
                title:'Tab页签',
                key:'/admin/ui/tabs',
            },
            {
                title:'图片画廊',
                key:'/admin/ui/gallery',
            },
            {
                title:'轮播图',
                key:'/admin/ui/carousel',
            }
        ]
    },
    {
        title:'表单',
        key:'/admin/form',
        children:[
            {
                title:'登录',
                key:'/admin/form/login',
            },
            {
                title:'注册',
                key:'/admin/form/reg',
            }
        ]
    },
    {
        title:'表格',
        key:'/admin/table',
        children:[
            {
                title:'基础表格',
                key:'/admin/table/basic',
            },
            {
                title:'高级表格',
                key:'/admin/table/high',
            }
        ]
    },
    {
        title:'富文本',
        key:'/admin/rich'
    },
    {
        title:'城市管理',
        key:'/admin/city'
    },
    {
        title:'订单管理',
        key:'/admin/order',
        btnList:[
            {
                title:'订单详情',
                key:'detail'
            },
            {
                title:'结束订单',
                key:'finish'
            }
        ]
    },
    {
        title:'员工管理',
        key:'/admin/user'
    },
    {
        title:'车辆地图',
        key:'/admin/bikeMap'
    },
    {
        title:'图标',
        key:'/admin/charts',
        children:[
            {
                title:'柱形图',
                key:'/admin/charts/bar'
            },
            {
                title:'饼图',
                key:'/admin/charts/pie'
            },
            {
                title:'折线图',
                key:'/admin/charts/line'
            },
        ]
    },
    {
        title:'权限设置',
        key:'/admin/permission'
    },
];
export default menuList;

在config下编写manuConfig.js返回导航栏内容title和key

效果如下:
React全家桶开发后台管理系统项目笔记_第2张图片

实例代码首页头部内容

利用jsonp可以解决跨域问题(所谓跨域就是跨域名,跨端口,跨协议)

web页面上调用js文件时则不受跨域影响(且凡是有src属性的标签都具有跨域能力,如

你可能感兴趣的:(前端,npm,javascript,es6,react.js)