У меня есть компонент React, использующий ловушку для сохранения позиции прокрутки компонента, когда компонент размонтируется. Это прекрасно работает, но не удается при переходе от одного набора данных к другому набору данных без размонтирования компонента.
Например, представьте интерфейс Slack, где есть боковая панель каналов сообщений слева и справа список сообщений (messageList) Если бы вам пришлось перемещаться между двумя каналами, компонент messageList обновлялся бы новым набором данных для messageList, но компонент никогда не был размонтирован, поэтому положение прокрутки никогда не сохранялось.
Я нашел решение, которое работает, но также выдает предупреждение.
Мой текущий хук useEffect для компонента (урезанный) и код, который в настоящее время сохраняет позицию прокрутки при каждом изменении идентификатора messageList:
// Component...
const usePrevious = (value) => {
const ref = useRef();
useEffect(() => {
ref.current = value;
});
return ref.current;
};
// Save scroll position when Component unmounts
useEffect(() => {
return () => {
setScrollOffset(parent._id, scrollPos.current);
};
}, []);
// Save scroll position when Parent ID changes
const oldParent = usePrevious(parent);
if (oldParent && parent._id !== oldParent._id) {
setScrollOffset(oldParent._id, list ? list.scrollTop : 0);
}
// ...Component
Ошибка это броски: Warning: Cannot update a component from inside the function body of a different component.
И вызывающая его строка - это вызов setScrollOffset внутри последнего блока if. Я предполагаю, что, хотя это работает, я не должен справляться с подобными вещами. Как лучше обрабатывать сохранение позиции прокрутки при изменении значения c для компонента?