搭建一个react项目

搭建react整体框架

1、电脑里新建文件夹,用vscode打开文件夹
2、npm create react-app 项目名称    如 npm create react-app huihuidemo / yarn create react-app huihuidemo
3、cd 项目名称    如 cd huihuidemo
4、npm run start
5、安装antd    cnpm i antd -S / yarn add antd 
6、在css文件中最顶部引入  @import '~antd/dist/antd.css';   //分号不能丢
    (也可在js文件里直接引入,  import 'antd/dist/antd.css';  )
7、在js jsx文件中引入需要使用的组件   import {Button,Icon...} from 'antd';
8、(以后必要,见下方)安装路由和ajax请求插件

具体可见antd官网   https://ant.design/docs/react/use-with-create-react-app-cn
解决react脚手架不支持less的问题
1、安装less相关包    cnpm i less less-loader -S / yarn add less less-loader 
2、暴露webpack    npm run eject / yarn eject   (此语句执行后会有config和scripts文件夹生成)   
      若出现以下错误: (Remove untracked files, stash or commit any changes, and try again.)
      是因为我们使用脚手架创建一个项目的时候,自动给我们增加了一个.gitignore文件,而我们本地却没有文件仓库
      这样解决: 先输入  git add .      再输入  git commit -m 'up' 之后再yarn eject即可
3、查找到config/webpack.config.js的const cssRegex = /\.css$/;  做出如下改动
    - const cssRegex = /\.css$/;
    + const cssRegex = /\.(css|less)$/;
4、找到webpack.config.js的const loaders ,在里面最后一组后面添加
    { loader: require.resolve('less-loader') },
添加之后是这样的:

const loaders = [
      isEnvDevelopment && require.resolve('style-loader'),
      isEnvProduction && {...
       },
      {...
      },
      {...
      },
      {
        loader: require.resolve('less-loader')
      },
    ].filter(Boolean);

然后重启项目即可(记得要重启项目,否则不生效)
5、下载必须的安装包:npm i axios -S      npm i react-router-dom -S     npm i react-cookies -S
6、npm run start 开启项目吧

ps:若npm start失败,出现这个问题(Build fails after eject: Cannot find module '@babel/plugin-transform-react-jsx' )
则可以
1、删除 node_modules 文件夹
2、运行 yarn
3、cnpm i less less-loader -S / yarn add less less-loader
3、重新 npm start / yarn start

react项目文件层次架构

config
public
  |__static
       |__ueditor  //百度编辑器
scripts
src
|__utils    //封装的公共机制,共用组件 
     |__iconfont.js  //配置iconfont的链接   
|__api   //配置接口的地方
     |__config.js  //配置服务器地址
     |__index.js  //引入接口并暴露
     |__statecode.js  //错误提醒状态码模块
     |__login.js  //登录模块接口
|__image 
|__pages   //用于存放项目的各个模块页面
     |__usercenter  //用户中心模块
           |__userlogin.js   
           |__userchange.js
           |__usercenter.less   //用户中心模块less
           |__usercenterRouter.js  //用户中心模块的路由
     |__order  //订单模块
           |__details.js
           |__userorder.js
           |__order.less  
           |__orderRouter.js
     |__commodity
           |__commodityList.js
           |__commodityPrice.js
           |__commodity.less
           |__commodityRouter.js  
     |__common.less  //用于存放公共样式
     |__index.js    //首页,Link一般在此页
     |__index.less   //首页的less
|__index.js
|__index.css
|__router.js  //总路由部分
|__app.js   //设置最顶级路由
src/utils/iconfont.js
module.exports={
        iconUrl:"//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js"   //注意这里是js后缀的链接,不要用css后缀的那个链接
    }
src/api/config.js
module.exports={
    base:"http://demo.huihui.net:8000"
}
src/api/index.js
import codes from './statecode.js';  //状态码页面
import login from './login.js';  //登录页面相关
import userCenter from './userCenter.js';  //用户中心

export default {
    stateCode:codes,
    ...login,
    ...userCenter,
}
src/api/statecode.js
export default{
    "-1":"服务异常",
    "0":"成功",
    "1001":"参数错误",
    "1002":"用户名或密码错误",
    "1003":"验证码错误",
    "1004":"两次密码不一致",
    "1005":"账号已存在",
}
src/api/login.js
import axios from 'axios';
import { base } from "./config.js";
import { message  } from 'antd';
import cookie from 'react-cookies'

export default {
  //用户登陆
  async login(params){
    return  await axios.post(`${base}/User/login`,params).then((res)=>{
      return res.data;
    }).catch((error)=>{
      message.error('服务器出错')
    });
  },
}
src/app.js
import React, { Component } from 'react';

export default class App extends Component {
  render() {
    return (
      <div>
        {this.props.children}
      </div>
    );
  }
}
src/pages/order/order.js
import React from 'react';
import './order.less';
import '../common.less';

import {Card} from 'antd';

export default class QuickOrder extends React.Component{

    render(){

        return(
            <div className="quickOrder">
                <div className="container">
                    <div className="content">
                        <Card title="快速打单">

                        </Card>
                    </div>
                </div>
            </div>
        );
    }
}
src/pages/order/orderRouter.js
import React from 'react';
import {Route,Switch,Redirect} from 'react-router-dom';

//快速打单
import QuickOrder from './quickOrder';
//退款维权
import RefundRights from './refundRights';
//评价管理
import ReviewManage from './reviewManage';
//订单详情
import OrderDetails from './orderDetails';

export default class OrderRouter extends React.Component{

    render(){

        return(
            <div>
                <main>
                    <Switch>
                        <Route path="/store/order/quickOrder" component={QuickOrder} />
                        <Route path="/store/order/refundRights" component={RefundRights} />
                        <Route path="/store/order/reviewManage" component={ReviewManage} />
                        <Route path="/store/order/orderDetails/:id" component={OrderDetails} />
                        <Redirect to="/store/order" />
                    </Switch>
                </main>
            </div>
        );
    }
}