在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吸顶效果的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# react.js
# tab吸顶
# 微信小程序实现吸顶特效
# 微信小程序实现吸顶效果
# js实现多个标题吸顶效果
# JS实现网站吸顶条
# js实现移动端吸顶效果
# JS实现吸顶特效
# 原生js实现吸顶效果
# js实现导航吸顶效果
# 微信小程序wxs实现吸顶效果
# 小程序自定义模板实现吸顶功能
# 给大家
# 滚动条
# 是一个
# 我是
# 我在
# 就在
# 我一
# 找不到
# 中有
# 当我
# 我认为
# 希望能
# 这篇
# 浅谈
# 它还
# 方法来
# 回调
# 小编
# 值为
# 大家多多
相关文章:
如何获取开源自助建站系统免费下载链接?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
Python多线程使用规范_线程安全解析【教程】
海南网站制作公司有哪些,海口网是哪家的?
ppt制作免费网站有哪些,ppt模板免费下载网站?
详解jQuery停止动画——stop()方法的使用
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
网站app免费制作软件,能免费看各大网站视频的手机app?
微信h5制作网站有哪些,免费微信H5页面制作工具?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
制作电商网页,电商供应链怎么做?
如何在自有机房高效搭建专业网站?
济南专业网站制作公司,济南信息工程学校怎么样?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
建站主机与虚拟主机有何区别?如何选择最优方案?
网站制作企业,网站的banner和导航栏是指什么?
如何选择美橙互联多站合一建站方案?
如何用y主机助手快速搭建网站?
建站之星展会模版如何一键下载生成?
微信小程序 input输入框控件详解及实例(多种示例)
昆明网站制作哪家好,昆明公租房申请网上登录入口?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
表情包在线制作网站免费,表情包怎么弄?
如何挑选最适合建站的高性能VPS主机?
清除minerd进程的简单方法
完全自定义免费建站平台:主题模板在线生成一站式服务
制作旅游网站html,怎样注册旅游网站?
建站之星代理平台如何选择最佳方案?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
建站之星如何配置系统实现高效建站?
青岛网站建设如何选择本地服务器?
如何快速生成凡客建站的专业级图册?
建站之星如何修改网站生成路径?
个人摄影网站制作流程,摄影爱好者都去什么网站?
高端云建站费用究竟需要多少预算?
如何制作一个表白网站视频,关于勇敢表白的小标题?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
建站为何优先选择香港服务器?
如何有效防御Web建站篡改攻击?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何在搬瓦工VPS快速搭建网站?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
高防服务器如何保障网站安全无虞?
*请认真填写需求信息,我们会在24小时内与您取得联系。