1 React新的前端思维方式
1.1 初始化一个React项目
create-react-app
1.2 增加一个新的React组件
1.2.1 JSX
所谓JSX,是JavaScript的语法扩展(eXtension),让我们在JavaScript中可以编写像HTML一样的代码。
ReactDOM.render
onClick(React)和onclick(HTML)
1.2.2 JSX是进步还是倒退
1.3 分解React应用
1.4 React作方式方式
1.4.1j Query如何工作
1.4.2 React的理念
UI=render(data)
1.4.3 Virtual DOM
1.4.4 React工作方式的优点
2 设计高质量的React组件
2.1 易于维护组件的设计要素
2.2 React组件的数据
“差劲的程序员操心代码,优秀的程序员操心数据结构和它们之间的关系。” ——Linus Torvalds,Linux创始人
2.2.1 React的prop
2.2.2 React的state
2.2.3 prop和state的对比
prop用于定义外部接口,state用于记录内部状态; prop的赋值在外部世界使用组件时,state的赋值在组件内部; 组件不应该改变prop的值,而state存在的目的就是让组件来改变的。
2.3 组件的生命周期
2.3.1 载过过程(Mount)
constructor getlnitialState getDefaultProps componentWillMount render componentDidMount
2.3.2 更新过程(Update)
componentWillReceiveProps shouldComponentUpdate componentWillUpdate render componentDidUpdate
2.3.3 卸载过程(Unmount)
componentWillUnmount
2.4 组件向外传递数据
2.5 React组件state和prop的局限
3 从Flux到Redux
3.1 Flux
3.1.1 MVC 框架的缺陷
Model(模型)负责管理数据,大部分业务逻辑也应该放在Model中; View(视图)负责渲染用户界面,应该避免在View中涉及业务逻辑; Controller(控制器)负责接受用户输入根据用户输入调用对应的Model部分逻辑,把产生的数据结果交给View部分,让View渲染出必要的输出。
一个Flux应用包含四个部分,我们先粗略了解一下: Dispatcher,处理动作分发,维持Store之间的依赖关系; Store,负责存储数据和处理数据相关逻辑; Action,驱动 Dispatcher的JavaScript对象; View,视图部分,负责显示用户界面。
如果非要把Flux和MVC做一个结构对比,那么,Flux的Dispatcher相当于MVC的Controller,Flux的Store相当于MVC的Model,Flux的View当然就对应MVC的View了,至于多出来的这个Action,可以理解为对应给MVC框架的用户请求。
3.1.2 Flux应用
npm i flux
监听者模式
import {EventEmitter} from 'events';
Object.assign({}, EventEmitter.prototype, {
//some thing
//emit(CHANGE_EVENT) 触发change
//on(CHANGE_EVENT, callback) 绑定change事件
//removeListener(CHANGE_EVENT, callback) 移除change事件
//dispatchToken
});
3.1.3 Flux的优势
3.1.4 Flux的不足
3.2 Redux
3.2.1 Redux的基本原则
唯一数据源(Single Source of Truth); 保持状态只读(State is read-only); 数据改变只能通过纯函数完成(Changes are made with pure functions);
在计算机编程的世界里,完成任何一件任务,可能都有一百种以上的方法,但是无节制的灵活度反而让软件难以维护,增加限制是提高软件质量的法门。
“如果你愿意限制做事方式的灵活度,你几乎总会发现可以做得更好。” ——John Carmark
3.2.2 Redux实例
//connect(mapStateToProps, mapDispatchToProps)(Counter)
//connect 来源react-redux
//mapStateToProps
3.2.3 容器组件和傻瓜组件
3.2.4 组件Context
3.2.5 React-Redux
4 模块化React和Redux应用
4.1 模块化应用要点
4.2 代码文件的组织方式
4.2.1 按角色组织
4.2.2 按功能组织
4.3 模块接口
“在最理想的情况下,我们应该通过增加代码就能增加系统的功能,而不是通过对现有代码的修改来增加功能。” ——Robert C. Martin
4.4 状态树的设计
一个模块控制一个状态节点; 避免冗余数据; 树形结构扁平;
4.4.1 一个状态节点只属于一个模块
4.4.2 避免冗余数据
4.4.3 树形结构扁平
4.5 Todo应用实例
4.5.1 Todo状态设计
4.5.2 action构造函数
4.5.3 组合reducer
4.5.4 Todo视图
4.5.5 样式
4.5.6 不使用ref
4.6 开发辅助工具
4.6.1 Chrome扩展包
4.6.2 redux-immutable-state-invariant辅助包
4.6.3 工具应用
5 React组件的性能优化
5.1 单个React组件的性能优化
5.1.1 发现浪费的渲染时间
chrome安装React Perf插件
5.1.2 性能优化的时机
“我们应该忘记忽略很小的性能优化,可以说97%的情况下,过早的优化是万恶之源,而我们应该关心对性能影响最关键的那另外3%的代码。” ——高德纳
开发者永远要考虑到极端情况。
5.1.3 React-Redux的shouldComponentUpdate实现
5.2 多个React组件的性能优化
5.2.1 React的调和(Reconciliation)过程
5.2.2 Key的用法
5.3 用reselect提高数据获取性能
5.3.1 两阶段选择过程
5.3.2 范式化状态树
6 React高级组件
“重复是优秀系统设计的大敌。” ——Robert C.Martin