У меня проблема с тем, что в моем приложении пользователь может загружать разные потоки сообщений, и если этот поток увеличился по сравнению с областью просмотра (ie, для просмотра нижних сообщений требуется полоса прокрутки), тогда я хочу для автоматической прокрутки к последнему сообщению.
Используя useRef
, я отмечаю место сразу после своей карты следующим образом:
currentList.map(elem => ( <div>{elem}</div>) )
<div ref={messagesRef} /> // <------Here
Моя проблема заключается в том, что с помощью поля useRef.current
Мой выбор веток сообщений всегда на один шаг позади, потому что ссылка обновляется с null после mount и, следовательно, отстает от того, на чем я активно выбираюсь. Кроме того, из-за этого мне пришлось принудительно выполнить проверку, чтобы убедиться, что я не пытался что-либо сделать с этим нулевым ссылочным номером, например:
useEffect(() => {
if (messagesRef.current) { // < -- make sure we're not null
scrollToBottom();
}
}, [messagesRef]);
Метод scrollToBottom таков:
const scrollToBottom = () => {
messagesRef.current.scrollIntoView({
behavior: "smooth",
block: "nearest" // <-- only scroll this div, not the parent as well
});
};
Как я уже говорил ранее, моя цель - позволить пользователю выбирать разные потоки, и для любого потока, который нужно прокрутить вниз, я сделаю это для них. Однако, поскольку они выбирают поток, при выходе из статуса ref messagesRef.current
он рендерит 1 поток позади того, что выбрано. Я проверил это, выдав результат messagesRef.current.parentNode.offsetHeight
.
Каждый поток, который не нужно было прокручивать, имел offsetHeight меньше высоты окна моего сообщения (500 в моем случае). Хотя тот, который нужно прокручивать, был больше, чем высота моего окна.
Очень расстраивает попытка использовать этот useRef, когда текущее значение не обновляется с моими выборками.