提问者:小点点

使div自动滚动到底部(反应)


我目前正在做一个学校的聊天应用程序,但我想让它像大多数聊天应用程序一样自动滚动到底部。到目前为止,我已经尝试了所有我能找到的解决方案,但我只得到了反应错误。我是新的反应,所以可能会有一些错误,我没有意识到我正在犯。这是我的东西

class Messages extends React.Component {
    updateScroll() {
    let element = document.querySelector(".messages");
    element.scrollTop = element.scrollHeight;
}
render() {
    const messages = store.getState().messages.map((msg) => {
      this.updateScroll();
      return (
        <Message
          name={msg.displayName}
          message={msg.text}
          time={msg.timestamp}
          pic={msg.pic}
          key={msg.timestamp}
          clas={msg.who}
        />
      );
    });
    return (
      <div className="messages">
        <div className="chat">
        </div>
        <div className="sendMessage">
          <input
            type="text"
            placeholder="Message epic channel"
            className="pendingMessage"
            onKeyPress={this.handleKeyDown}
          />
          <button onClick={this.handleMessageSend}>Send</button>
        </div>
      </div>
    );
  }
}
export default Messages;

如果您还想要完整的代码,下面是我的GitHub链接。https://github.com/dougalcaleb/react-chat-app

谢啦!


共3个答案

匿名用户

我建议你应该用css来做这件事

chatbox内容需要以下标记,其中内容与底部对齐。

.container {
  height: 100px;
  overflow: auto;
  display: flex;
  flex-direction: column-reverse;
}

匿名用户

应该使用参考而不是单据查询

class Messages extends React.Component {
    constructor() {
        super()
        this.messagesRef = React.createRef()
    }

    updateScroll() {
      this.messagesRef.current.scrollTo(0, this.messagesRef.current.scrollHeight)
    }

   render() {
    const messages = store.getState().messages.map((msg) => {
      this.updateScroll();
      return (
        <Message
          name={msg.displayName}
          message={msg.text}
          time={msg.timestamp}
          pic={msg.pic}
          key={msg.timestamp}
          clas={msg.who}
        />
      );
    });

    return (
      <div ref={this.messagesRef} className="messages">
        <div className="chat">
        </div>
        <div className="sendMessage">
          <input
            type="text"
            placeholder="Message epic channel"
            className="pendingMessage"
            onKeyPress={this.handleKeyDown}
          />
          <button onClick={this.handleMessageSend}>Send</button>
        </div>
      </div>
    );
  }
}
export default Messages;

你能用ref+scrollTo试试吗?

匿名用户

在消息下面创建一个虚拟div。

<div ref={messagesEndRef}></div>

    const messagesEndRef = useRef(null)

    const [msglist, setMsglist] = useState([]);

如果msglist是新消息的列表,则使用useEffect来处理更改。

    useEffect(() => {
        messagesEndRef.current.scrollIntoView({ behavior: 'smooth' })
    }, [msglist])