我用react做了一個scroll to top 的button. 在查詢onScroll資料的時候看到了這篇文章.從例子來看防抖動就是集齊所需再發(fā)送請求,節(jié)流就是定時刷新,不知道這樣理解對不?恰好此文章第一個例子和我自定義的scroll to top button很相似。我寫的demo里觸發(fā)了很多次state,我覺的這樣是不對的,但是也沒有好的解決方法。
我寫的這個demo, 有沒有缺陷,比如多次修改state可能會導致的隱形問題,生命周期。。
防抖動和節(jié)流的好處從那篇文章里我知曉一二,但仍舊迷糊什么時候需要防抖動或者節(jié)流。
class ScrollToTopButton extends Component{
constructor(...args) {
super(...args);
var that = this;
this.state = {
interval: 0
};
this.scrollStep = () => {
if (window.pageYOffset === 0) {
clearInterval(this.state.interval);
}
window.scroll(0, window.pageYOffset - 50);
console.log(this.state.interval);
}
this.handleScroll = (interval) => {
let intervalTime = setInterval(this.scrollStep.bind(this), interval);
this.setState({interval: intervalTime});
}
}
componentWillMount() {
}
componentDidMount(){
}
render(){
return(
<div className="scrollComponent" onClick={()=>{this.handleScroll(20)}}>
<span className='fa-stack'>
<Fontawesome name="chevron-circle-up" stack='1x'></Fontawesome>
</span>
</div>
)
}
}
export default ScrollToTopButton;
第一次 scroll to top 打印出來的this.state.interval
多次點擊 scroll to top 打印出來的this.state.interval
this.scrollStep = () => {
if (window.pageYOffset === 0) {
clearInterval(this.state.interval);
// new add
this.setState({interval:0});
}
window.scroll(0, window.pageYOffset - 50);
console.log(this.state.interval);
}
但終覺這個不是最終解決辦法。可能自己寫的demo有缺陷。 能力有限還希望前輩們指教一下。
你的例子根本不需要防抖(debounce)和節(jié)流(throttle)。
當你的某個操作和頻繁,但是你不希望他如此頻繁時,才使用 debounce。
你并沒有監(jiān)聽頻繁觸發(fā)的 scroll 事件,而是監(jiān)聽了只觸發(fā)一次的 click 事件,在 click 事件里面調(diào)用了 window.scroll 方法。
你這行代碼有問題:
let intervalTime = setInterval(this.scrollStep.bind(this), interval);
interval 是函數(shù)執(zhí)行的頻率,這個的值不應該是 0 啊,設置為 1000/60 吧。
重復渲染是因為 this.state.interval 在不停的改變,其實這個值根本不是組件的狀態(tài),設置為一個類屬性更合適:this.interval = 1000/60。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。