react判断滚动到底部以及保持原来的滚动位置_react判断页面滚动到底部_ningto.com的博客-程序员秘密

技术标签: ningto.com  

这里解决两个问题:
* 判断某个组件是否滚动到底部
* 页面切换出去再切换回来后怎样保持之前的滚动位置

要保证这个组件就是那个滚动的组件,overflowY为scroll

判断某个组件是否滚动到底部

  • 组件代码如下,通过ref获取真实的dom节点
<div ref={ node => this.contentNode = node }>
  • 在组件加载完成后增加监听scroll事件,组件将要卸载的时候移除事件,onScrollHandle里面就可以判断是否滚动到了底部
  onScrollHandle(event) {
    const clientHeight = event.target.clientHeight
    const scrollHeight = event.target.scrollHeight
    const scrollTop = event.target.scrollTop
    const isBottom = (clientHeight + scrollTop === scrollHeight)
    console.log('is bottom:' + isBottom)
  }

  componentDidMount() {
    if (this.contentNode) {
      this.contentNode.addEventListener('scroll', this.onScrollHandle.bind(this));
    }
  }

  componentWillUnmount() {
    if (this.contentNode) {
      this.contentNode.removeEventListener('scroll', this.onScrollHandle.bind(this));
    }
  }

页面切换出去再切换回来后怎样保持之前的滚动位置

  • 当页面切换出去的时候会调用componentWillUnmount方法,所以在这里记录下当前组件位置
  • 当页面切换进来的时候会调用componentDidMount方法,将之前保存的位置重新赋值给组件
    代码如下:
let scrollTop = 0
onScrollHandle(event) {
    const clientHeight = event.target.clientHeight
    const scrollHeight = event.target.scrollHeight
    const scrollTop = event.target.scrollTop
    const isBottom = (clientHeight + scrollTop === scrollHeight)
    if (this.state.isScrollBottom !== isBottom) {
      this.setState({
        isScrollBottom: isBottom
      })
    }
  }

  componentDidMount() {
    if (this.contentNode) {
      this.contentNode.addEventListener('scroll', this.onScrollHandle.bind(this));
      this.contentNode.scrollTop = scrollTop
    }
  }

  componentWillUnmount() {
    if (this.contentNode) {
      this.contentNode.removeEventListener('scroll', this.onScrollHandle.bind(this));
      scrollTop = this.contentNode.scrollTop
    }
  }

scrollTop放在类外面作为全局变量

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tujiaw/article/details/77511460

智能推荐

android studio 以及intellij idea 常用插件_android sql query plugin 高亮怎么用_CodeYourBrother的博客-程序员秘密

主要是从不同的地方一块弄过来,整理一下,确实好用AndroidAccessors快速生成get和set方法的插件,其实系统的也有类似功能,这个更快。Lifecycle-Sorter可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序, 快捷键Ctrl + alt + KJsonOnlineViewer可实

Visual Studio 2019 上 Github 的使用(1)—— 最基本的提交和拉取_-Hedon的博客-程序员秘密

本篇整理了再 Visual Studio 2019 版本上 Github 插件的安装和使用。包括了本地库和远程库的创建,以及 Git 中最基础的提交和拉取操作。后序会继续整理分支的处理这种比较复杂的使用操作。有错误地方请多多指正!谢谢!

登录功能图片验证码的实现_特雷西_的博客-程序员秘密

    首先从网上下载一个生成验证码的Servlet:package com.train.controller;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import...

【FreeRTOS】FreeRTOS学习笔记(3)— FreeRTOS任务与协程_果果小师弟的博客-程序员秘密

一、什么是任务在裸机系统中,系统的主体就是main函数里面顺序执行的无限循环,这个无限循环里面CPU按照顺序完成各种事情。在多任务系统中,我们根据功能的不同,把整个系统分割成一个个独立的且无法返回的函数,这个函数我们称为任务,也可以称之为线程。void task1(void *pvParameters){ /* 任务主体,无限循环且不能返回 */ for(;;) { /* 任务主体代码 */ vTaskDelay( 2000 ); }}二、任务状态FreeRTOS中的任务永

DataGridView绑定数据源后添加行_datagridview绑定数据后添加行_本田透的博客-程序员秘密

在已经绑定数据源时,无法以Add的方式方式添加行,会报错解决方法一:DataRow dr =((DataTable)dataGridView1.DataSource).NewRow;((DataTable)dataGridView1.DataSource).Rows.Add(dr);解决方法二://先将datatable(dt)新增行,然后重新绑定数据源//DataT...

串行通信比并行通信的速度更高_更高速度的通讯技术_毅无涯的博客-程序员秘密

“众人拾柴火焰高”是句老话,但电脑领域却发生了多根线比不过1根线的怪事。无论从通信速度、造价还是通信质量上来看,现今的串行传输方式都比并行传输方式更胜一筹。 近两年,大家听得最多的一个词可能就是串行传输了。从技术发展的情况来看,串行传输方式大有彻底取代并行传输方式的势头,USB取代IEEE 1284,SATA取代PATA,PCI Express取代PCI……从原理来看,并行传输方式其实优于串行

随便推点

php 拆解字符串,php拆分中文字符串_范米索的博客-程序员秘密

分隔字符串,使用“str_split”就可以了好处是连空格也会作为数组的元素。我之前的例子就是因为前一个字符串包含2个空格,而后一个只有一个。但是输出的时候看到的显示都是一样的。也可以按照其他分隔符进行分割,如“explode”或者“preg_split”,php教程 explode() 函数php string 函数定义和用法explode() 函数把字符串分割为数组。语法explode(sep...

《Windows核心编程系列》十一谈谈Windows线程池_windows系统编程线程池_ithzhang的博客-程序员秘密

Windows线程池      上一篇博文我们介绍了IO完成端口。得知IO完成端口可以非常智能的分派线程。但是IO完成端口仅对等待它的线程进行分派,创建和销毁线程的工作仍然需要我们自己来做。      我们自己也可以创建线程,但是涉及到线程的编码操作比较复杂,容易出现差错。为了简化程序员的工作,Windows提供了一个线程池机制来简化线程的创建、销毁以及日常管理。这个新线程池可能不

3DMax怎么导出材质到unity?_3dmaxfxshader导出_avi9111的博客-程序员秘密

先拿一个茶壶模型当例子新建一个茶壶模型,为之创建一个Standard材质球,设置属性 将Max中的渲染效果图导出成FBX文件Presets选择 Autodesk Media &amp; EntertAInment取消Animation、Cameras、Lights的勾选勾选Embed Media,它会把材质和贴图数据写入FBX文件中其他都保持不变导出的文件复制到Unity项目的Asserts目录下Unity会解析这个FBX,分解出它的材质和贴图Materials中存放该模型的所有材质,Te

Centos6 安装zabbix-agent_linglong0820的博客-程序员秘密

1、操作系统版本查看操作系统版本 cat /etc/issueCentOS release 6.6 (Final)Kernel \r on an \m关闭防火墙和selinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config iptables -F service iptables save

【GLSL教程】(六)逐顶点的光照 【转】_weixin_30455067的博客-程序员秘密

引言在OpenGL中有三种类型的光:方向光(directional)、点光(point)、聚光(spotlight)。本教程将从方向光讲起,首先我们将使用GLSL来模仿OpenGL中的光。我们将向shader中逐渐添加环境光、散射光和高光效果。后面的教程中我们将使用逐像素光照以获得更好的效果。接下来我们将实现逐像素的点光和聚光。这些内容与方向光很相近...

ubuntu开机启动shell脚本_chiwa2270的博客-程序员秘密

1.ln -s /home/XXX.sh /etc/init.d/XXX2.使用update-rc.d 完成自启动 启动和关闭顺序为90,级别默认 update-rc.d <basename> defaults 90 默认 update-rc.d XXX defaults...

推荐文章

热门文章

相关标签