1 一个div的一生
- div 的 create/construct 过程
let div = document.createElement('div')
div.textContent= 'hi'
document.body.appendChild(div)
div.textContent= 'hi2'
div.remove()
2 常用生命周期
- constructor()---在这里初始化 state
- shouldComponentUpdate()---return false/true 阻止/同意更新
- render()---创建虚拟 DOM
- componentDidMount()---组件已出现在页面
- componentDidUpdate()---组件已更新
- componentWillUnmount()---组件将死
3 constructor
- 初始化props
- 初始化state,但此时不能调用setState
- 用来写bind this
construct(){
this.onClick = this. onClick.bind(this) //放在constructor里面
}
可以用新语法代替
onClick = ()=> {} //放在constructor外面
constructor(){...}
4 shouldComponentUpdate
- 返回true表示不阻止UI更新
- 返回false表示阻止UI更新
- 可以用React.PureComponent代替此功能
- 它允许我们手动判断是否要进行组件更新,我们可以根据应用场景灵活地设置返回值,以避免不必要的更新
- 示例

5 render
return (<div>...</div>)
- 只能有一个根元素
- 如果有两个根元素,就要用<React.Fragment>包起
- <React.Fragment/> 可以缩写成 <></>
- render 里面可以写 if...else
- render里面可以写?:表达式
- render里面不能直接写for循环,需要用数组
- render里面可以写array.map (循环)
6 componentDidMount
- 在元素插入页面后执行代码,这些代码依赖DOM
- 比如你想获取div的高度,就最好在这里写
- 此处可以发起加载数据的AJAX请求(官方推荐)
- 首次渲染会执行此钩子
7 componentDidUpdate
- 在视图更新后执行代码
- 此处也可以发起AJAX请求,用于更新数据(看文档)
- 首次渲染不会执行此钩子
- 在此处setstate可能会引起无限循环,除非放在if里
- 若shouldCom...Update返回false,则不触发此钩子
8 componentWillUnmount
- 组件将要被移出页面然后被销毁时执行代码
- unmount过的组件不会再次mount
- 举例:
如果你在C...DidMount里面监听了 window.scroll
那么你就要在c..WillUnmount里面取消监听
如果你在c..DidMount里面创建了 Timer
那么你就要在c..WillUnmount里面取消Timer
如果你在c..DidMount里面创建了 AJAX请求
那么你就要在c..WillUnmount里面取消请亲
否则你就是菜逼
原则:谁污染谁治理
9 图示