浅谈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 相关文章推荐
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
可插入图片的TEXT文本框
Dec 27 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
jQuery实现验证码功能
Mar 17 Javascript
angular中实现控制器之间传递参数的方式
Apr 24 Javascript
js实现放大镜特效
May 18 Javascript
基于jquery实现多级菜单效果
Jul 25 jQuery
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 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
YII模块实现绑定二级域名的方法
2014/07/09 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
JavaScript类的继承操作实例总结
2018/12/20 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
python自动安装pip
2014/04/24 Python
Python不规范的日期字符串处理类
2014/06/10 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python 串口通信的实现
2020/09/29 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
美国校服网上商店:French Toast
2019/10/08 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
通用求职信范文模板分享
2013/12/27 职场文书
青年文明号事迹材料
2014/01/18 职场文书
小班秋游活动方案
2014/02/22 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
学前教育专业求职信
2014/09/02 职场文书
门店店长岗位职责
2015/04/14 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python