React的生命周期

news/2024/11/29 22:45:07/

旧版本生命周期介绍

 组件从创建到死亡会经历一些特定的阶段

React组件中包含一系列钩子函数(生命周期回调函数) 会在特定的时刻调用

在定义组件时会在特定的生命周期回调函数中做特定的动作

 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<!-- 引入react核心库 -->
<script src="../js/react.development.js"></script>
<!-- 引入react-dom 用于支持react操作dom -->
<script src="../js/react-dom.development.js"></script>
<!-- 引入babel 用于将jsx转为js -->
<script src="../js/babel.min.js"></script><body><div id="test"></div></body>
<!-- 这里一定要指明是babel类型 -->
<script type="text/babel">//类式创建虚拟domclass MyCompent extends React.Component{//构造器constructor(props){console.log('构造器函数')super(props)//初始化状态this.state={count:0}}//卸载组件方法death = ()=>{ReactDOM.unmountComponentAtNode(document.getElementById('test'))}//数字加一回调函数add =()=>{//获取原始数据  解构赋值写法const {count} = this.state;//更新状态this.setState({count:count+1})}//强制更新按钮的回调force= ()=>{this.forceUpdate()}//组件将要挂载时的回调componentWillMount(){console.log('componentWillMount==>组件将要挂载时的回调')}//组件挂载完毕的componentDidMount(){console.log('componentDidMount==>组件挂载完毕的回调')}//组件将要卸载的回调componentWillUnmount(){console.log('componentWillUnmount==>组件将要卸载的回调')}//控制组件更新的阀门shouldComponentUpdate(){console.log('shouldComponentUpdate==>控制组件更新的阀门 默认返回true')return true;}//组件将要更新的回调componentWillUpdate(){console.log('componentWillUpdate==>组件将要更新的回调');}//组件更新完毕的回调componentDidUpdate(){console.log('componentDidUpdate==>组件更新完毕的回调')}render(){return (<div><h1> 生命周期</h1><h2>{this.state.count}</h2><button onClick={this.add}> add </button><button onClick={this.death}> 点击卸载</button><button onClick={this.force}> 不更新状态强制更新(阀门关闭)</button></div>)}}//渲染 组件到页面ReactDOM.render(<MyCompent/>,document.getElementById('test')) </script></html>

测试:

页面初次加载时调用构造,将要挂载和挂载完毕回调

 点击add进行数值增加

 每次调用 组件更新阀门,将要更新回调和更新完毕回调

点击卸载按钮:

组件消失,调用将要卸载回调

下面把阀门关闭

更新阀门回调返回值调整为false 

 

再测试点击add

 

 经过多次点击后数值没有发生变化,说明此时组件的更新已被关闭

这个时候 强制更新按钮的回调就起作用了

此时我们点击强制更新按钮

 可以看到数值直接变为了10 那是因为刚才在连点10次add,但是阀门关闭,所以页面没有被渲染,但是数值是确确实实有改变的,只是没有渲染显示,此时点击强制更新,在阀门关闭的情况下,强制渲染了页面,直接将数值渲染出来了 可以看到调用的回调

子组件接收父组件新的属性值时的回调

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<!-- 引入react核心库 -->
<script src="../js/react.development.js"></script>
<!-- 引入react-dom 用于支持react操作dom -->
<script src="../js/react-dom.development.js"></script>
<!-- 引入babel 用于将jsx转为js -->
<script src="../js/babel.min.js"></script><body><div id="test"></div></body>
<!-- 这里一定要指明是babel类型 -->
<script type="text/babel">//类式创建虚拟domclass MyCompent extends React.Component{//初始化状态//接收父组件新属性值时的回调componentWillReceiveProps(){console.log('componentWillReceiveProps==>接收父组件新属性值时的回调')}state = {isdrink:true,drink:'可乐'}changeDrink=()=>{this.setState({isdrink:!this.state.isdrink})this.setState({drink: this.state.isdrink? '可乐':'冰红茶'})}render(){return (<div><h1> 父组件</h1><button onClick={this.changeDrink}> 换饮料</button><My drink={this.state.drink}/></div>)}}class My extends React.Component{//接收父组件新属性值时的回调componentWillReceiveProps(){console.log('componentWillReceiveProps==>子组件接收父组件新属性值时的回调')}render(){return (<div><h1> 子组件</h1><h2>{this.props.drink}</h2></div>)}}//渲染 组件到页面ReactDOM.render(<MyCompent/>,document.getElementById('test')) </script></html>

测试:

可以看到页面刚加载时没有执行 componentWillReceiveProps这个回调,但是此时父组件已经将饮料可乐这个属性值传递给了子组件

再点击换饮料查看

可以看到,当父组件传递新的属性值给子组件时,才会执行这个回调 

总结

红色表示常用

     初始化阶段: 由 ReactROM.render()触发 --初次渲染

                         1. constructor()

                         2. componentWillMount()

                         3. render()

                         4. componentDidmount()  

                          一般在这个回调中做一些初始化的事 例如:开启定时器 发送网络请求 订阅消息

        更新阶段: 由组件内部this.setState()或父组件render()触发

                         1. shouldComponentUpdate()

                         2. componentWillUpdate()

                         3. render() 

                         4. componentDidUpdate() 

  卸载阶段 : 由ReactDOM.unmountComponentAtNode()触发

                         1. componentWillUnmount()  

                         一般这个回调中做一些收尾的事 例如: 关闭定时器 取消订阅消息


http://www.ppmy.cn/news/71321.html

相关文章

effective c++ 04 确定对象被使用前已被初始化

effective c 04 确定对象被使用前已被初始化 在本节中&#xff0c;作者主要强调了对象使用前一定要进行显式的初始化。其中要区分构造函数中的赋值和初始化。另外跨编译模块的初始化问题需要引起注意(通常可以使用单例模式解决)。 分析 使用成员变量初始化列表进行初始化 在…

idea将java程序打包为jar

idea将java程序打包为jar 灵光一现&#xff1a; 用java拉起浏览器&#xff0c;打开指定的网络地址&#xff0c;省的手动打开浏览器再复制地址过去了 本文记录了使用idea将java程序打包为jar包的过程 源码地址&#xff1a;https://gitcode.net/qq_39339588/jar.git 文章目录 ide…

3面美团测试岗,HR现场直接发20k的offer,我是横着走出来的...

前情提要 这是一个发生在我身上的真实事情&#xff1a; 我工作不到2年&#xff0c;周末在朋友圈发了个喜报&#xff0c;准备入职美团。之后&#xff0c;我的朋友就带着祝福跟我聊了许久&#xff0c;聊天的内容就是具体了解一下我面试的过程&#xff0c;心路历程和未来的打算…

SIT和UAT的区别

软件测试是一个重要的开发活动&#xff0c;它可以帮助确保软件质量并减少缺陷。在软件测试过程中&#xff0c;有两种主要类型的测试&#xff1a;系统集成测试&#xff08;SIT&#xff09;和用户验收测试&#xff08;UAT&#xff09;。本文将讨论这两种测试的区别。 系统集成测…

ThinkPHP6布局的方式之模板布局,全局配置方式,模板标签方式,动态方法布局

ThinkPHP6布局的方式之模板布局 ThinkPHP的模板引擎内置了布局模板功能支持&#xff0c;可以方便的实现模板布局以及布局嵌套功能。 有三种布局模板的支持方式&#xff1a;全局配置方式&#xff0c;模板标签方式&#xff0c;动态方法布局。 第一种方式&#xff1a;全局配置方…

3年测试经验,跳进腾讯,3面终获20K的Offer...

前言 时间过得飞快&#xff0c;一代又一代就这么成长了起来&#xff0c;曾经的95后备受争议&#xff0c;如今的95后进入社会&#xff0c;扮演者各行角色&#xff0c;成为了行业顶梁柱&#xff0c;今天&#xff0c;要分享的是自己的成长经历。今年24岁&#xff0c;毕业之后进入…

Linux利器tmux使用教程总览

文章目录 为什么是tmuxtmux的安装在Ubuntu和Debian上安装Tmux在CentOS和Fedora上安装Tmux在macOS上安装Tmux tmux的基本术语tmux的基本操作使用场景 tmux 是一个终端复用器&#xff08;terminal multiplexer&#xff09;&#xff0c;非常有用&#xff0c;属于常用的开发工具。本…

拖拽库/模板引擎

uniapp DIY可视化工具 控件拖拽工具怎么开发 答&#xff1a;需要 (**拖拽库**) &#xff08;**模板引擎**&#xff09;代码自动生成 python有哪些模板引擎 Jinja2是一个小型但快速且易于使用的以纯python编写的独立模板引擎&#xff08;最主要的模板&#xff09;Chameleon是T…