浅谈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里写一个swing把数据插入数据库
Dec 10 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
javascript中不等于的代码是什么怎么写
Dec 29 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
jquery实现自适应banner焦点图
Feb 16 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
Feb 19 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
微信小程序自定义底部导航带跳转功能
Nov 27 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
Sep 02 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中cookie的使用方法
2014/03/29 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
使用console进行性能测试
2015/04/27 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
Python 操作MySQL详解及实例
2017/04/30 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
深入浅析Python传值与传址
2018/07/10 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python实现飞机大战小游戏
2019/11/08 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
Python中return函数返回值实例用法
2020/11/19 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
怎么写好自荐信
2013/10/30 职场文书
实用求职信范文分享
2013/12/25 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
党性教育心得体会
2014/09/03 职场文书
小学班主任自我评价
2015/03/11 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
西柏坡观后感
2015/06/08 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
简述Java中throw-throws异常抛出
2021/08/07 Java/Android