浅谈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高级程序设计
Dec 29 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
Jul 03 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
jQuery内置的AJAX功能和JSON的使用实例
Jul 27 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
js实现简单折叠、展开菜单的方法
Aug 28 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
js放大镜放大购物图片效果
Jan 18 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
node.js中事件触发器events的使用方法实例分析
Nov 23 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 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/05/03 PHP
浅谈php扩展imagick
2014/06/02 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
腾讯广告词
2014/03/19 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
世界红十字日活动总结
2015/02/10 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
费用申请报告范文
2015/05/15 职场文书
小学生手册家长意见
2015/06/03 职场文书