Реагировать показать последний элемент

У меня есть проблема, и я не нашел способа ее решения. Я делаю приложение для чата с домашними животными и, конечно же, хочу показать последнее сообщение, но поскольку последнее сообщение появляется в конце, поэтому мне нужно прокрутить, но это выглядит не очень хорошо, когда вы открываете чат и видите ручную прокрутку от первого к последнему сообщению, есть идеи? С точки зрения HTML, у нас есть блок, который перекрывается, и мы хотим показать нижнюю часть контента. Загрузка не помогает, мы все равно видим прокрутку.


'use client';

import '@styles/chat-messages.scss';
import ChatMessage from '@components/chat-message';
import Spinner from '@components/spinner';
import { LoadingContext } from '@components/providers/LoadingProvider';

import { useRef, useLayoutEffect, useState, useContext } from 'react';

export default function ChatMessages() {
    const [loading, setLoadingMessages] = useState(true);
    // const {setLoading} = useContext(LoadingContext);
    let messages = Array.from({ length: 10 }).reverse();

    const messagesEndRef = useRef<HTMLDivElement>(null);

    const scrollToBottom = () => {
        messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
        
    };

    useLayoutEffect(() => {
        scrollToBottom();
        setLoadingMessages(false);
    }, [messages]);

    return (
        <div className='chat-messages'>
            {    
                !loading &&
                (                
                    messages.map((_, index) => (
                        <ChatMessage key = {index} i = {index} />
                ))
                )
            }
            {
                loading && (
                    <Spinner />
                )
            }
            <div ref = {messagesEndRef} className='chat-messages__point'></div>
        </div>
    );
}

он начинается сверху, а затем прокручивается, я вижу такое поведение но я хочу, чтобы это было так при открытии страницы

Если вы хотите, вы можете авторизоваться с помощью Google (https://chat-room-chi-seven.vercel.app/), он использует простую аутентификацию Я пытался использовать состояние загрузки, но оно не работает. Возможно, есть перехватчик реакции, который запускается перед отображением контента.

Можете ли вы поделиться снимком экрана текущего поведения по сравнению с тем, что вам хотелось бы?

Ethan 13.06.2024 05:14

@etan Я только что обновил, проверьте, пожалуйста, спасибо)

Eugene 13.06.2024 06:23
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
2
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вероятно, это связано с тем, что перехват useLayoutEffect запускается до того, как сообщения полностью визуализируются, что приводит к преждевременному выполнению функции ScrollToBottom. Попробуй это

useEffect(() => {
    setLoadingMessages(false);
}, []);

useEffect(() => {
    if (!loading) {
        scrollToBottom();
    }
}, [loading, messages]);

все еще вижу прокрутку

Eugene 13.06.2024 13:17
Ответ принят как подходящий

Измените поведение на авто:

messagesEndRef.current?.scrollIntoView({ behavior: 'auto' }); 

Другие вопросы по теме