Ваша проблема в том, что ваш рендер имеет два разных пути, но только один из них устанавливает ссылку на элемент:
if(messages.length === index+1){
return <div ref={messagesEnd}>messagesComp(item)</div>
} else {
messagesComp(item)
}
Существует даже третий путь, где сообщения пусты, и вы также не получите набор ссылок.
Если ссылка не вызывается, когда вызывается useEffect
(что произойдет независимо от того, каким образом вы ее отобразили), ссылка не будет храниться в messagesEnd.current
.
Чтобы справиться с этим, вам нужно либо всегда иметь ссылку на элемент в вашем рендере, который, по-видимому, не является желаемым эффектом, либо проверить правильность перед использованием ref:
const scrollToBottom = () => {
if (messagesEnd && messagesEnd.current) {
messagesEnd.current.scrollIntoView({ behavior: "smooth" });
}
};