第2章 项目初始化
npx create-react-app my-app
第3章 【基础篇】React 与 TypeScript
创建TS的React项目
如果要使用TS,就这样配置
3-4 【组件化】初识React函数式组件
3-5 【概念理解】JSX 编程思维
3-6 配置React的CSS模组
导入css报错,是因为typescript无法识别css格式的文件,给css文件加上类型的定义声明
然后就可以看到引入成功了
上述就是JSS了
{width=81%}
装插件 解析CSS文件,并且生成typescript对应的引用类型,且对css也有智能提示了
3-8 【资源配置】加载媒体与字体文件
3-9 【组件化】创建class类组件
3-11 State vs Props
Props是只读的
3-12 【事件驱动】React Event 事件处理
3-13 【异步处理】获取网络API数据
3-14 【异步处理】setState的异步开发
经典面试题
当我们使用setState
的时候,只要生命周期不变化,还是基于上一次state
进行更新
解决方法:setState
的第一个参数传入函数
,这样点击1次后就能增加2了
3-15 【死与新生】探索React组件的生命周期
3-16 React17版本变化
第4章 【基础篇】React Hooks
4-2 【概念理解】 什么是钩子【Hooks只能在函数式组件内使用】
4-3 【状态钩子】使用useState管理组件state
4-4 【概念理解】副作用 side effect
4-5 【副作用钩子】使用useEffect异步获取数据
4-6 【副作用钩子】useEffect 使用指南
useEffect的第二个参数
特别注意async
的位置!
{width=88%}
{width=88%}
4-7【全局数据传递】Context 与 useContext
多层 props 传递会导致深度注入:props drilling
不使用useContext
使用useContext
4-8 组件化Context Provider
注意上面这里使用的是props.children
另外为了共享setState
,就要新建一个新的Context
4-9 withAddToCart()
{width=81%}
{width=78%}
高阶组件也是组件 放进components目录下 一般由with开头
实现添加购物车业务逻辑
4-10 【自定义Hook】 useAddToCart()
with
代表高阶函数,use
代表钩子函数
{width=73%}
(并非React特性,所以自定义时无需引入React)
自定义Hook,返回功能函数
第5章 【实战项目】项目搭建与首页开发
创建项目
- 【不知道为什么换了镜像源还是巨慢】
npx create-react-app react-travel --template typescript
- 用这个
yarn create react-app XXX(项目名称) --template typescript
antd
使用
先下载antd
依赖
antd icons的导入使用
然后在index.tsx
中import "antd/dist/antd.css"
@font-face
的使用
component小技巧
Grid栅格
第6章 【路由系统】React Router Dom
有的第三方框架没有原生支持typescript,所以需要安装类型支持npm install @type/xxx
直接使用路由组件里的render
属性直接渲染jsx
代码
6-6 【路由搭建】withRouter 与 useRouter
使用高阶函数
使用钩子
6-7 【路由搭建】Link 与动态导航
第7章 【Redux 入门】实战项目架构设计
7-3 【创建state】createStore
7-4 【访问state】获取store数据
7-5 【更新state】Action与Reducer处理
7-6 【订阅state】store的连接与订阅
7-7 【i18n】完成网站语言切换
react-i18next配置 【原生支持typescript】
{width=81%} npm install react-i18next i18next --save
配置之后的工作中可复用
高阶函数式使用
导入小写的withTranslation
,且注意组件是从第二个小括号
传入
{width=61%}
{width=71%}
钩子函数式使用
这个问题回头再处理
7-8 【redux重构】action 的拆分与统一
7-9 【redux封装】在类组件中使用react-redux
react-redux官网
安装react-redux的类型声明文件
7-10 【redux封装】在函数式组建中使用react-redux
第8章 【Redux进阶】异步AJAX与redux中间件
8-4
npm install axios
,它自带typescript
支持
import axios from "axios"
数据请求回来前DOM刚渲染完,悬空操作,Loading
error和loading类似
配置axios
- 设计模式
npm install redux-thunk
,自带typescript
import thunk from "redux-thunk"
import applyMiddleware from "redux"
异步aciton返回函数,函数里写异步逻辑
8-9 自定义中间件 actionLog
8-10
第9章【Redux-Tooklkit】完成产品搜索与产品详情
9-5 React Toolkit
核心createSlice
import { createSlice, createAction } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'
import { createStore, combineReducers } from 'redux'
const incrementBy = createAction<number>('incrementBy')
const decrementBy = createAction<number>('decrementBy')
const counter = createSlice({
name: 'counter',
initialState: 0 as number,
reducers: {
increment: (state) => state + 1,
decrement: (state) => state - 1,
multiply: {
reducer: (state, action: PayloadAction<number>) => state * action.payload,
prepare: (value?: number) => ({ payload: value || 2 }), // fallback if the payload is a falsy value
},
},
// "builder callback API", recommended for TypeScript users
extraReducers: (builder) => {
builder.addCase(incrementBy, (state, action) => {
return state + action.payload
})
builder.addCase(decrementBy, (state, action) => {
return state - action.payload
})
},
})
const user = createSlice({
name: 'user',
initialState: { name: '', age: 20 },
reducers: {
setUserName: (state, action) => {
state.name = action.payload // mutate the state all you want with immer
},
},
// "map object API"
extraReducers: {
// @ts-expect-error in TypeScript, this would need to be [counter.actions.increment.type]
[counter.actions.increment]: (
state,
action /* action will be inferred as "any", as the map notation does not contain type information */
) => {
state.age += 1
},
},
})
const reducer = combineReducers({
counter: counter.reducer,
user: user.reducer,
})
const store = createStore(reducer)
store.dispatch(counter.actions.increment())
// -> { counter: 1, user: {name : '', age: 21} }
store.dispatch(counter.actions.increment())
// -> { counter: 2, user: {name: '', age: 22} }
store.dispatch(counter.actions.multiply(3))
// -> { counter: 6, user: {name: '', age: 22} }
store.dispatch(counter.actions.multiply())
// -> { counter: 12, user: {name: '', age: 22} }
console.log(`${counter.actions.decrement}`)
// -> "counter/decrement"
store.dispatch(user.actions.setUserName('eric'))
// -> { counter: 12, user: { name: 'eric', age: 22} }
configureStore
9-6 实战
安装依赖 npm install @reduxjs/toolkit
,支持typescript
使用Redux Toolkit
之后,就不用分开创建action和reducer了。每个action都有对应的处理函数。注意reducers
是一个对象
9-8 React Toolkit
中使用Redux Thunk
createAsyncThunk
9-9 完成产品搜索页面
第10章 【顶部导航】用户登陆
10-7 单点登录与JWT
因为要在服务器保存用户的session
,所以称之为有状态登录。
10-8 JWT
的原理
10-9
10-10
安装解码插件 npm install jwt-decode
第11章 【综合运用】 购物与订单
第12章 【项目上线】网站测试与部署
- 方案1:使用本地服务器来托管网站
- 方案2:容器化部署
静态部署
搭建本地服务器
npm install -g serve
serve -s build
- 如果要改端口
serve -s build -l 4000
其他部署方式还要看文档 Create React App官网
容器化使用docker部署
{width=81%}
{width=81%}
{width=81%}
{width=81%}
开启虚拟服务
{width=52%}
下载docker ,然后命令行通过docker --version
查看docker版本
利用docker搭建一个容器化的web服务器
1.拉取一个linux操作系统centos镜像:docker pull centos:latest
2.运行docker images
查看当前所有的镜像
3.(容器化部署)运行centos docker镜像docker run -p 9566:80 --name web -i -t centos /bin/bash
-p
代表运行端口,9566是本机端口,80是docker内部的默认端口name
代表docker容器运行成功后给它分配一个叫web的名字-i -t
通常会一起使用,表示交互模式,运行并且进去这个docker容器- 当我们按下回车之后,
我们基于docker的容器化linux操作系统就运行起来了,同时就进去了这个虚拟系统
4.给这个linux系统安装网站的托管服务器
,服务器推荐使用 nginx
5.安装nginx服务器首先添加安装源rpm ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
6.然后执行yum install -y nginx
安装 nginx,之后执行whereis nginx
就可以看到 nginx 的安装路径了(之后react网站构建打包完成后就是放到这个文件夹中)
7.运行nginx
命令把服务器运行起来(验证:浏览器输入localhost:9566
)
{width=81%}
我们可以把操作系统、运行环境、脚本、程序全部都打包在一起制作成镜像文件,就相当于给系统设置一个还原点
两种方式构建Docker镜像
docker commit
docker build + Dockerfile
[推荐使用]
在项目中创建一个文件:Dockerfile
(实际上就是构造Docker镜像的脚本
),没有后缀,然后文件内容编辑如下:
终端输入docker build
构建镜像+-t react-web
起名+.
输入docker images
查看镜像是否已存在
容器化镜像,docker run -d -p 12231:80 react-web
,这里的12231只要不是被占用的端口就可以。然后项目就成功部署在docker中了
运行docker ps
检查一下
浏览器输入localhost:12231
以上都是容器化部署在本地电脑上,现在要开始容器化部署在阿里云ECS上了
容器化部署在阿里云ECS
- 首先注册阿里云账号并充值100块以上
阿里的两个服务
{width=52%}
容器化部署的大致思路
1.创建云服务器ECS实例
2.点击实例列表中的远程连接
,方式选Workbench远程连接
然后输入密码
3.通过以下四个命令添加yum源
4.安装docker yum install docker-io -y
5.启动docker systemctl start docker
6.查看安装结果docker info
7.启动阿里云的容器镜像服务
- 先开启
阿里云容器镜像服务
,然后进入镜像加速器,按照指引把命令复制到终端运行(然后docker加速器就添加成功了)
8.接下里就是本课第五步,本地构建课程实战项目的docker镜像
- 打开命令行,
cd 到项目文件夹
- 使用命令
docker build -t react-web .
,然后镜像就创建成功了 - 运行
docker images
查看一下
9.课程的第六步:在阿里云镜像服务中创建我们的私人docker镜像仓库
- 打开阿里云容器镜像服务,点击
镜像仓库
,点击创建镜像仓库
(代码源
选本地仓库
),然后点击仓库进入仓库的操作文档
- 首先
复制第一条命令登录仓库
,然后填写阿里云登陆密码
- 然后
复制第3命令去推送镜像
,其中命令里的版本号
是自定义的(比如1.0.0
),ImageId
可以在docker images
里找到。
- 在镜像仓库文档页面左侧点击
镜像版本
,就可以看到刚上传好的镜像了 - 接下来就要
在ECS服务器上部署这个docker镜像
了,所以到仓库基本信息页复制第2条命令
- 拉取成功之后就要部署这个镜像了
docker run -d -p 12231:80 第2里的命令pull后面跟着的仓库地址
- 然后docker就运行起来了,运行
docker ps
查看一下状态
10.由于ECS服务器的实例安全策略,我们暂时没法从外部访问项目的端口12231,所以我们需要配置一下
- 打开ECS实例列表,
点击实例名称
,在基本信息栏中找到配置安全组规则
,然后在普通安全组中找到配置规则
,点击手动添加
,在端口范围目的
中输入12231/12231
,授权对象源输入0.0.0.0/0
【表示不对外部 ip 做任何显示】
- 然后等待几分钟,等安全策略规则响应,然后回到实例列表,复制
ECS实例公网地址
+端口号:12231
到浏览器