浅谈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类
Sep 08 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
Jan 27 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
Nov 07 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
Dec 03 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
Javascript中document.referrer隐藏来源的方法
Jan 16 Javascript
Javascript实现数组中的元素上下移动
Apr 28 Javascript
webpack多页面开发实践
Dec 18 Javascript
vscode中vue-cli项目es-lint的配置方法
Jul 30 Javascript
vue+elementUI实现图片上传功能
Aug 20 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php统计文章排行示例
2014/03/04 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
python局部赋值的规则
2013/03/07 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
Django模板语言 Tags使用详解
2019/09/09 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
Ruby如何定义一个类
2012/10/08 面试题
大一学生的职业生涯规划书范文
2014/01/19 职场文书
2014年保管员工作总结
2014/11/18 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
办公用房租赁协议书
2014/11/29 职场文书
区域经理岗位职责
2015/02/02 职场文书
js Proxy的原理详解
2021/05/25 Javascript
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记