简体   繁体   English

ReactJs 如何在点击或提交时滚动到 div 的底部

[英]ReactJs how to scroll to bottom of div on click or submit

I want to scroll to the bottom of the div whenever a new message is sent in the Message.每当在消息中发送新消息时,我都想滚动到 div 的底部。 I can do this with jQuery but wondering what the best approach in React is.我可以用 jQuery 做到这一点,但想知道 React 中最好的方法是什么。

This is the Messages.js component I am in. Thank you in advance!这是我所在的 Messages.js 组件。提前谢谢你!

const Messages = (props) => {

    const [inputMessage, setInputMessage] = useState('');

    const handleChange = (event) => {
    setInputMessage(event.target.value);
  }

  const handleSubmit = (event, message) => {
    event.preventDefault();
    props.setRoomMessages([...props.roomMessages, {id: Date.now(), name: props.username, message: inputMessage}]);
    setInputMessage('');
  }
  
    const messages = props.roomMessages.map((message, index) => {
        return (
            <Message 
                key={index}
                name={message?.name}
                message={message?.message}
            />
        )
    })

    return (
        <>
            <div className="Messages">
                {messages}
            </div>
        
            <form className="chat-input form-inline" onSubmit={handleSubmit}>
        <div className="form-group">
                <input 
                    className="form-control"
                    type="text" 
                    value={inputMessage}
                    placeholder="Type a message..."
                    onChange={handleChange}
                />‍
          <button className="btn btn-link">Send</button>
        </div>
      </form>
        
    </>
    )
}

export default Messages;

Try this, one way to do it is to use ref试试这个,一种方法是使用ref

import { useState, useRef } from 'react';

const Messages = props => {
    const [inputMessage, setInputMessage] = useState('');
    const myMessage = useRef(null);

    const handleChange = event => {
        setInputMessage(event.target.value);
    };

    const handleSubmit = (event, message) => {
        event.preventDefault();

        props.setRoomMessages([...props.roomMessages, { id: Date.now(), name: props.username, message: inputMessage }]);
        setInputMessage('');

        // HERE IS THE NEW CODE
        if (myMessage && myMessage.current) {
            myMessage.current.scrollTop = myMessage.current.scrollHeight;
        }
    };

    const messages = props.roomMessages.map((message, index) => {
        return <Message key={index} name={message?.name} message={message?.message} />;
    });

    return (
        <>
            <div className="Messages" ref={myMessage}>
                {messages}
            </div>

            <form className="chat-input form-inline" onSubmit={handleSubmit}>
                <div className="form-group">
                    <input
                        className="form-control"
                        type="text"
                        value={inputMessage}
                        placeholder="Type a message..."
                        onChange={handleChange}
                    />
                    ‍<button className="btn btn-link">Send</button>
                </div>
            </form>
        </>
    );
};

export default Messages;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM