淺談react.js中實(shí)現(xiàn)tab吸頂效果的問題
在react項(xiàng)目開發(fā)中有一個(gè)需求是,頁面滾動(dòng)到tab所在位置時(shí),tab要固定在頂部。
實(shí)現(xiàn)的思路其實(shí)很簡單,就是判斷當(dāng)滾動(dòng)距離scrollTop大于tab距離頁面頂部距離offsetTop時(shí),將tab的position變?yōu)閒ixed。
在react中,我在state中設(shè)置一個(gè)navTop屬性,切換這個(gè)屬性的值為true或者false,然后tab標(biāo)簽使用classnames()這個(gè)方法來利用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> ) } }
然后我發(fā)現(xiàn)這樣寫有問題,當(dāng)我滾動(dòng)條滾動(dòng)距離達(dá)到條件時(shí),tab是出現(xiàn)了吸頂?shù)男Ч?,但一瞬間又恢復(fù)了,滾動(dòng)條也回彈了,一直無法繼續(xù)下拉。
我一開始以為判斷邏輯有問題,但一直找不到解決的辦法,后來我懷疑是state值改變的時(shí)間差導(dǎo)致的,好像陷入了一個(gè)死循環(huán),然后我就在判斷滾動(dòng)距離之前加了一個(gè)判斷navTop的狀態(tài)。
修改的主要代碼如下:
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 }) } }
這樣修改之后吸頂效果就正常了。
我認(rèn)為就是setState方法導(dǎo)致的問題,setState本身是一個(gè)異步的方法,它還有一個(gè)參數(shù)是回調(diào)函數(shù)。
以上這篇淺談react.js中實(shí)現(xiàn)tab吸頂效果的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
React通過hook實(shí)現(xiàn)封裝表格常用功能
這篇文章主要為大家詳細(xì)介紹了React通過hook封裝表格常用功能的使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2023-12-12react.js組件實(shí)現(xiàn)拖拽復(fù)制和可排序的示例代碼
這篇文章主要介紹了react.js組件實(shí)現(xiàn)拖拽復(fù)制和可排序的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08react組件實(shí)例屬性props實(shí)例詳解
這篇文章主要介紹了react組件實(shí)例屬性props,本文結(jié)合實(shí)例代碼給大家簡單介紹了props使用方法,代碼簡單易懂,需要的朋友可以參考下2023-01-01插件化機(jī)制優(yōu)雅封裝你的hook請求使用方式
這篇文章主要為大家介紹了插件化機(jī)制優(yōu)雅封裝你的hook請求使用方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07