create-react-app + antd 后台管理项目创建详细步骤

一、 创建项目:

1. npm i create-react-app -g  --> 全局安装react脚手架(进度条卡住时可按下回车)

2. create-react-app react-demo --> 创建一个名为react-demo的项目

3. cd react-demo --> 进入该项目

4. npm/yarn start --> 启动项目(推荐yarn,它和react都是Facebook开发)

ps:
vscode-react配置:
    1.settings.json写入:
    // 标签自动闭合
    "emmet.includeLanguages": {
        "javascript": "javascriptreact"
    }
    2.插件:ES7 React/Redux/GraphQL/React-Native snippets

yarn add prop-types // 安装props限制的库
用法:
    import PropTypes from 'prop-types'
    static propTypes = {
        todos: PropTypes.func.isRequired
    }
yarn add uuid(体积较大) OR yarn add nanoid(体积较小) // 生成uuid的库
用法:
    import { nanoid } from 'nanoid'
    console.log(nanoid())

二、文件分析:

1. public/manifest.json --> 应用加壳时的配置文件;
2. public/robots.text --> 爬虫规则文件;
3. src/index.js --> 项目入口文件;
4. src/reportWebVitals --> 记录页面性能;
5. src/setupTests.js --> 组件测试,需要配合jest-dom库使用;
6. src/App.test.js --> 用于给app做测试;
7. yarn.lock --> yarn的缓存文件;

区分组件和js文件:
1. 组件以.jsx结尾,功能文件以js结尾;
2. 组件首字母大小,功能文件全部小写;

三、上传到github

1. github创建一个仓库 repositories

2. git init --> 在项目路径下初始化一个仓库

3. git add . 

4. gc -m 'xxx'

5. git remote add origin https://github.com/xxx.git
--> 建立远程仓库
6. git push -u origin master --> 将本地仓库push到远程仓库

ps:本地删除.eslintcache文件不生效,因为已经push到了远端:
git rm .eslintcache -r // 删除需要被忽略的文件
add -> commit -> push 到远端服务器

四、引入UI库:

1. npm i antd -S

2. 引入到项目中:

(1) 全局引入(打包后比较大,建议按需引入):

在项目入口引入所有样式:import antd/dist/antd.css

在项目中引入antd组件:import { Button } from 'antd'

(2) 按需加载(3种方法):

1、引入独立的组件和样式(基本不采用):
import Button from 'antd/lib/button';
import 'antd/lib/button/style';
2、暴露配置 + babel-plugin-import:
npm run eject(暴露webpack的配置,不可逆)
npm i babel-plugin-import -S
修改package.json:
    "babel": {
      "presets": [
        "react-app"
      ],
      "plugins": [
    +   ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
      ]
    }
项目中直接引入antd组件,不需另外引入css:import { Button } from 'antd'
参考:https://www.xiaoweihuang.me/2018/11/14/two-ways-to-import-antd-into-react-app/
https://juejin.im/post/5b20a3546fb9a01e312833d5
3、推荐:react-app-rewire + babel-plugin-import:

yarn add react-app-rewired customize-cra

/* package.json */
"scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test",
}

yarn add babel-plugin-import

/* 根目录新建config-overrides.js */
const { override, fixBabelImports } = require('customize-cra');
 module.exports = override(
   fixBabelImports('import', {
     libraryName: 'antd',
     libraryDirectory: 'es',
     style: 'css',
   }),
 );

3、自定义主题、用@代替src路径

yarn add less less-loader

/* 修改 config-overrides.js */
- const { override, fixBabelImports } = require('customize-cra');
+ const { override, fixBabelImports, addLessLoader } = require('customize-cra');
+ const path = require('path')

+ function resolve(dir) {
+  return path.join(__dirname, dir)
+}

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
-   style: 'css',
+   style: true,
  }),
+ addLessLoader({
+   lessOptions:{
+     javascriptEnabled: true,
+     modifyVars: { 
+       '@primary-color': '#1DA57A' 
+     }
+   }
+ }),
+ addWebpackAlias({
+     '@': resolve('src')
+ })
);

五、路由:

1. 安装路由器:yarn add react-router-dom -S
2. app.js中引入:
import { BrowserRouter, Route, Switch } from 'react-router-dom'
3. 使用:
<BrowserRouter>
  <Switch> {/* 只匹配其中一个 */}
    <Route path='/login' component={Login}></Route>
    <Route path='/' component={Admin}></Route>
  </Switch>
</BrowserRouter>
4. ps:
react路由的两种模式:HashRouter(hash模式),BrowserRouter(history模式)

六、开发环境跨域

1. yarn add http-proxy-middleware

2. src文件夹根目录添加一个setupProxy.js文件:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
  app.use( // 可配置多个代理
    '/api',
    createProxyMiddleware({
      target: 'http://111.11.11.111',
      changeOrigin: true,
      pathRewrite: {
        '^/api': ''
      }
    })
  )
}

七、高阶函数

  1. 定义:高阶函数是一类特别的函数。
  2. 类型:接收函数类型的参数,或返回值是函数。
  3. 常见的高阶函数:
1、定时器
2、Promise的then()
3、数组遍历相关的方法:forEach()/filter()/map()/reduce()/find()/findIndex()
4、函数对象的bind()
5、Form.create()() / getFieldDecorator()()
  1. 高阶函数更新动态,更加具有扩展性

六、高阶组件

1. 本质是一个函数,接收一个组件(被包装组件),返回一个新的组件(包装组件)。
新组件内部渲染,包装组件会向被包装组件传入特定属性。 
2. 作用:扩展某个组件的功能。
3. 高阶组件也是高阶函数:接收一个组件函数,返回一个新的组件函数。
4. withRouter:向非路由组件传递history,location,match三个属性。

八、模拟前端需要的数据

1. yarn add json-server mockjs nodemon (json-server 支持跨域)
2. cd 自定义的存储假数据的文件夹(mock),新建一个db.js文件.
db.js 中:
    let Mock = require('mockjs')
    let Random = Mock.Random
    module.exports = function() {
      return data
    }
3. 启动服务的命令: json-server db.js -p 3001 -c ./config.js
4. 也可以根目录的package.json,写入
{
  "scripts": {
    "mock": "json-server db.js --port 3001"
  }
}
再次启动用npm run mock 即可
5. 项目根目录下的package.json中可以配置代理:"proxy": "http://localhost:3001"

参考:
//www.greatytc.com/p/20a681a9c645
https://www.cnblogs.com/fly_dragon/p/9150732.html

九、封装请求接口的模块

1. 封装常用的几种接口请求方式的方法,并暴露出来。
2. 使用async和await可以简化promise的then和catch,以同步编码方式实现异步流程。
3. await不能单独使用,在返回promise的表达式左侧写await,await所在的最内层函数的左侧写async。
4. 优化:
    统一处理请求异常:
        在外层包一个自己创建的promise对象,在请求成功时resolve(res),
        在请求失败时不reject(err),而是显示错误提示。

杂7杂8

1. render中第一行写debugger,即可在source中断点调试;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351