浅谈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 相关文章推荐
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
jQuery实现拖拽效果插件的方法
Mar 23 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
Aug 24 Javascript
vue 2.0组件与v-model详解
Mar 27 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 Javascript
Element InputNumber计数器的使用方法
Jul 27 Javascript
JS实现购物车基本功能
Nov 08 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 curl 获取https请求的2种方法
2015/04/27 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python中安装easy_install的方法
2018/11/18 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
strstr()的简单实现
2013/09/26 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
警校毕业生自我评价
2014/04/06 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang