浅谈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生成GUID的多种算法小结
Aug 18 Javascript
浅析JavaScript原型继承的陷阱
Dec 03 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
jquery SweetAlert插件实现响应式提示框
Aug 18 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
JavaScript评论点赞功能的实现方法
Mar 13 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
Mar 21 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
Nov 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源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
基于jquery的表头固定的若干方法
2011/01/27 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Django框架视图函数设计示例
2019/07/29 Python
Python面向对象之Web静态服务器
2019/09/03 Python
python实现滑雪游戏
2020/02/22 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
护理专业毕业生推荐信
2013/10/31 职场文书
劳资人员岗位职责
2013/12/19 职场文书
销售找工作求职信
2013/12/20 职场文书
大家访活动实施方案
2014/03/10 职场文书
超市开店计划书
2014/04/26 职场文书
银行求职自荐信
2014/06/30 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
python实现简单反弹球游戏
2021/04/12 Python
Promise面试题详解之控制并发
2021/05/14 面试题
Python函数式编程中itertools模块详解
2021/09/15 Python