一、 創(chuàng)建項(xiàng)目:
1. npm i create-react-app -g --> 全局安裝react腳手架(進(jìn)度條卡住時(shí)可按下回車)
2. create-react-app react-demo --> 創(chuàng)建一個(gè)名為react-demo的項(xiàng)目
3. cd react-demo --> 進(jìn)入該項(xiàng)目
4. npm/yarn start --> 啟動(dòng)項(xiàng)目(推薦yarn,它和react都是Facebook開發(fā))
ps:
vscode-react配置:
1.settings.json寫入:
// 標(biāo)簽自動(dòng)閉合
"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 --> 應(yīng)用加殼時(shí)的配置文件;
2. public/robots.text --> 爬蟲規(guī)則文件;
3. src/index.js --> 項(xiàng)目入口文件;
4. src/reportWebVitals --> 記錄頁面性能;
5. src/setupTests.js --> 組件測(cè)試,需要配合jest-dom庫使用;
6. src/App.test.js --> 用于給app做測(cè)試;
7. yarn.lock --> yarn的緩存文件;
區(qū)分組件和js文件:
1. 組件以.jsx結(jié)尾,功能文件以js結(jié)尾;
2. 組件首字母大小,功能文件全部小寫;
三、上傳到github
1. github創(chuàng)建一個(gè)倉庫 repositories
2. git init --> 在項(xiàng)目路徑下初始化一個(gè)倉庫
3. git add .
4. gc -m 'xxx'
5. git remote add origin https://github.com/xxx.git
--> 建立遠(yuǎn)程倉庫
6. git push -u origin master --> 將本地倉庫push到遠(yuǎn)程倉庫
ps:本地刪除.eslintcache文件不生效,因?yàn)橐呀?jīng)push到了遠(yuǎn)端:
git rm .eslintcache -r // 刪除需要被忽略的文件
add -> commit -> push 到遠(yuǎn)端服務(wù)器
四、引入U(xiǎn)I庫:
1. npm i antd -S
2. 引入到項(xiàng)目中:
(1) 全局引入(打包后比較大,建議按需引入):
在項(xiàng)目入口引入所有樣式:import antd/dist/antd.css
在項(xiàng)目中引入antd組件:import { Button } from 'antd'
(2) 按需加載(3種方法):
1、引入獨(dú)立的組件和樣式(基本不采用):
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" }]
]
}
項(xiàng)目中直接引入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> {/* 只匹配其中一個(gè) */}
<Route path='/login' component={Login}></Route>
<Route path='/' component={Admin}></Route>
</Switch>
</BrowserRouter>
4. ps:
react路由的兩種模式:HashRouter(hash模式),BrowserRouter(history模式)
六、開發(fā)環(huán)境跨域
1. yarn add http-proxy-middleware
2. src文件夾根目錄添加一個(gè)setupProxy.js文件:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
app.use( // 可配置多個(gè)代理
'/api',
createProxyMiddleware({
target: 'http://111.11.11.111',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
})
)
}
七、高階函數(shù)
- 定義:高階函數(shù)是一類特別的函數(shù)。
- 類型:接收函數(shù)類型的參數(shù),或返回值是函數(shù)。
- 常見的高階函數(shù):
1、定時(shí)器
2、Promise的then()
3、數(shù)組遍歷相關(guān)的方法:forEach()/filter()/map()/reduce()/find()/findIndex()
4、函數(shù)對(duì)象的bind()
5、Form.create()() / getFieldDecorator()()
- 高階函數(shù)更新動(dòng)態(tài),更加具有擴(kuò)展性
六、高階組件
1. 本質(zhì)是一個(gè)函數(shù),接收一個(gè)組件(被包裝組件),返回一個(gè)新的組件(包裝組件)。
新組件內(nèi)部渲染,包裝組件會(huì)向被包裝組件傳入特定屬性。
2. 作用:擴(kuò)展某個(gè)組件的功能。
3. 高階組件也是高階函數(shù):接收一個(gè)組件函數(shù),返回一個(gè)新的組件函數(shù)。
4. withRouter:向非路由組件傳遞history,location,match三個(gè)屬性。
八、模擬前端需要的數(shù)據(jù)
1. yarn add json-server mockjs nodemon (json-server 支持跨域)
2. cd 自定義的存儲(chǔ)假數(shù)據(jù)的文件夾(mock),新建一個(gè)db.js文件.
db.js 中:
let Mock = require('mockjs')
let Random = Mock.Random
module.exports = function() {
return data
}
3. 啟動(dòng)服務(wù)的命令: json-server db.js -p 3001 -c ./config.js
4. 也可以根目錄的package.json,寫入
{
"scripts": {
"mock": "json-server db.js --port 3001"
}
}
再次啟動(dòng)用npm run mock 即可
5. 項(xiàng)目根目錄下的package.json中可以配置代理:"proxy": "http://localhost:3001"
參考:
http://www.itdecent.cn/p/20a681a9c645
https://www.cnblogs.com/fly_dragon/p/9150732.html
九、封裝請(qǐng)求接口的模塊
1. 封裝常用的幾種接口請(qǐng)求方式的方法,并暴露出來。
2. 使用async和await可以簡(jiǎn)化promise的then和catch,以同步編碼方式實(shí)現(xiàn)異步流程。
3. await不能單獨(dú)使用,在返回promise的表達(dá)式左側(cè)寫await,await所在的最內(nèi)層函數(shù)的左側(cè)寫async。
4. 優(yōu)化:
統(tǒng)一處理請(qǐng)求異常:
在外層包一個(gè)自己創(chuàng)建的promise對(duì)象,在請(qǐng)求成功時(shí)resolve(res),
在請(qǐng)求失敗時(shí)不reject(err),而是顯示錯(cuò)誤提示。
雜7雜8
1. render中第一行寫debugger,即可在source中斷點(diǎn)調(diào)試;