- A+
所属分类:Web前端
总结-旧生命周期
初始化阶段: 由ReactDOM.render()触发---初次渲染
- constructor()
- componentWillMount()
- render()
- componentDidMount() ===> 常用
一般在这个钩子中做一些初始化的事,例如:开启定时器,发送网络请求,订阅消息
更新阶段: 由组件内部this.setState()或父组件render触发
- shouldComponentUpdate()
- componentWillUpdate()
- render() ===> 常用
- componentDidUpdate()
卸载组件: ReactDOM.unmountComponentAtNode()触发
组件挂载流程
- componentWillUnmount() ===> 常用
一般在这个钩子中做一些收尾的事,例如:关闭定时器,取消订阅消息
class Count extends React.Component { // 最先调用 constructor(props) { super(props); console.log('count---constructor'); this.state = { count: 0 } } // 组件将要挂载 //WARNING! To be deprecated in React v17. Use componentDidMount instead. componentWillMount() { console.log('count---componentWillMount'); } // 组件挂载完毕的钩子 componentDidMount() { console.log('count---componentDidMount') } componentWillUnmount() { console.log('count---componentWillUnmount'); } // 控制更新阀门 shouldComponentUpdate(nextProps, nextState) { console.log('count---shouldComponentUpdate'); return true; } // 组件将要更新的钩子 //WARNING! To be deprecated in React v17. Use componentDidUpdate instead. componentWillUpdate(nextProps, nextState) { console.log('count---componentWillUpdate') } // 组件更新之后 componentDidUpdate(prevProps, prevState) { console.log('count---componentDidUpdate'); } add = () => { let { count } = this.state; count += 1; this.setState({ count: count }); } unload = () => { root.unmount(document.getElementById('test')); } // 初始化渲染,状态更新之后 执行 render() { const { count } = this.state; console.log('count---render'); return ( <div> <h2>当前求和为: {count}</h2> <button onClick={this.add}>点我加一</button> <button onClick={this.unload}>卸载组件</button> </div> ) } }
父组件render流程
class A extends React.Component { constructor(props) { super(props); this.state = { carName: '奔驰' }; } changeCar = () => { this.setState({ carName: '宝马' }); } render() { return ( <div> <h1>A</h1> <button onClick={this.changeCar}>换车</button> <B carName={this.state.carName} /> </div> ) } } class B extends React.Component { // 组件将要接收到新的props的钩子 //WARNING! To be deprecated in React v17. // Use new lifecycle static getDerivedStateFromProps instead. componentWillReceiveProps(props) { console.log('count---componentWillReceiveProps', props) } render() { return ( <div> <h1>B</h1> <h2>现在的车: {this.props.carName}</h2> </div> ) } }
新生命周期
class Count extends React.Component { // 最先调用 constructor(props) { super(props); console.log('count---constructor'); this.state = { count: 0 } } // 使用场景极其罕见,state值取决于props static getDerivedStateFromProps(props, state) { console.log('getDerivedStateFromProps', props, state); return null; } // 在最近一次渲染之前调用,传值给DidUpdate getSnapshotBeforeUpdate = (prevProps, prevState) => { console.log('getSnapshotBeforeUpdate'); return 'nihao'; } // 组件挂载完毕的钩子 componentDidMount() { console.log('count---componentDidMount') } componentWillUnmount() { console.log('count---componentWillUnmount'); } // 控制更新阀门 shouldComponentUpdate(nextProps, nextState) { console.log('count---shouldComponentUpdate'); return true; } // 组件更新之后 componentDidUpdate(prevProps, prevState, snapshotValue) { console.log('count---componentDidUpdate', snapshotValue); } add = () => { let { count } = this.state; count += 1; this.setState({ count: count }); } unload = () => { root.unmount(document.getElementById('test')); } // 初始化渲染,状态更新之后 执行 render() { const { count } = this.state; console.log('count---render'); return ( <div> <h2>当前求和为: {count}</h2> <button onClick={this.add}>点我加一</button> <button onClick={this.unload}>卸载组件</button> </div> ) } }