一、 创建项目:
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、Promise的then()
3、数组遍历相关的方法:forEach()/filter()/map()/reduce()/find()/findIndex()
4、函数对象的bind()
5、Form.create()() / getFieldDecorator()()
- 高阶函数更新动态,更加具有扩展性
六、高阶组件
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中断点调试;