浅谈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,水平有待提高
Jan 31 Javascript
javascript中DOM复选框选择用法实例
May 14 Javascript
javascript生成大小写字母
Jul 03 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 Javascript
vue-router实现webApp切换页面动画效果代码
May 25 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 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下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
php判断目录存在的简单方法
2019/09/26 PHP
Extjs 几个方法的讨论
2010/01/28 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python字符串中查找子串小技巧
2015/04/10 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python通过post提交数据的方法
2015/05/06 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
毕业生自荐信如何写
2014/03/24 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
毕业设计致谢词
2015/05/14 职场文书
干部理论学习心得体会
2016/01/21 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
Python 图片添加美颜效果
2022/04/28 Python