赞
踩
1 )初始化 constructor
constructor(props) { super(props); this.state = { num: 1 } // 不可以,直接warning this.setState({ num: this.state.num + 1 }); // 可以使用,但不建议 setInterval(() => { this.setState({ num: this.state.num + 1 }); }, 1000); }
2 )获取最新的属性和状态 static getDerivedStateFromProps
/**
* 静态方法,首次挂载和更新渲染都会运行该方法
* props 当前属性
* state 当前状态
*/
static getDerivedStateFromProps(props, state) {
// return 1; // 没用
return {
num: 999, // 合并到当前 state 对象
}
}
3 )创建 vDOM render
render() {
// 严禁使用
this.setState({
num: 1
})
return (
<>
(this.state.num)
</>
)
}
4 )挂载到页面渲染成真实Dom componentDidMount
componentDidMount() {
// 初始化或异步代码
this.setState({})
setInterval(() => {}); // 简单模拟
document.querySelectorAll('div');
}
更新阶段会更新 state 或 更新 props
1 )获取最新的属性和状态 static getDerivedStateFromProps
2 )是否重新渲染 shouldComponentUpdate
/**
* 决定是否要重新进行渲染
* nextProps 此次更新的属性
* nextState 此次更新的状态
* returns boolean
*/
shouldComponentUpdate(nextProps, nextState) {
// 伪代码,如果当前的值和下一次的值相等,那么就没有更新渲染的必要了
if (this.props === nextProps && this.state === nextState) {
return false;
}
return true;
}
3 )更新vDOM render
4 )获取更新之前的状态 getSnapshotBeforeUpdate
/**
* 获取更新前的快照,通常用来做一些附加的DOM操作
* prevProps 更新前的属性
* prevState 更新前的状态
*/
getSnapshotBeforeUpdate(prevProps, prevState) {
// 获取真实DOM在渲染到页面前作一些附加操作...
document.querySelectorAll('div').forEach(it => it.innerHTML = '123')
return 'componentDidUpdate的第三个参数'
}
5 )更新后挂载成真实DOM componentDidUpdate
getSnapshotBeforeUpdate
不同的是/**
* prevProps 更新前的属性
* prevState 更新前的状态
* snapshot getSnapshotBeforeUpdate 的返回值
*/
componentDidUpdate(prevProps, prevState, snapshot) {
document.querySelectorAll('div').forEach(it => it.innerHTML = snapshot)
}
componentWillUnmount() {
// 组件倍卸载前清理副作用
clearInterval(timer1);
clearTimeout(timer2);
this.setState = () => {};
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。