滚动到底部; scrollTop = scrollHeight 运行太早?

Posted

技术标签:

【中文标题】滚动到底部; scrollTop = scrollHeight 运行太早?【英文标题】:Scrolling to bottom; scrollTop = scrollHeight running too early? 【发布时间】:2019-10-07 18:29:25 【问题描述】:

实时示例:https://angular-txvcna.stackblitz.io/ (Code)。

我有一个“聊天”组件,我希望每次添加消息时让 div 滚动到底部。

我通过将项目推送到数组 (this.messages.push(message)) 来添加新消息,然后尝试滚动到右下角。滚动操作this.chatboxBody.nativeElement.scrollTop = this.chatboxBody.nativeElement.scrollHeight; 似乎在 angular 的生命周期钩子之前,因为scrollHeight 在执行时具有较旧的高度值。

目前我使用setTimeout 来修复它,但它真的感觉像是一条捷径。我该如何解决? (理想情况下 - 以某种方式订阅更新子组件的钩子)

【问题讨论】:

【参考方案1】:

我有几个想法:

    您可以将消息输入更改为设置器,以便在输入消息时设置消息的私有版本并处理组件内的滚动。 (在我个人看来,这是最好的解决方案,因为在使用该组件的每个地方都不必重复如何滚动到底部的逻辑)
    private _message: VivrMessage;
        @Input()
            set message(val: VivrMessage)
        if (val)
            this._message = val;
            this.handleScrolling();
        
    
    您可以执行与上述类似的操作,但不是在消息组件中处理滚动,而是有一个输出,然后让父组件完成工作。

【讨论】:

方法1有点帮助,但我必须使用scrollIntoView(),这和滚动到底部不一样。另外,滚动绑定到message 的初始化(如果我想改变它的内容呢?)。方法 2 真的很脏——我已经在使用 Input 设置消息,并在用户单击选项时使用 Output 进行通知——定义另一个 Output 似乎是一个真正的解决方法;-)。谢谢你的回答。 如果你改变了内容,同样的 setter 会被触发。每次父级更改其设置为消息输入的值时,设置器都会执行。

以上是关于滚动到底部; scrollTop = scrollHeight 运行太早?的主要内容,如果未能解决你的问题,请参考以下文章

手机页面滚动到底部刷新数据

jquery判断滚动条到底部

js滚动到底部事件

页面回滚效果(滚动条到底部刷新页面)

微信小程序 scroll-view内容怎么默认滚到底部

滚动到底部时触发