javascript - 停止监听滚动事件直到数据加载

标签 javascript reactjs react-redux infinite-scroll

我正在开发一个 react 组件,它基本上滚动到底部提要。

我在加载更多数据时遇到问题,并且 Prop 正在更新,滚动事件队列并在加载完成后执行。我尝试在加载数据时禁用和启用滚动,如此处所述

this.keys = {37: 1, 38: 1, 39: 1, 40: 1};
preventDefault(e) {
  e = e || window.event;
  if (e.preventDefault)
    e.preventDefault();
  e.returnValue = false;  
}

preventDefaultForScrollKeys(e) {
  if (this.keys[e.keyCode]) {
    this.preventDefault(e);
    return false;
  }
}

disableScroll() {
  if (window.addEventListener) // older FF
    window.addEventListener('DOMMouseScroll', this.preventDefault, false);
  window.onwheel = this.preventDefault; // modern standard
  window.onmousewheel = document.onmousewheel = this.preventDefault; // older browsers, IE
  window.ontouchmove = this.preventDefault; // mobile
  document.onkeydown = this.preventDefaultForScrollKeys;
}

enableScroll() {
  if (window.removeEventListener)
    window.removeEventListener('DOMMouseScroll', this.preventDefault, false);
  window.onmousewheel = document.onmousewheel = null; 
  window.onwheel = null; 
  window.ontouchmove = null;  
  document.onkeydown = null;  
}

ComponentDidRecieveProps(){
  this.enableScroll();
}

handleScroll(event){
  if((event.target.scrollTop + event.target.clientHeight) >= (event.target.scrollHeight) && event.target.scrollTop > this.lastScrollTop) {
     //when hits bottom
     this.disableScroll();
     this.getMoreData();
   }
   this.lastScrollTop = event.target.scrollTop
}

render(){
  return <div onScroll = {(e) => this.handleScroll(e)}> DATA </div>
}

How to disable scrolling temporarily?

虽然滚动禁用了事件,但是一旦我启用向后滚动,它就会执行排队的事件,因此即使没有用户滚动也可以滚动。

我正在使用 div 的 onScroll 事件,以便在它到达底部时加载更多数据。

最佳答案

这个怎么样。 dataLoaded = true 当获取完成时,并在获取新集合之前将其设置为 false。我没有测试过。

import React, { PropTypes } from 'react';

class ScrollingComponent extends React.Component {

  constructor(props) {
    super(props);
  }

  removeScrollListener() {
    // if running on client side
    document.removeEventListener('scroll', this.handleScroll, false);
  }

  addScrollListener() {
    // if running on client side
    document.addEventListener('scroll', this.handleScroll, false);
  }

  ComponentDidRecieveProps({ dataLoaded }){
    if(dataLoaded){
        this.addScrollListener();
    } else{
        this.removeScrollListener()
    }
  }

  handleScroll() {
    // your logic
  }

  render() {
    const { data, dataLoaded } = this.props;
    const loading = dataLoaded ? null : <p>Loading ...</p>;
    return (
        <div>
          <loading />
          <Table>
            <tbody >
             // loop through your data
            </tbody>
          </Table>
        </div>
    );
  }
};

const { arrayOf, bool, object } = PropTypes;

ScrollingComponent.propTypes = {
  data: arrayOf(object),
  dataLoaded: bool
};

关于javascript - 停止监听滚动事件直到数据加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054825/

相关文章:

javascript - 如何在主干模型中强制执行属性类型?

javascript - 需要有关此 JavaScript 行的一些帮助和解释

javascript - 模拟 ('submit' 后 Jest/ enzyme 测试失败 ) "this.props.searchUser is not a function"

javascript - 如何使用react-router-dom直接链接来渲染填充了 Prop 的通用帖子组件?

javascript - 如何在 CodeIgniter 中创建自动完成搜索字段?

javascript - 如何在 JavaScript/HTML 中检索 $_SESSION 值

javascript - 如何获取当前光标在draft.js中的位置?

javascript - Next.js React 组件 getInitialProps 不绑定(bind) Prop

reactjs - 使用带有 loading 和 freeSolo Prop 的 react material-ui 自动完成

reactjs - 是否可以将非组件类连接到 redux 存储?