浅谈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 相关文章推荐
非常好的js代码
Jun 27 Javascript
又一个小巧的图片预加载类
May 05 Javascript
javascript中的array数组使用技巧
Jan 31 Javascript
jquery CSS选择器笔记
Mar 29 Javascript
window.ActiveXObject使用说明
Nov 08 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
JavaScript实现简单图片滚动附源码下载
Jun 17 Javascript
jQuery对象的selector属性用法实例
Dec 27 Javascript
JavaScript中操作Mysql数据库实例
Apr 02 Javascript
JS验证码实现代码
Sep 14 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
JavaScript提升机制Hoisting详解
Oct 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php调用shell的方法
2014/11/05 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
js 页面输出值
2008/11/30 Javascript
javascript 写类方式之十
2009/07/05 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
js日历功能对象
2012/01/12 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
简单的编程0基础下Python入门指引
2015/04/01 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
Django中的cookie和session
2019/08/27 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Python函数式编程实例详解
2020/01/17 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
医学生就业推荐表自我鉴定
2014/03/26 职场文书