目录
第1章创建React应用程序
1.1Create React App
1.2运行开发服务器
1.3导航应用程序
1.3.1项目元数据和依赖项
1.3.2public目录
1.3.3src目录
1.4定制应用程序
1.4.1标题
1.4.2Favicon
1.5添加元素
1.6样式
1.7Chrome Developer Tools
结语
好奇之处1: npx
好奇之处2: %PUBLIC_URL%
铜牌挑战: 子标题
银牌挑战: Canarygram
第2章组件
2.1应用程序的组织
2.2Header组件
2.3JSX
2.4Post组件
2.5React Developer Tools
2.6prop
2.7组件重用
2.8渲染列表
结语
好奇之处: 测试DevTools中的prop更改
铜牌挑战: Footer
银牌挑战: Canarygram Footer
第3章用户事件
3.1添加SelectedItem
3.2用户事件
3.3传递参数
结语
好奇之处1: 其他文件命名约定
好奇之处2: 分离事件处理程序
铜牌挑战: Hello, Goodbye
银牌挑战: 金丝雀警告消息
第4章状态
4.1什么是状态
4.2useState
4.3更新状态
结语
好奇之处: 组件函数vs类
金牌挑战: 金丝雀Shuffle
第5章Linting
5.1创建项目
5.2更新标题和Favicon
5.3Linting概述
5.4Linting规则
5.5运行ESLint
5.5.1自动修复错误
5.5.2覆盖ESLint规则
5.6在Visual Studio Code中安装ESLint扩展
结语
好奇之处1: 在Visual Studio Code中运行ESLint的快捷方式
好奇之处2: 提交代码前进行linting
第6章prop类型
6.1添加资源
6.2Header组件
6.2.1空格问题
6.2.2将组件添加到App.js
6.2.3设置header样式
6.3Thumbnail组件
6.4prop类型简介
6.5Thumbnail的prop类型
6.6渲染商品
6.7Home组件
6.8重用prop类型
6.9prop不匹配
结语
好奇之处1: 为什么将Items作为prop传递
好奇之处2: 内联图片
铜牌挑战: 添加prop
第7章样式
7.1样式作用域
7.2响应式设计
7.3媒体查询
7.4悬停效果
结语
好奇之处1: 网格布局
好奇之处2: 样式化组件
好奇之处3: 编译后的CSS
银牌挑战: 自定义效果
第8章与服务器交互
8.1设置服务器
8.2useEffect
8.3确认网络请求
8.4promise
结语
好奇之处1: 服务器端点
好奇之处2: 如何在生产环境中设置代理
好奇之处3: 跨源资源共享(CORS)
好奇之处4: useEffect与生命周期方法
银牌挑战: promise练习
第9章Router
9.1创建路由
9.2使用链接
9.3创建详细信息页面和路由
9.3.1嵌套路由
9.3.2索引路由
9.4useParams
9.5从Header导航到主页
9.6从缩略图导航到详细信息
结语
银牌挑战: 更多的路由
第10章条件渲染
10.1获取更多的商品信息
10.2未定义的商品
10.3if语句
10.4内联逻辑运算符
10.5片段
10.6更多的逻辑运算符
10.6.1&&运算符
10.6.2||运算符
10.6.3??运算符
10.7布尔类型转换
结语
好奇之处: 真值和假值
银牌挑战: 促销商品
第11章useReducer
11.1useReducer与useState
11.2实现useReducer
11.3reducer函数
11.4更新数量
11.5在Header中显示信息
11.6向购物车中添加商品
11.7动作创建器
结语
第12章编辑购物车
12.1创建购物车页面
12.2查看购物车的内容
12.3显示购物车的内容
12.4从购物车中删除商品
12.4.1将dispatch作为prop传递
12.4.2设置删除按钮
12.5清空购物车
12.6显示小计
结语
铜牌挑战: 增加数量
银牌挑战: 减少数量
第13章表单
13.1构建表单
13.2onSubmit
13.3来自输入的值
13.4受控组件
13.5onChange
13.6计算税款
13.7计算总消费额
13.8格式化输入
13.9表单验证
结语
银牌挑战: 优惠码
金牌挑战1: 在电话号码中保持光标的位置
金牌挑战2: 设定数量
第14章本地存储与useRef
14.1本地存储
14.2useRef与useState
14.3setTimeout与useRef结合使用
14.4访问DOM元素
14.5无障碍访问因素
结语
银牌挑战: 将光标焦点跳转回姓名输入框
第15章提交订单
15.1提交表单
15.2async/await
15.3防止意外提交订单
结语
铜牌挑战: 重置购物车状态
银牌挑战: 排队的订单有多少
第16章组件复合
16.1Alert组件
16.2有条件地显示警告消息
16.3使用prop进行组件复合
16.4重用Alert组件
16.5清空购物车
结语
金牌挑战: 可关闭的警告消息
第17章context
17.1获取已登录的用户
17.2登录按钮
17.3避免prop透传
17.4使用context传递currentUser
17.5useMemo
17.6useContext
17.7登录组件
17.8useNavigate
17.9注销按钮
17.10登录出错消息
结语
好奇之处: 登录Cookie
银牌挑战: Items context
第18章完成订单
18.1创建Orders组件
18.2订单链接
18.3获取并显示订单
18.4完成订单
18.5使用自定义hook限制访问
18.5.1自定义hook
18.5.2添加到依赖数组中
18.6清理useEffect
18.7获取新订单
18.7.1代理websocket
18.7.2使用websocket
18.7.3关闭websocket
结语
铜牌挑战1: 更智能的重定向
铜牌挑战2: 导入自定义Hook
银牌挑战1: Loader
银牌挑战2: 出错消息显示
第19章应用程序性能优化简介
19.1React Profiler
19.2Memo
19.3Context发生变化
19.4useCallback
19.5昂贵的计算
19.6比较useCallback、useMemo以及memo
19.7清理
结语
银牌挑战: 记忆化UserDetails
第20章测试概述
20.1决定使用何种测试
20.1.1为什么要进行测试
20.1.2想要了解哪些内容
20.1.3未来的需求是什么
20.2测试的类型
20.3静态测试
20.4单元测试和集成测试
20.4.1针对函数的单元测试
20.4.2针对组件的集成测试
20.4.3测试完整的应用程序
20.4.4快照测试
20.5端到端测试
20.5.1使用实时后端进行端到端测试
20.5.2使用模拟后端进行端到端测试
20.5.3选择哪种端到端测试
20.6视觉测试或截图测试
结语
第21章使用Jest和React测试库进行测试
21.1测试前的准备工作
21.2单元测试
21.3集成测试
21.3.1测试Thumbnail组件
21.3.2测试Home组件
21.4模拟服务器
21.5测试已登录用户的用户名
21.6测试导航
21.6.1测试Add to Cart按钮
21.6.2测试结账
21.6.3验证订单提交
21.7测试结账出错消息
结语
好奇之处1: 测试文件的文件结构
好奇之处2: React测试库查询
铜牌挑战: 测试从购物车中移除商品
银牌挑战1: 额外的cartReducer测试
银牌挑战2: 测试电话号码格式
银牌挑战3: 测试税款详情
金牌挑战: 其他登录测试
第22章端到端测试
22.1安装和配置Cypress
22.1.1配置脚本
22.1.2为Cypress设置ESLint
22.1.3导入命令
22.1.4设置基础URL
22.2测试登录流程
22.3测试结账流程
22.3.1与服务器交互
22.3.2测试结账流程中的出错消息
22.4测试查看/删除订单的流程
22.5提取自定义命令
22.6不可见元素
22.7避免不稳定的测试
结语
好奇之处1: Cypress媒体文件
好奇之处2: Cypress网络请求
银牌挑战1: 测试电话号码格式
银牌挑战2: 测试购物车详细信息
银牌挑战3: 测试从购物车中移除商品
金牌挑战: 附加测试
第23章应用程序
23.1Manifest
23.2构建应用程序
23.3部署应用程序
结语
第24章数据加载
24.1生产环境构建
24.2分析
24.3大型图片
24.4分析JavaScript文件
24.5延迟加载
24.5.1动态导入
24.5.2命名bundles
24.6其他注意事项
结语
金牌挑战: 延迟加载
第25章组件速度
25.1检查性能
25.2过渡
25.3存储渲染内容
25.4存储已渲染的组件
结语
金牌挑战: 缓存筛选后的数据
附录A必备工具
A.1安装Google Chrome
A.2安装Visual Studio Code
A.3命令行
A.3.1查找当前目录
A.3.2修改目录
A.3.3创建目录
A.3.4列出文件
A.3.5获取管理员权限
A.3.6退出程序
A.4安装Node.js
A.5资源文件
