У меня есть проблема, и я не нашел способа ее решения. Я делаю приложение для чата с домашними животными и, конечно же, хочу показать последнее сообщение, но поскольку последнее сообщение появляется в конце, поэтому мне нужно прокрутить, но это выглядит не очень хорошо, когда вы открываете чат и видите ручную прокрутку от первого к последнему сообщению, есть идеи? С точки зрения 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/), он использует простую аутентификацию Я пытался использовать состояние загрузки, но оно не работает. Возможно, есть перехватчик реакции, который запускается перед отображением контента.
@etan Я только что обновил, проверьте, пожалуйста, спасибо)






Вероятно, это связано с тем, что перехват useLayoutEffect запускается до того, как сообщения полностью визуализируются, что приводит к преждевременному выполнению функции ScrollToBottom. Попробуй это
useEffect(() => {
setLoadingMessages(false);
}, []);
useEffect(() => {
if (!loading) {
scrollToBottom();
}
}, [loading, messages]);
все еще вижу прокрутку
Измените поведение на авто:
messagesEndRef.current?.scrollIntoView({ behavior: 'auto' });
Можете ли вы поделиться снимком экрана текущего поведения по сравнению с тем, что вам хотелось бы?