浅谈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 相关文章推荐
DOM Scripting中的图片切换[兼容Firefox]
Jun 12 Javascript
Javscript删除数组中指定元素并返回新数组
Mar 06 Javascript
详解iframe与frame的区别
Jan 13 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
详解angularjs利用ui-route异步加载组件
May 21 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
May 15 Javascript
JavaScript中常用的简洁高级技巧总结
Mar 10 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
vue实现前端分页完整代码
Jun 17 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 Javascript
微信小程序实现列表左右滑动
Nov 19 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设计模式 Bridge (桥接模式)
2011/06/26 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php去掉文件前几行的方法
2015/07/29 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
HTML颜色选择器实现代码
2010/11/23 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
js的三种继承方式详解
2017/01/21 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
Python函数调用追踪实现代码
2020/11/27 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
食品安全汇报材料
2014/08/18 职场文书
基层党员对照检查材料
2014/08/25 职场文书
三好学生个人总结
2015/02/15 职场文书
js判断两个数组相等的5种方法
2022/05/06 Javascript