React - getSnapshotBeforeUpdate() 的使用

2023-10-30

getSnapshotBeforeUpdate() 方法

1:在render之前调用,state已更新

 2:典型场景:获取render之前的dom状态

我们来看一个例子,

每一秒钟都会加入一个新的<div>msg : number</div>

假如我们使用滑轮移到某个地方,内容物会随着时间不断下降,因为新生成的div会把它挤下来,如何保持不动了?

<script type = 'text/babel'>
 
class SnapshotSample extends React.Component {
     constructor(props) {
        super(props);
        this.state = {
          messages: [],//用于保存子div
        }
     }

     handleMessage () {//用于增加msg
       this.setState( pre => ({
         messages: [`msg: ${ pre.messages.length }`, ...pre.messages],
       }))
     }
     componentDidMount () {
        
       for (let i = 0; i < 20; i++) this.handleMessage();//初始化20条
       this.timeID = window.setInterval( () => {//设置定时器
            if (this.state.messages.length > 200 ) {//大于200条,终止
              window.clearInterval(this.timeID);
              return ;
            } else {
              this.handleMessage();
            }
       }, 1000)
     }
     componentWillUnmount () {//清除定时器
       window.clearInterval(this.timeID);
     }
     getSnapshotBeforeUpdate () {//很关键的,我们获取当前rootNode的scrollHeight,传到componentDidUpdate 的参数perScrollHeight
       return this.rootNode.scrollHeight;
     }
     componentDidUpdate (perProps, perState, perScrollHeight) {
       const curScrollTop= this.rootNode.scrollTop;
       if (curScrollTop < 5) return ;
       this.rootNode.scrollTop = curScrollTop + (this.rootNode.scrollHeight  - perScrollHeight);
       //加上增加的div高度,就相当于不动
     }
     render () {
      
       return (
           <div className = 'wrap'  ref = { node => (  this.rootNode = node)} >
               { this.state.messages.map( msg => (
                 <div>{ msg } </div>
               ))}
          </div>
       );
     }
}
ReactDOM.render(
  <SnapshotSample />,
  document.getElementById("root")
)
</script>

  .wrap{
    height: 100px;
    width :200px;
    padding: 1px solid #eee;
    overflow:auto;
  }

关键在于通过getSnapshotBeforeUpdate方法,获取dom信息,然后通过componentDidUpdate反映。

下面是其他方法的用途

Constructor

1: 用于初始化操作,一般很少使用

2:唯一一个直接修改state的地方,其他地方通过调用this.setState()方法。

getDerivedStateFromProps

1:当state需要从props初始化时,使用

2:尽量不使用,维护俩者状态需要消耗额外资源,增加复杂度

3:每次render都会调用

4:典型场景表单获取默认值

componentDidMount

1:UI渲染完成后调用

2:只执行一次

3:典型场景:获取外部资源

componentWillUnmount

1:组件被移除时调用

2:典型场景:资源释放

getSnapshotBeforeUpdate

1:在render之前调用,state已更新

2:典型场景:获取render之前的dom状态

componentDidUpdate

1:每次UI更新被调用

2:典型场景:页面通过props重新获取数据

shouldComponentUpdate

1:觉得Vistual Dom是否重绘

2:一般可以由PuerComponent自动实现

3:典型场景:性能优化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React - getSnapshotBeforeUpdate() 的使用 的相关文章

随机推荐

  • zabbix数据库添加主从同步

    zabbix数据库正常运行的情况下 做mysql主从同步添加从库操作 一 在从库主机上安装mysql 注 版本与主库master一致 1 1 创建用户 groupadd mysql useradd r g mysql mysql 1 2 上
  • 服务器系列和酷睿系列,至强cpu与酷睿两个系列之间有什么区别?

    很多朋友选购英特尔处理器时 会纠结于酷睿与至强两个系列之间就 不知如何选择 标致左酷睿 右至强 酷睿系列CPU如i3 i5 i7是我们一般消费者最为熟悉的 它也是针对大部分家用桌面级消费者开发的中高端处理器 当然也包括低端的G系列的赛扬处理
  • (第一章)嵌入式linux之常用汇编指令

    1 处理器内部数据传输指令 数据传输指令分为 一般寄存器间的数据传输或者 特殊寄存器与一般寄存器间的数据传输 数据传输常用的指令有三个 MOV MRS 和 MSR 用法示例 1 MOV 指令 MOV R0 R1 将寄存器 R1 中的数据传递
  • 基于百度飞桨PaddlePaddle和PARL复现PPO强化学习算法

    文章目录 一 PPO训练效果展示 Mujoco HalfCheetah v2 二 策略优化算法发展回顾 三 PPO 算法论文阅读 1 Introduction 2 Background Policy Optimization 2 1 Pol
  • R语言使用RMySQL连接及读写Mysql数据库

    简单说下安装过程 一般不会有问题 重点是RMySQL的使用方式 系统环境说明 Redhat系统 Linux 460 42 6 32 431 29 2 el6 x86 64 系统编码 LANG zh CN UTF 8 中文UTF 8格式 my
  • Access Token是做什么的

    我们在访问很多大公司的开放 api 的时候 都会发现这些 api 要求传递一个 access token 参数 这个参数是什么呢 需要去哪里获取这个 access token 呢 access token 是在 Oauth2 0 协议中 客
  • ag-Grid的基本用法一(表格列的定义)

    最近在研究基于angular2 的表格的用法 发现一种非常好用的表格 就是ag grid ag grid不仅对angular1 x有支持 还支持react vue等目前主流的前端框架 这里我们只是对angular2 中的ag grid进行讲
  • 朴素贝叶斯分类器:R语言实现

    span style font family none background color rgb 255 255 255 span span style font family none background color rgb 255 2
  • flask中request.args和request.form区别

    app route ajaxget1 def ajax test get server name request args get server name server ip request args get server ip print
  • 前端的反单引号语法之`${}`

    es6中新增的字符串方法 可以配合反单引号完成拼接字符串的功能 1 反单引号怎么打出来 将输入法调整为英文输入法 单击键盘上数字键1左边的按键 2 用法 step1 定义需要拼接进去的字符串变量 step2 将字符串变量用 包起来 再写到需
  • c语言打开文本有什么作用,c语言文件打开方式有哪些

    c语言文件打开方式有哪些 ANSI C规定文件打开用函数fopen 关闭为fclose 1 调用方式通常为 FILE fp fp fopen 文件名 打开方式 2 参数说明 文件名 形如 myfile dat F data myfile d
  • 数据序列相关性-ACF,PACF和CCF

    引言 最近写论文关于预测的特征选择遇到一些问题 想把自己查询学习到的东西整理记录一下 理一理头绪 希望能加深自己对这些东西的理解 首先介绍引入几个概念 自相关函数 autocorrelation function ACF 偏自相关函数 pa
  • OLED透明屏全贴合技术:未来显示技术的突破性创新

    在现代科技发展的浪潮中 OLED透明屏全贴合技术以其独特的优势和无限的应用前景引起了广泛的关注 在这篇文章中 尼伽将深入探索OLED透明屏全贴合技术 介绍其优势和特点 并展望其在不同领域的应用前景 一 OLED透明屏全贴合技术 OLED透明
  • pytorch:批训练(batch_training)

    一 什么是批训练 批训练 意思是把整套训练数据分成数个批次进行训练 每个批次从数据中选取 n num 总数据 n batch 批次 个数据 直到把整套数据训练完成 举个例子 有10个输入训练数据 每个批次训练3个数据 这训练完成需要4个批次
  • 手机摄像头组成结构和工作原理

    手机摄像头的组成结构和工作原理 手机摄像头的组成结构和工作原理 手机摄像头由 PCB板 镜头 固定器和滤色片 DSP CCD用 传感器等部件组成 工作原理为 拍摄景物通过镜头 将生成的光学图像投射到传感器上 然后光学图像被转换成电信号 电信
  • html 分割线_html基础必备-分隔标记,前端小白一看就会

    分节 分区和分割线 这些标记用于将页面分成多个部分 熟练地掌握这些标记将意味着构建出具有良好的结构和布局的页面 使其更加友好和易于阅读 分区 div标记定义了HTML文件中的一个部分或分区 它通常包含需要组合在一起的标题 段落 表格或其他元
  • python写excel文件不覆盖_python向已存在的excel中新增表,不覆盖原数据的实例

    每月需更新某个excel表格 进行两项操作 且不覆盖原有的sheet 1 在原来的excel表中新增sheet 2 往原有的excel表中的某张sheet新增内容 基于python3 使用xlrd xlwt 具体代码如下 亲测有效 希望对大
  • 软件测试分级理论

    软件测试是软件工程当中不可或缺的一个过程 在软件工程中 测试者充当 虚拟用户 对软件产品进行检验 只有经过严格测试的软件产品 才能发布给用户使用 只要有软件的地方 就有软件测试 软件测试是一个包罗万象的话题 这种 包罗万象 的具体表现之一就
  • 工控安全PLC固件逆向一

    在工控领域 我们会遇到许多协议 为了进行安全研究 经常需要对协议的具体内容进行探索 今天我们就来聊聊关于工控协议逆向的问题 接下来会简单介绍一下常用的协议逆向方法并配合一些实战 当然 从未知到已知的探索过程不仅仅需要代码上的实践 还需要数学
  • React - getSnapshotBeforeUpdate() 的使用

    getSnapshotBeforeUpdate 方法 1 在render之前调用 state已更新 2 典型场景 获取render之前的dom状态 我们来看一个例子 每一秒钟都会加入一个新的 div msg number div 假如我们使