生命周期新旧对比
1. 图示

2. 旧版生命周期代码
<script type="text/babel">
class Count extends React.Component {
constructor(props) {
console.log("Count---constructor")
super(props)
this.state = {count: 0}
}
add = () => {
let {count} = this.state
this.setState({count: count + 1})
}
death = () => {
ReactDOM.unmountComponentAtNode(document.getElementById('box'))
}
force = () => {
this.forceUpdate()
}
componentWillMount() {
console.log('Count---componentWillMount')
}
componentDidMount() {
console.log('Count---componentDidMount')
}
componentWillUnmount() {
console.log('Count---componentWillUnmount')
}
shouldComponentUpdate() {
console.log('Count---shouldComponentUpdate')
return true
}
componentWillUpdate() {
console.log('Count---componentWillUpdate')
}
componentDidUpdate() {
console.log('Count---componentDidUpdate')
}
render() {
console.log("Count---render")
return (
<div>
<h2>当前求和为:{this.state.count}</h2>
<button onClick={this.add}>点击+1</button>
<button onClick={this.death}>卸载组件</button>
<button onClick={this.force}>强制更新</button>
</div>
)
}
}
class A extends React.Component {
state = {carName: '奔驰'}
changeCar = () => {
this.setState({carName: '宝马'})
}
render() {
return (
<div>
<h2>我是父组件</h2>
<button onClick={this.changeCar}>换车</button>
<hr />
<B carName={this.state.carName}/>
</div>
)
}
}
class B extends React.Component {
death = () => {
ReactDOM.unmountComponentAtNode(document.getElementById('box'))
}
componentWillReceiveProps() {
console.log('B---componentWillReceiveProps')
}
shouldComponentUpdate() {
console.log('B---shouldComponentUpdate')
return true
}
componentWillUpdate() {
console.log('B---componentWillUpdate')
}
componentDidUpdate() {
console.log('B---componentDidUpdate')
}
componentWillUnmount() {
console.log('B---componentWillUnmount')
}
render() {
console.log('B---render')
return (
<div>
<h2>我是子组件</h2>
<h3>汽车名字:{this.props.carName}</h3>
<button onClick={this.death}>卸载组件</button>
</div>
)
}
}
ReactDOM.render(<A/>, document.getElementById('box'))
</script>
总结:
1. 初始化阶段:由ReactDOM.render()触发---初次触发
1)constructor()
2) componentWillMount()
3) render()
4) componentDidMount() ===> 常用
一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息
2. 更新阶段:由组件内部this.setState()或父组件render()触发
1) shouldComponentUpdate()
2) componentWillUpdate()
3) render()
4) componentDidUpdate()
3. 卸载组件:由ReactDOM.unmountComponentAtNode()触发
1) componentWillUnmount() ===> 常用
一般在这个钩子中做一下收尾的事,例如:关闭定时器、取消订阅消息
3. 新版生命周期代码
<script type="text/babel">
class Count extends React.Component {
constructor(props) {
console.log("Count---constructor")
super(props)
this.state = {count: 0}
}
add = () => {
let {count} = this.state
this.setState({count: count + 1})
}
death = () => {
ReactDOM.unmountComponentAtNode(document.getElementById('box'))
}
force = () => {
this.forceUpdate()
}
static getDerivedStateFromProps(props, state) {
console.log('getDerivedStateFromProps',props, state)
return null
}
getSnapshotBeforeUpdate() {
console.log('getSnapshotBeforeUpdate')
return 1
}
componentDidMount() {
console.log('Count---componentDidMount')
}
componentWillUnmount() {
console.log('Count---componentWillUnmount')
}
shouldComponentUpdate() {
console.log('Count---shouldComponentUpdate')
return true
}
componentDidUpdate(preProps, preState, snapshotValue) {
console.log('Count---componentDidUpdate', preProps, preState, snapshotValue)
}
render() {
console.log("Count---render")
return (
<div>
<h2>当前求和为:{this.state.count}</h2>
<button onClick={this.add}>点击+1</button>
<button onClick={this.death}>卸载组件</button>
<button onClick={this.force}>强制更新</button>
</div>
)
}
}
ReactDOM.render(<Count count={20}/>, document.getElementById('box'))
</script>
总结:
1. 初始化阶段:由ReactDOM.render()触发----初次渲染
1) constructor()
2) getDerivedStateFromProps
3) render()
4) componentDidMount()
2. 更新阶段:由组件内部this.setState或者父组件重新render触发
1) getDerivedStateFromProps
2) shouldComponentUpdate()
3) render()
4) getSnapshotBeforeUpdate
5) componentDidUpdate()
3. 卸载组件:由ReactDOM.unmountComponentAtNode触发
1) componentWillUnmount
4. 新版生命周期函数中getSnapshotBeforeUpdate的使用场景
<script type="text/babel">
class News extends React.Component {
state = {newsArr: []}
componentDidMount() {
setInterval(() => {
const {newsArr} = this.state
const news = "新闻" + (newsArr.length + 1)
this.setState({newsArr: [news, ...newsArr]})
}, 1000)
}
getSnapshotBeforeUpdate() {
return this.refs.list.scrollHeight
}
componentDidUpdate(preProps, preState, height) {
this.refs.list.scrollTop += this.refs.list.scrollHeight - height
}
render() {
return (
<div className="list" ref="list">
{
this.state.newsArr.map((n, index) => {
return <div className="item" key={index}>{n}</div>
})
}
</div>
)
}
}
ReactDOM.render(<News/>,document.getElementById('box'))
</script>