首頁  >  文章  >  web前端  >  實作tab吸頂使用react.js中的問題

實作tab吸頂使用react.js中的問題

一个新手
一个新手原創
2017-09-06 11:56:161708瀏覽

在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(       <p ref="tab" className={cs({&#39;fixed&#39;:this.state.navTop})}></p>    )
  }  
}

然後我發現這樣寫有問題,當我滾動條滾動距離達到條件時,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
       })
    }
  }

這樣修改之後吸頂效果就正常了。

以上是實作tab吸頂使用react.js中的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn