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的各位能否指點一下(感謝)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM