react学习——15react生命周期(新)

news2024/12/26 23:41:17

一、生命周期图新
在这里插入图片描述

二、生命周期三个阶段(新)

1. 初始化阶段:由ReactDOM.render()触发—初次渲染

1.	constructor()
2.	getDerivedStateFromProps 
3.	render()
4.	componentDidMount()

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

1.	getDerivedStateFromProps
2.	shouldComponentUpdate()
3.	render()
4.	getSnapshotBeforeUpdate()
5.	componentDidUpdate()

3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发

1.componentWillUnmount()

4、重要的勾子

1.		render:初始化渲染或更新渲染调用
2.	componentDidMount:开启监听, 发送ajax请求
3.	componentWillUnmount:做一些收尾工作, 如: 清理定时器

5、即将废弃的勾子

1.	componentWillMount
2.	componentWillReceiveProps
3.	componentWillUpdate

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--    移动端适配-->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3_react生命周期(新).html</title>
</head>
<body>
<!--准备一个容器-->
<div id="root"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/17.0.1/react.development.js"></script>
<script type="text/javascript" src="../js/17.0.1/react-dom.development.js"></script>
<!--引入babel,用于jsx的转换jsx-->
<script type="text/javascript" src="../js/17.0.1/babel.min.js"></script>
<script type="text/babel">/*此处一定要写babel*/
    //创建组件
class Demo extends React.Component{
    //构造器
    constructor(props){
        console.log("count--constructor")
        super(props)
        this.state={
            count: 1
        }
    }
    //组件挂载完毕
    componentDidMount(){
        console.log("count--componentDidMount")
    }


    //组件挂载完毕
    componentDidMount(){
        console.log("count--componentDidMount")
    }
    //组将将要被卸载
    UNSAFE_componentWillUnmount(){
        console.log("count--componentWillUnmount")

    }
    //控制组件更新的阀门
    shouldComponentUpdate(nextProps, nextState, nextContext) {
        console.log("count--shouldComponentUpdate")
        return true
    }
    //组件更新完毕
    componentDidUpdate(prevProps, prevState, snapshot) {
        console.log("count--componentDidUpdate",prevProps,prevState,snapshot)
    }
    //更新之前获取快照
    getSnapshotBeforeUpdate(prevProps, prevState) {
        console.log("count--getSnapshotBeforeUpdate")
        //return null
        return 'getSna'
    }
    static getDerivedStateFromProps(nextProps, prevState) {
        console.log("count--getDerivedStateFromProps",nextProps,prevState)
        return null
    }
    death=()=>{
        ReactDOM.unmountComponentAtNode(document.getElementById('root'))
    }
    add=()=>{
        this.setState({
            count:this.state.count+1
        })
    }
    //强制更新
    force=()=>{
        this.forceUpdate()
    }
    // 调用时机:初始化渲染和更新之后
    render(){
        console.log("count--render")
        const {count} = this.state
        return(
            <div>
                <h1 >当前求和为:{count}</h1>
                <button onClick={this.add}>点我加1</button>
                <button onClick={this.death}>卸载组件</button>
                <button onClick={this.force}>不更改任何数据中的状态,强制更新一下</button>
            </div>
        )
    }
}
        ReactDOM.render(<Demo count={199}/>,document.getElementById('root'))
</script>
</body>
</html>

6、getSnapshotBeforeUpdate场景

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!--    移动端适配-->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4_getSnapshotBeforeUpdate使用场景.html</title>
    <style>
        .list{
            width: 200px;
            height: 150px;
            background-color: skyblue;
            overflow: auto;
        }
        .news{
            height: 30px;
        }
    </style>
</head>
<body>
<!--准备一个容器-->
<div id="root"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/17.0.1/react.development.js"></script>
<script type="text/javascript" src="../js/17.0.1/react-dom.development.js"></script>
<!--引入babel,用于jsx的转换jsx-->
<script type="text/javascript" src="../js/17.0.1/babel.min.js"></script>
<script type="text/babel">/*此处一定要写babel*/
    //创建组件
class Demo extends React.Component{
    state= {
        newsArr:[]
    }
    componentDidMount(){
        setInterval(()=>{
            //获取老数据
            const {newsArr} = this.state
            //模拟一条新闻
            const news = "新闻" + (newsArr.length+1)
            this.setState({
                newsArr:[news,...newsArr]
            })
        },1000)
    }
    getSnapshotBeforeUpdate(prevProps, prevState) {
        return this.refs.list.scrollHeight

    }
    componentDidUpdate(prevProps, prevState,height) {
        this.refs.list.scrollTop += this.refs.list.scrollHeight - height
    }
    render(){
        return(
            <div class="list" ref="list">
                {
                    this.state.newsArr.map((item,index)=>{
                        return <div class="news" key={index}>{item}</div>
                    })
                }
            </div>
        )
    }
}
        ReactDOM.render(<Demo />,document.getElementById('root'))
</script>
</body>
</html>

效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux学习十八】网站管理:防火墙介绍、静态站点、动态站点、域名

1.Apache Apache官网: www.apache.org 软件包名称: httpd 服务端口:80/tcp(http) 443/tcp(https) 配置文件: /etc/httpd/conf/httpd.conf 子配置文件:/etc/httpd/conf.d/*.conf 查看被占用的端口号 netstat -tuln | grep <端口号> 解哪个程序正在使用端口 80&#xff0…

微信小程序版threejs的使用

首先是使用环境:我是使用的uniapp制作的微信小程序,当然原生的也是可以的,但是测试过很多,发现微信官方的threejs移植版本只能够导入gltf格式的模型,无法导入obj,这就有些尴尬了,为此我找了很多版本的threejs,首先是threejs-miniprogram,也就是官方的,可以直接在unia…

和AI高效对话,掌握这6个原则就够了!

一、前言 2023年11月30日&#xff0c;ChatGPT3.5发布以后&#xff0c;震撼了全球。很多普通人发现&#xff0c;只要会提问题&#xff0c;自己也可以大大方方地拥抱AI和大模型的浪潮~ 对大模型AI提问的技术&#xff0c;就是我们常说的Prompt技术。 Prompt技术&#xff0c;全称为…

状态压缩动态规划(State Compression DP)算法详解

状态压缩动态规划&#xff08;State Compression DP&#xff09;是一种高效解决组合优化问题的技术&#xff0c;特别适用于那些状态空间较大且可以用二进制表示的情况。本文将详细讲解状态压缩DP的原理、常用的位运算技巧、以及具体的例题分析。 原理概述 状态压缩DP的核心思…

[ios逆向]查看ios安装包ipa签名证书embedded.mobileprovision解密 附带解密环境openssl

openssl smime -inform der -verify -noverify -in embedded.mobileprovision 解密embedded.mobileprovision文件 链接&#xff1a;https://pan.baidu.com/s/1UwNOWONKV1SNj5aX_ZZCzQ?pwdglco 提取码&#xff1a;glco –来自百度网盘超级会员V8的分享 可以使用everything 查看…

红酒邂逅瑜伽,开启一场身、心、灵的完美和谐之旅

在喧嚣的都市中&#xff0c;人们总是渴望寻找一处心灵的宁静&#xff0c;一个能够释放身心疲惫的场景。而红酒与瑜伽&#xff0c;正是这样一对奇妙的组合&#xff0c;它们共同为我们开启了一场身心灵的和谐之旅。今天&#xff0c;就让我们一起走进这个充满魅力的世界&#xff0…

守护变电箱消防安全,全氟己酮自动灭火片该安装在哪个位置?

变电箱、配电柜、换电柜是电力设备的重要组成部分&#xff0c;安全性至关重要。但在使用过程中&#xff0c;容易受到电气、机械、环境等因素影响&#xff0c;出现接触不良、短路、漏电等安全隐患&#xff0c;从而引发火灾事故。为了及时防范火灾风险&#xff0c;提前安装一款能…

「51媒体」湖北地区媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 湖北地区拥有网络媒体、电视媒体、报纸杂志、视频媒体等多…

【论文速读】|MEDFUZZ:探索大语言模型在医学问题回答中的鲁棒性

本次分享论文&#xff1a;MEDFUZZ: EXPLORING THE ROBUSTNESS OF LARGE LANGUAGE MODELS IN MEDICAL QUESTION ANSWERING 基本信息 原文作者&#xff1a;Robert Osazuwa Ness, Katie Matton, Hayden Helm, Sheng Zhang, Junaid Bajwa, Carey E. Priebe, Eric Horvitz 作者单…

ModuleNotFoundError: No module named ‘gdal‘

第一步检查gdal包是否正确安装&#xff1a; conda list 已经安装显示如下 若查找不到&#xff1a;请按照此说明步骤进行安装&#xff1a;ModuleNotFoundError: No module named ‘osgeo‘_modulenotfounderror: no module named osgeo-CSDN博客 第二步&#xff1a;检查是否可以…

Shopee、Lazada测评,是找服务商呢?还是建议自己养号补单呢?

目前大部分Shopee、Lazada的卖家由于运营成本的增加&#xff0c;都会找服务商测评来打造权重&#xff0c;但是找服务商有很多不靠谱&#xff0c;建议还是自行精养一批号&#xff0c;账号在手里比较安全可控&#xff0c;随时随地可以送测&#xff0c;精准搜索关键词货比三家下单…

SolidWorks薄壁等厚实体转换成钣金方法

1. 打开SolidWorks软件&#xff0c;新建一个零件。选前视基准面绘制草图&#xff0c;二次创建凸台拉伸特征&#xff0c;如图所示。 2. 创建抽壳特征&#xff0c;厚度“2 mm”&#xff0c;如图所示。 3. 添加切口草图&#xff0c;根据钣金加工工艺在所选面上创建切口草图&#x…

自定义 Django 管理界面中的多对多内联模型

1. 问题背景 在 Django 管理界面中&#xff0c;用户可以使用内联模型来管理一对多的关系。但是&#xff0c;当一对多关系是多对多时&#xff0c;Django 提供的默认内联模型可能并不适合。例如&#xff0c;如果存在一个产品模型和一个发票模型&#xff0c;并且产品和发票之间是…

LICEcap最轻便的C++开源GIF录制工具汉化版本

LICEcap是一款开源的、跨平台的GIF动画录制工具&#xff0c;它使用C编写&#xff0c;旨在为用户提供简单、高效且功能丰富的屏幕录制体验。无论是Windows、macOS还是Linux&#xff08;通过WINE模拟器&#xff09;&#xff0c;LICEcap都能轻松捕获屏幕上的动态内容&#xff0c;并…

VB列表框

移动是将列表框1中选中的数字移动到列表框2中。 全部是将列表框1中所有数字移动到列表框2中。 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim i As Integer, a As IntegerRandomize()For i 0 To 9a Int(Rnd() * 90) …

Trip.com 如何从 Elasticsearch 迁移到 ClickHouse 并构建了 50PB 的日志解决方案

本文字数&#xff1a;8721&#xff1b;估计阅读时间&#xff1a;22 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 在 Trip.com&#xff0c;我们为用户提供广泛的数字产品&#xff0c;包括酒店和机票预订、景点、旅游套餐、商务…

玩个游戏 找以下2个wordpress外贸主题的不同 你几找到几处

Aitken艾特肯wordpress外贸主题 适合中国产品出海的蓝色风格wordpress外贸主题&#xff0c;产品多图展示、可自定义显示产品详细参数。 https://www.jianzhanpress.com/?p7060 Ultra奥创工业装备公司wordpress主题 蓝色风格wordpress主题&#xff0c;适合装备制造、工业设备…

红酒达人教你秘技:选酒、存酒,一招一式皆学问

在繁忙的都市生活中&#xff0c;红酒不仅仅是一种饮品&#xff0c;更是一种生活态度&#xff0c;一种品味的象征。然而&#xff0c;面对琳琅满目的红酒品牌与种类&#xff0c;如何选择一瓶心仪的红酒&#xff0c;又如何妥善保存&#xff0c;使其保持很好口感&#xff0c;成为了…

数据库字段不区分大小写

如果你的数据库也是这个排序规则&#xff0c;那么就没法区分大小写。常用的是这样的建表语句。它的collate已经声明为ci&#xff08;不区分大小写&#xff09; 这个时候你Cao和cao当作条件去查询其实作用是一样的&#xff0c;查出来的东西一模一样。 想要区分也很简单&#xff…

Web 权限管理最佳实践:如何提升用户满意度与应用安全性?

引言 在当今数字化时代&#xff0c;Web应用的功能和复杂性不断增加&#xff0c;用户对在线服务的期望也在不断提升。为了提供丰富的用户体验&#xff0c;许多Web应用需要访问用户的个人信息或设备功能&#xff0c;如地理位置、摄像头和麦克风等。这些权限访问在提升应用功能的…