浅谈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 相关文章推荐
根据出生日期自动取得星座的js代码
Jul 20 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
Nov 21 Javascript
js 将json字符串转换为json对象的方法解析
Nov 13 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
Aug 14 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 Javascript
vue 返回上一页,页面样式错乱的解决
Nov 14 Javascript
JS实现拼图游戏
Jan 29 Javascript
JS寄快递地址智能解析的实现代码
Jul 16 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 Javascript
angular *Ngif else用法详解
Dec 15 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
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
CI框架附属类用法分析
2018/12/26 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
深入理解Python3 内置函数大全
2017/11/23 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
如何在python中写hive脚本
2019/11/08 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
三年级数学教学反思
2014/01/31 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
工程安全生产协议书
2014/11/21 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS