【问题标题】:React infinite scroll- double scrollbars showing- I only want the window scroll bar反应无限滚动-双滚动条显示-我只想要窗口滚动条
【发布时间】:2018-10-30 05:18:42
【问题描述】:

我正在尝试为 React.js 实现无限滚动。一切正常,除了我希望能够使用窗口滚动条来激活无限滚动。目前的代码,有 2 个滚动条(我只想要一个)。

代码来自stackoverflow 在这里回答,我阅读了他的完整答案,我尝试将高度设置为100%,但它使无限滚动不起作用。 :Stackoverflow- answered by Aniket Jha, ( the longest answer with 4 upvotes)

  • 当我以这种方式渲染时会发生双滚动:

    <div>
    <First />
     <div ref="iScroll" style={{ height: "100vh", overflow: "auto"}}>
        <ul>
          {this.displayItems()}
        </ul>
        {this.state.loadingState ? <p className="loading"> loading More 
         Items..</p> : ""}
      </div>
    </div>
    

I have a Link to Codepen if this helps

class Layout extends React.Component {
  constructor(props) {
   super(props);
   this.state = {
      items: 30,
      loadingState: false
    };
  }

  componentDidMount() {
    this.refs.iScroll.addEventListener("scroll", () => {
      if (this.refs.iScroll.scrollTop + this.refs.iScroll.clientHeight >= this.refs.iScroll.scrollHeight - 20){
        this.loadMoreItems();
      }
    });
  }

  displayItems() {
    var items = [];
    for (var i = 0; i < this.state.items; i++) {
      items.push(<li key={i}>Item {i}</li>);
    }
    return items;
  }

  loadMoreItems() {
     if(this.state.loadingState){
         return;
     }
    this.setState({ loadingState: true });
    setTimeout(() => {
      this.setState({ items: this.state.items + 10, loadingState: false });
    }, 1000);
  }

  render() {
    return (<div>

        <First />
          <div ref="iScroll" style={{ height: "100vh", overflow: "auto"}}>
            <ul>
              {this.displayItems()}
            </ul>
            {this.state.loadingState ? <p className="loading"> loading More Items..</p> : ""}
          </div>
        </div>
    );
  }
}

class First extends React.Component {
  constructor(props) {
   super(props);
   this.state = {

    };
  }

  render() {
    return (
      <h1>Testing</h1>

    )
  }
}

ReactDOM.render(<Layout />, document.getElementById('example'));

【问题讨论】:

  • 我不确定你所说的“双滚动条”是什么意思,但我可以看到 div 只有 200px 高。当然,如果您将其设置为 100%,则无限滚动将不起作用,因为它的尺寸太大。我建议尝试height: 100vh。如果我在你的 codepen 上破解它,那效果很好。但是你也应该增加最初的项目数量——至少应该多出 1 个,超过屏幕可以容纳的数量。 25 人为我工作。
  • 我更新了codepen。基本上当我渲染整个项目时,第二个组件是这个列表,它会给我双滚动

标签: javascript reactjs infinite-scroll


【解决方案1】:

如果您不希望出现第二个滚动条,则需要设置标题和同级 div 的样式,以便它们适合可用的视口。

在您的 codepen 中,您的滚动 div 有 height: '100%'。这设置了 div 的样式,因此它不需要滚动,因此无限滚动不起作用。

如果您设置该 div 的样式,使其占用的高度小于可用视口的高度,并渲染足够多的项目来填充它,无限滚动将正常工作。

如果您随后设置标题 div 组合的样式,使其完全适合可用的视口空间,您将不会获得第二个滚动条。

以下是您必须执行此操作的选项。我所做的是将滚动 div 的高度设置为视口高度(100vh)减去100px。这不是精确计算的,但您想要的是从视口的大小中减去标题所需的空间。

这个实现对我来说很好,对你也应该。

class Layout extends React.Component {
  constructor(props) {
   super(props);
   this.state = {
      items: 30,
      loadingState: false
    };
  }

  componentDidMount() {
    this.refs.iScroll.addEventListener("scroll", () => {
      if (this.refs.iScroll.scrollTop + this.refs.iScroll.clientHeight >= this.refs.iScroll.scrollHeight - 20){
        this.loadMoreItems();
      }
    });
  }

  displayItems() {
    var items = [];
    for (var i = 0; i < this.state.items; i++) {
      items.push(<li key={i}>Item {i}</li>);
    }
    return items;
  }

  loadMoreItems() {
	 if(this.state.loadingState){
		 return;
	 }
    this.setState({ loadingState: true });
    setTimeout(() => {
      this.setState({ items: this.state.items + 10, loadingState: false });
    }, 1000);
  }
  
  render() {
    return (<div>
     
        <First />
          <div ref="iScroll" style={{ height: "calc(100vh - 100px)", overflow: "auto"}}>
            <ul>
              {this.displayItems()}
            </ul>
            {this.state.loadingState ? <p className="loading"> loading More Items..</p> : ""}
          </div>
        </div>
    );
  }
}

class First extends React.Component {
  constructor(props) {
   super(props);
   this.state = {
    
    };
  }

  render() {
    return (
      <h1>Testing</h1>

    )
  }
}

ReactDOM.render(<Layout />, document.getElementById('example'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="example"></div>

【讨论】:

  • 是否可以让 组件不固定在顶部。所以当我向下滚动时,我再也看不到它了,当我到达底部时它仍然会填充?
  • 是的,当然。但在这种情况下,您需要将ref="iScroll" 移动到父div 并在那里移动style 属性。如果您有问题,请告诉我,如果您需要,我可以更新答案
  • 在你的帮助下让它工作了,谢谢你教我这个逻辑,它帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多