[Vue3] 滚动条自动滚动到底部

需求

在一个区域会依次打印log,随着log的加长,出现滚动条,而滚动条应该始终保持在最下方。
点击回到顶部按钮,可以使滚动条回到最上方

方案

  1. 在滚动区域添加ref
  2. log为一个数组,对其添加watch
  3. 在watch函数中,使用nextTick,通过ref控制该区域滚动高度
  4. 绑定ref,监测其height,使回到顶部按钮出现,并通过ref控制滚动条回到顶部

代码

// template
<div class="bottom-logs" ref="logRef">
	// antd vue中的back-top组件
	<a-back-top :target="() => logRef" :visibilityHeight="10" @click="handleBackToTop" />
    <LogData :logData="log"></LogData>
</div>

// css
// 父级元素 display: flex
.bottom-logs {
  flex: 1;
  overflow: auto;
}
<script setup>
import { ref, watch, nextTick } from 'vue'
const logRef = ref();
// log为响应式数组
watch(log, () => {
  nextTick(() => {
    const content = logRef.value;
    content.scrollTo({ top: content.scrollHeight, behavior: "smooth" });
  });
}, {
  deep: true,
});

const handleBackToTop = () => {
  const content = logRef.value;
  content.scrollTo({ top: 0, behavior: "smooth" });
}
</script>
### Vue中实现滚动条自动滚动底部的方法 在Vue中实现滚动条自动滚动底部的功能,通常需要结合`watch`监听数据变化,并通过`nextTick`确保DOM更新完成后再执行滚动操作。以下是具体实现方法: #### 1. 使用 `ref` 和 `watch` 通过`ref`绑定需要滚动的元素,并使用`watch`监听数据的变化。当数据发生变化时,触发`scrollTo`或直接设置`scrollTop`为`scrollHeight`,以实现滚动条滚动底部的效果。 ```vue <template> <div class="bottom-logs" ref="logRef"> <LogData v-for="(item, index) in log" :key="index" :logData="item" /> </div> </template> <script setup> import { ref, watch, nextTick } from &#39;vue&#39;; const logRef = ref(); const log = ref([]); // 假设log是一个响应式数组 watch(log, () => { nextTick(() => { const content = logRef.value; if (content) { content.scrollTo({ top: content.scrollHeight, behavior: "smooth", }); } }); }, { deep: true }); </script> <style> .bottom-logs { flex: 1; overflow: auto; height: 400px; /* 确保有高度才能生成滚动条 */ } </style> ``` 上述代码中,`watch`监听`log`数组的变化,并在数据更新后通过`nextTick`确保DOM更新完成[^1]。 #### 2. Vue2中的实现方式 在Vue2中,可以通过`this.$refs`获取绑定的DOM元素,并结合`this.$nextTick`实现类似功能。 ```vue <template> <div class="box" ref="box"> <div v-for="(item, index) in log" :key="index">{{ item }}</div> </div> </template> <script> export default { data() { return { log: [], // 假设log是一个数组 }; }, watch: { log() { this.$nextTick(() => { const box = this.$refs.box; if (box) { box.scrollTop = box.scrollHeight; } }); }, }, }; </script> <style> .box { overflow: auto; height: 400px; /* 确保有高度才能生成滚动条 */ } </style> ``` 此处利用了`this.$nextTick`确保DOM更新完成后设置滚动位置[^2]。 #### 3. 使用 `mounted` 和 `updated` 生命周期 在某些场景下,可以结合`mounted`和`updated`生命周期函数来实现滚动条自动滚动底部。 ```vue <template> <div id="gundong" ref="gundong"> <div v-for="(item, index) in dataList" :key="index">{{ item.title }}</div> </div> </template> <script> export default { data() { return { dataList: [], oldbottom: 0, }; }, mounted() { uni.createSelectorQuery() .select("#gundong") .boundingClientRect((res) => { this.oldbottom = res.bottom; // 记录滚动元素的 bottom 值 }) .exec(); }, updated() { uni.createSelectorQuery() .select("#gundong") .boundingClientRect((res) => { if (Number(res.bottom) > Number(this.oldbottom)) { this.scrollTop = res.bottom; } this.oldbottom = res.bottom; }) .exec(); }, }; </script> <style> #gundong { height: 400px; /* 确保有高度才能生成滚动条 */ overflow: auto; } </style> ``` 此方法适用于需要频繁更新滚动位置的场景,例如聊天界面[^4]。 ### 注意事项 - 滚动条的父容器必须设置`overflow: auto`或`overflow: scroll`,并明确指定高度,否则无法生成滚动条。 - 使用`nextTick`或`$nextTick`确保DOM更新完成后再操作滚动条。 - 如果需要平滑滚动,可以使用`scrollTo`方法的`behavior: "smooth"`选项[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值