React实战与原理笔记
概念与工具集
生命周期

constructor()
- 用于初始化内部状态,不多使用;
- 惟一能够修改state的地方;
- 使用 this.state 来初始化 state
- 给事件处理函数绑定 this
getDerivedStateFromProps()
- 当建立时、接收新的 props 时、setState 时、forceUpdate 时会执行这个方法
- 当state须要从props初始化时使用;
- 尽可能不要使用:维护二者状态一致性会增长复杂度;
- 每次render都会调用
- 典型场景;表单控件获取默认值
componentWillMount()
- UI渲染完成后调用
- 只执行一次
- 典型场景:获取外部资源
componentWillUnmount()
- 组件将要移除时调用
- 资源释放(一些事件监听和定时器须要在此时清除)
getSnapshotBeforeUpdate()
- 在页面render以前调用,state已更新
- 典型场景:获取render以前的DOM状态
componentWillUpdata(nextProps, nextState)
- 组件初始化时不调用,只有在组件将要更新时才调用,此时能够修改state
componentDidUpdate()
- 每次UI更新时调用
- 典型场景:页面须要根据props变化从新获取数据
shouldComponentUpdate(nextProps, nextState)
- 决定vdom是否要重绘
- 通常能够由PureComponent自动实现
- 典型场景:性能优化
render()
- 建立虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。
componentDidMount()
组件设计模式
组件
就是状态机器UI=fn(state) (状态分类:domain ui app)html
context模式
主要应用场景在于不少不一样层级的组件须要访问一样一些的数据。以下图,组件a、组件g、组件f须要共享数据,则只须要在最外层套上Provider,须要共享的组件使用Consumer便可。React新Context API在前端状态管理的实践前端
组合组件(Compound Component)
使用者只须要传递子组件,子组件所须要的props在父组件会封装好,引用子组件的时候就不必传递全部props了。react
高阶组件(HOC)
高阶组件本质是一个接受 Component 并返回新的 Component 的函数。目的是为了复用通用逻辑 [深刻理解 React 高阶组件
](https://mp.weixin.qq.com/s?__...webpack
函数组件
是纯 UI 组件,也称无状态组件(SFC:Stateless Functional Component)。渲染所须要的数据只经过 props 传入, 不须要用 class 的方式来建立 React 组件, 也不须要用到 this 关键字,或者用到 state [React中函数式声明组件
](https://segmentfault.com/a/11...git
render props
给某个组件经过 props 传递一个函数,而且函数会返回一个 React 组件github
提供者模式(Provider Pattern)
提供者模式能够解决非父子组件下的信息传递问题, 或者组件层级太深须要层层传递的问题web
State Reducer
可让父组件控制子组件state。render props 能够控制子组件的UI是如何渲染的,state reducer则能够控制子组件的state.算法
Controlled Components
将原来子组件改变state的逻辑移到父组件中,由父组件控制。
异步redux
实战-状态管理与组件通讯
组件通讯: broadcast dispatch state props contextsegmentfault
其余状态管理: dva, mobx,flexible,reflux,flummox
- action:当须要改变应用的状态或有 View 须要更新时,你须要触发一个 Action
- action creator:把 type 和 payload(载荷)封装成一个 Action。type 是你预约义的多个 type (一般是一个常量列表)之一,表明系统特定的 action。一旦 action 消息建立好了,Action Creator 就会把它传递给 Dispatcher
- Dispatcher: 它保存着全部须要发送 action 的 store 列表。当 Action Creator 给过来一个 action,它会把这个 action 传递给各个 store。
- waitfor:Dispatcher 的行为是同步的。若是想要在 store 之间实现依赖,有的更新完了其余的才能更新,你可使用 Dispatcher 提供的 waitFor() 来实现。
- store:全部的状态变化,必须经过 Action Creator/Dispatcher 通道。使用switch判断 action 的类型,决定是否相应。若是相应则根据 action 找出须要变化的部分,更新 state。
- observable: 经过 observable(state) 定义组件的状态,包装后的状态是一个可观察数据(Observable Data)。
- observer: 经过 observer(ReactComponent) 定义组件
- action: 经过 action 来修改状态。
- react-redux 提供了两个重要的对象,Provider 和 connect,前者使 React 组件可被链接(connectable),后者把 React 组件和 Redux 的 store 真正链接起来。
- 经过 reducer 建立一个 store,每当咱们在 store 上 dispatch 一个 action,store 内的数据就会相应地发生变化。
- provider
- connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
原理
Virtual Dom 算法实现
详情参考 深刻框架本源系列 —— Virtual Dom
Router 实现
以 hash 形式(也可使用 History API 来处理)为例,当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不一样的操做,进行不一样的内容的展现。前端路由实现与 react-router 源码分析
Redux设计思想
- Web 应用是一个状态机,视图与状态是一一对应的。
- 全部的状态,保存在一个对象里面。
Redux 让应用的状态变化变得可预测。若是想改变应用的状态,就必须 dispatch 对应的 action。而不能直接改变应用的状态,由于保存这些状态的地方(称为 store)只有 get方法(getState) 而没有 set方法。
只要Redux 订阅(subscribe)相应框架(例如React)内部方法,就可使用该应用框架保证数据流动的一致性。
Redux源码剖析及应用
其余
《React源码解析(一):组件的实现与挂载》
《React源码解析(二):组件的类型与生命周期》
《React源码解析(三):详解事务与队列》
《React源码解析(四):事件系统》
React底层揭秘
参考资料
《深刻浅出React和Redux》程墨
React 状态管理库: Mobx
深刻浅出react
React 实践心得:react-redux 之 connect 方法详解、
《React实战进阶45讲》 王沛 - 极客时间
react 生命周期
从新认识reacrt生命周期
react组件设计模式快速指南