浅谈react.js中实现tab吸顶效果的问题


Posted in Javascript onSeptember 06, 2017

在react项目开发中有一个需求是,页面滚动到tab所在位置时,tab要固定在顶部。

实现的思路其实很简单,就是判断当滚动距离scrollTop大于tab距离页面顶部距离offsetTop时,将tab的position变为fixed。

在react中,我在state中设置一个navTop属性,切换这个属性的值为true或者false,然后tab标签使用classnames()这个方法来利用navTop的值添加类名fixed。

一开始我是这样写的:

import cs from 'classnames';

class FixedTab extends React.Component{
 constructor(props){
   super(props);
   
   this.state = {
    navTop: false
   }

   this.$tab = null;
   this.offsetTop = 0;
 }

 componentDidMount(){
  this.$tab = this.refs.tab;
  if(this.$tab){
   this.offsetTop = this.$tab.offsetTop;
   window.addEventListener('scroll',this.handleScroll);
  }
 }

 handleScroll(){
  let sTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

  if(sTop >= this.offsetTop){
    this.setState({
     navTop: true
    })
  }

  if(sTop < this.offsetTop){
    this.setState({
     navTop:false
    })
  }
 }

 render(){
  return(
    <div ref="tab" className={cs({'fixed':this.state.navTop})}></div>
  )
 } 
}

然后我发现这样写有问题,当我滚动条滚动距离达到条件时,tab是出现了吸顶的效果,但一瞬间又恢复了,滚动条也回弹了,一直无法继续下拉。

我一开始以为判断逻辑有问题,但一直找不到解决的办法,后来我怀疑是state值改变的时间差导致的,好像陷入了一个死循环,然后我就在判断滚动距离之前加了一个判断navTop的状态。

修改的主要代码如下:

handleScroll(){
  let sTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

  if(!this.state.navTop && sTop >= this.offsetTop){
    this.setState({
     navTop: true
    })
  }

  if(sTop < this.offsetTop){
    this.setState({
     navTop:false
    })
  }
 }

这样修改之后吸顶效果就正常了。

我认为就是setState方法导致的问题,setState本身是一个异步的方法,它还有一个参数是回调函数。

以上这篇浅谈react.js中实现tab吸顶效果的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
自己编写的支持Ajax验证的JS表单验证插件
May 15 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
原生js获取left值和top值的三种方法
Aug 02 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
使用nvm和nrm优化node.js工作流的方法
Jan 17 Javascript
微信小程序后台持续定位功能使用详解
Aug 23 Javascript
vue组件初学_弹射小球(实例讲解)
Sep 06 #Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 #Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 #Javascript
浅谈angular4生命周期钩子
Sep 05 #Javascript
webpack踩坑之路图片的路径与打包
Sep 05 #Javascript
js实现鼠标跟随运动效果
Aug 02 #Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
Sep 05 #Javascript
You might like
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
React中上传图片到七牛的示例代码
2017/10/10 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python中动态创建类实例的方法
2017/03/24 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
python方向键控制上下左右代码
2018/01/20 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
护士辞职信模板
2014/01/20 职场文书
运动会通讯稿400字
2014/01/28 职场文书
初中家长寄语
2014/04/02 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
公积金贷款承诺书
2015/04/30 职场文书
法院答辩状格式
2015/05/22 职场文书
小孩不笨观后感
2015/06/03 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers