При столкновении с проблемой, которую трудно решить, корректировка вашего мышления и изменение мышления могут привести к неожиданным результатам.
предисловие
Сценарий спроса следующий: реализована отправка сообщений, если в контейнере слишком много сообщений, появится полоса прокрутки, самое последнее сообщение находится внизу и не может вовремя появиться в видимой области, позиция позиционируется на самое дно. Посмотрим на конечный эффект
Реализовать идеи
- После рендеринга данных получите фактическую высоту контейнера сообщения через объект refs.
- Установите полосу прокрутки в самый низ
Процесс реализации
sendMessage: function (event) {
// 数据渲染
this.senderMessageList.push(thisSenderMessageObj);
// 改变滚动条位置
this.$nextTick(function(){
this.$refs.messagesContainer.scrollTop = this.$refs.messagesContainer.scrollHeight;
console.log("当前滚动条位置:"+this.$refs.messagesContainer.scrollTop);
console.log("当前可滚动区域容器的高度:"+this.$refs.messagesContainer.scrollHeight);
});
}
Побить пит-рекорд
-
Напрямую установить положение полосы прокрутки
После завершения рендеринга данных непосредственно получается фактическая высота элемента, и задается положение полосы прокрутки.Вроде бы, в рассуждениях нет ничего плохого.В итоге высота полосы прокрутки не представлено, как ожидалось. Причина проблемы: после завершения рендеринга данных Vue не рендерил элемент DOM в это время, а заданная высота полосы прокрутки по-прежнему остается предыдущей высотой контейнера.
sendMessage: function (event) { // 数据渲染 this.senderMessageList.push(thisSenderMessageObj); // 改变滚动条位置 this.$refs.messagesContainer.scrollTop = this.$refs.messagesContainer.scrollHeight; console.log("当前滚动条位置:"+this.$refs.messagesContainer.scrollTop); console.log("当前可滚动区域容器的高度:"+this.$refs.messagesContainer.scrollHeight); }
- использоватьsetTimeout(), измените манипуляцию DOM на асинхронную (мое решение).
this.messagesContainerTimer = setTimeout(()=>{
this.$refs.messagesContainer.scrollTop = this.$refs.messagesContainer.scrollHeight;
console.log("当前滚动条位置:"+this.$refs.messagesContainer.scrollTop);
console.log("当前可滚动区域容器的高度:"+this.$refs.messagesContainer.scrollHeight);
// 清理定时器
clearTimeout(this.messagesContainerTimer);
},0);
-
Правильная реализация: используйтеnextTickвыполнить
Благодаря ошибкам, на которые указали друзья в комментариях, Vue официально предоставляет готовые решения. Роль nextTick: когда данные обновляются и отображаются в dom, функция выполняется автоматически.
this.$nextTick(function(){ this.$refs.messagesContainer.scrollTop = this.$refs.messagesContainer.scrollHeight; console.log("当前滚动条位置:"+this.$refs.messagesContainer.scrollTop); console.log("当前可滚动区域容器的高度:"+this.$refs.messagesContainer.scrollHeight); });
напиши в конце
- Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк и подписывайтесь 😊
- Эта статья была впервые опубликована в Наггетс, если вам нужно перепечатать, пожалуйста, оставьте сообщение в области комментариев 💌