react.js中实现tab吸顶效果问题
在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本身是一个异步的方法,它还有一个参数是回调函数。
但我无法将这个错误点具体讲清楚,不知道碰巧看到这篇blog的各位能否指点一下(感谢)。
react.js中实现tab吸顶效果问题的更多相关文章
- 自定义tab吸顶效果一(原理)
PS:问题:什么是吸顶,吸顶有什么作用,吸顶怎么使用? 在很多app商城中,介绍软件的时候就会使用吸顶效果, 吸顶有很多作用,一个最简单粗暴的作用就是,让用户知道此刻在浏览哪个模块,并可以选择另外的模 ...
- [RN] React Native 头部 滑动吸顶效果的实现
React Native 头部 滑动吸顶效果的实现 效果如下图所示: 实现方法: 一.吸顶组件封装 StickyHeader .js import * as React from 'react'; i ...
- js 实现吸顶效果 || 小程序的吸顶效果
小程序吸顶效果 <!--index.wxml--> <view class="container"> <view class='outside-img ...
- better-scroll之吸顶效果巨坑挣扎中
今天和大家分享下better-scroll这款移动端用来解决各种滚动需求的插件(目前已经支持PC) 关于其中的API大家可以去官网看下 这里就给大家介绍几种常用的以及需要注意的点是什么 首先说一下b ...
- js之吸顶效果
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Html吸顶效果
Html吸顶效果 一.HTML HTML中需要给div一个id <!DOCTYPE html> <html lang="en"> <head> ...
- tabControl组件的吸顶效果
最开始,还没有使用better-scroll插件的时候,直接在class中设定了一定的position为sticky,设置一定的top达成了效果.但是,使用better-scroll组件后,这些属性就 ...
- Vue 事件监听实现导航栏吸顶效果(页面滚动后定位)
Vue 事件监听实现导航栏吸顶效果(页面滚动后定位) Howie126313 关注 2017.11.19 15:05* 字数 100 阅读 3154评论 0喜欢 0 所说的吸顶效果就是在页面没有滑动之 ...
- 深入理解 React JS 中的 setState
此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...
随机推荐
- 数组和矩阵(3)——Next Greater Element I
https://leetcode.com/problems/next-greater-element-i/#/description You are given two arrays (without ...
- Flink -- Java Generics Programming
Flink uses a lot of generics programming, which is an executor Framework with cluster of executor ha ...
- 【阿里云产品公测】小白对OTS两点小建议
作者:阿里云用户荷包蛋 我是大一的新生,作为一个爱技术爱学习爱折腾的熊孩子,我在暑假申请了ECS,学到了很多东西.现在阿里巴巴又开放了很多免费测试,我抱着学习和围观的心态申请了测试,其中有OTS这个高 ...
- cordova 开发 android app 简要流程
1. 安装cordova:npm install -g cordova --registry=https://registry.npm.taobao.org 2. 创建cordova工程:进入工作目录 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:紧凑型切片制作(Server缓存切片)
1.前言 在ArcGIS 10中出现了一种新的切片缓存文件格式:紧凑型存储(Compact).与之前的松散型存储(Exploded)相比,它有迁移方便.创建更快.减少存储空间等诸多优点,已经成为了现在 ...
- 三大框架之list
前言: 在我们平常开发中难免会用到List集合来存储数据,一般都会选择ArrayList和LinkedList,以前只是大致知道ArrayList查询效率高LinkedList插入删除效率高,今天来实 ...
- C#操作CAD-读取和修改数据
我们操作cad最主要的目的就是读取和修改或者删除数据,因为内容较多,在此我们先讲一下基础,后续慢慢讲解. 1.cad数据读取和修改前都要进行锁定操作,以避免一个文档被多个用户修改而发生冲突. Data ...
- Django问卷调查项目思路流程
Django问卷调查项目思路流程: 1 后端思路 : 需求分析 ---- 找出各实体对应关系 ---- 设计model架构 ---- 统一资源封装 --- 提供资源API入口 ---- 设计项目实体功 ...
- jquery-tags-input 使用经历
源代码里有这么一段,是在tagsInput这里,第一次初始化的时候是正常的,但当第二次初始化的时候就会出现问题,id的值会组合为 id+new Date().getTime() 暂时不清楚作用是什么 ...
- Snippets代码块分享网站
复习时,看老师之前贴在网上的一些代码,顺便搜集了一些代码块Snippets分享网站 http://paste.ubuntu.com/ 简约简单,一如既往Linux风,我之前用的也是这款,但已转gite ...