网站首页 > 技术文章 正文
说到React生命周期,主要指的是类式组件的生命周期,函数式组件是没有生命周期概念的,React类式组件生命周期主要分为三个阶段:挂载阶段、更新阶段、卸载阶段
挂载阶段
这一阶段主要是组件第一次在DOM树中被渲染的过程
constructor 函数
作用:用来通过 props 接收父组件传递过来的数据、通过 this.state 初始化内部的数据、通过 bind 为事件绑定实例
getDerivedStateFromProps 函数(不常用)
作用:state 的值在任何时候都依赖于 props 时使用、该方法返回一个对象来更新 state
render 函数
作用:组件渲染的时候,就会回调
componentDidMount 函数
作用:组件已经挂载到 DOM 上时,就会回调,可以在此阶段发送网络请求、进行一些 DOM 的操作、添加一些订阅等
更新阶段
这一阶段主要是组件状态(state)发生变化,重新更新渲染的过程
getDerivedStateFromProps 函数(不常用)
作用:state 的值在任何时候都依赖于 props 时使用;该方法返回一个对象来更新 state
shouldComponentUpdate 函数
作用:主要用于性能优化,决定是否执行 render 函数
render 函数
作用:组件更新的时候,也会回调
getSnapshotBeforeUpdate 函数(不常用)
作用:在 React 更新 DOM 之前回调的一个函数,可以获取 DOM 更新前的一些信息(比如说滚动位置)
componentDidUpdate 函数
作用:组件已经发生更新时,就会回调,可以在此对更新之后的组件进行操作、对更新前后的props进行比较,也可以在此阶段发送网络请求,反之,则不会执行网络请求
卸载阶段
这一阶段主要是组件从DOM树被移除的过程
componentWillUnmount 函数
作用:组件即将被移除时,就会回调,在此阶段可以执行一些清理的操作,如清除 timer、取消网络请求、清除在 componentDidMount() 中创建的订阅等
代码演示
父组件
// App.jsx
import React from "react"
import Home from "./Home"
class App extends React.Component {
constructor() {
super()
this.state = {
ifShow: true
}
}
changeShow() {
this.setState({ ifShow: !this.state.ifShow })
}
render() {
const { ifShow } = this.state
return (
<div>
<button onClick={e => this.changeShow()}>是否展示</button>
{ ifShow && <Home/> }
</div>
)
}
}
export default App
子组件
// Home.jsx
import React from "react"
class Home extends React.Component {
// 1.构造方法: constructor
constructor() {
console.log("挂载时-创建组件---constructor")
super()
this.state = {
title: "React"
}
}
changeText() {
this.setState({ title: "React学习笔记" })
}
// 2.getDerivedStateFromProps
static getDerivedStateFromProps(props, state){
console.log("挂载或更新时-映射数据---getDerivedStateFromProps");
console.log(props, state)
return props
}
// 3.执行render函数
render() {
if(this.state.title === "React"){
console.log('挂载时-渲染组件---render')
}else{
console.log('更新时-渲染组件---render')
}
const { title } = this.state
return (
<div>
<h1>{title}</h1>
<button onClick={e => this.changeText()}>修改标题</button>
</div>
)
}
// 4.组件被渲染到DOM: 被挂载到DOM
componentDidMount() {
console.log("挂载时-渲染完成---componentDidMount")
}
// 5.组件的DOM被更新完成: DOM发生更新
componentDidUpdate(prevProps, prevState, snapshot) {
// snapshot 可以获取到 getSnapshotBeforeUpdate 函数的返回值
console.log("更新时-更新完成---componentDidUpdate:", prevProps, prevState, snapshot)
}
// 6.组件从DOM中卸载掉: 从DOM移除掉
componentWillUnmount() {
console.log("卸载时-即将被卸载---componentWillUnmount")
}
// 不常用的生命周期补充
shouldComponentUpdate() {
console.log("更新时-决定是否要更新---shouldComponentUpdate")
return true
}
// 获取组件更新前的快照
getSnapshotBeforeUpdate() {
console.log("更新时-最后能获取到更新之前数据的地方---getSnapshotBeforeUpdate")
return {
scrollPosition: 100
}
}
}
export default Home
来源:https://juejin.cn/post/7339746416930603023
猜你喜欢
- 2025-01-05 vue 3 学习笔记 (八)——provide 和 inject 用法及原理
- 2025-01-05 vue3 学习笔记 (一)——mixin 混入
- 2025-01-05 golang+mysql+GORM学习笔记
- 2025-01-05 Vue3 学习笔记,快速初始化Vue项目及 data 函数用法学习(二)
- 2025-01-05 Web前端经典面试题(三)
- 2025-01-05 前端工具ESLint
- 2025-01-05 「React Hooks 学习笔记」useMemo
- 2025-01-05 Jquery属性——学习笔记(一)
- 2025-01-05 SwiftUI学习笔记,可视化编辑和界面布局(二)
- 2025-01-05 「React Hooks 学习笔记」useCallback
你 发表评论:
欢迎- 582℃几个Oracle空值处理函数 oracle处理null值的函数
- 576℃Oracle分析函数之Lag和Lead()使用
- 562℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 561℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 556℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 546℃【数据统计分析】详解Oracle分组函数之CUBE
- 535℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 530℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)