浅谈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 相关文章推荐
javascript 禁止复制网页
Jun 11 Javascript
js原型链原理看图说明
Jul 07 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
jquery浏览器滚动加载技术实现方案
Jun 03 Javascript
jquery动态添加删除一行数据示例
Jun 12 Javascript
js实现缓冲运动效果的方法
Apr 10 Javascript
png在IE6 下无法透明的解决方法汇总
May 21 Javascript
jQuery实现为控件添加水印文字效果(附源码)
Dec 02 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
D3.js中强制异步文件读取同步的几种方法
Feb 06 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
vue中各组件之间传递数据的方法示例
Jul 27 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中使用Oracle数据库(6)
2006/10/09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php操作xml
2013/10/27 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
js判断是否是手机页面
2017/03/17 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
解决python对齐错误的方法
2020/07/16 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
自主实习接收函
2014/01/13 职场文书
淘宝活动策划方案
2014/02/06 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
职业女性的职业规划
2014/03/04 职场文书
党建工作先进材料
2014/05/02 职场文书
2014年村委会工作总结
2014/11/24 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
青涩记忆观后感
2015/06/18 职场文书
无线电知识基础入门篇
2022/02/18 无线电