为什么“点击使滚动条回到顶部”功能要用到nextTick?

功能示例代码来自hello uni-app示例项目的scroll-view部分

<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" @scroll="scroll" v-if="this.flag">
......
return {scrollTop: 0}
......
scroll: function(e) {
    this.old.scrollTop = e.detail.scrollTop
},
goTop: function(e) {
	this.scrollTop = this.old.scrollTop
	this.$nextTick(function() {
		this.scrollTop = 0
	}
}

为什么要写this.scrollTop = this.old.scrollTop?
以上代码中,scrollTop 默认值为0,且不设置滚动事件的话也不会同步更新,会一直为0。
因此this.scrollTop = this.old.scrollTop目的是随滚动修改scrollTop ,使得$nextTick中this.scrollTop = 0这一句导致this.scrollTop的变化,从而使得标签中绑定的:scroll-top检测到变化,从而重新渲染dom。
为什么this.scrollTop = 0要放到nextTick里面?
DOM 的更新并不是同步的,不是代码中一修改马上就更新DOM。相反,Vue 将缓冲它们直到更新周期的 “时机” 以确保无论进行了多少次状态更改,每个组件都只更新一次。
而nextTick会将内容放到“下个时机”,即本次 DOM 更新循环之后执行 。
而如果this.scrollTop = 0放在外面this.scrollTop = this.old.scrollTop的下一行,则本次只会检测到两条代码的最终结果“scrollTop状态还是0,不需要处理”,什么也不发生。
因此需要把this.scrollTop = 0放在nextTick里面,在this.scrollTop 确认已改变为this.old.scrollTop后再置为0以引起下一次dom渲染。
——————
实际上不一定需要this.old.scrollTop,把this.scrollTop = this.old.scrollTop换成this.scrollTop = 1,this.scrollTop = 150什么的也是一样的效果。我认为这样写了只是更有逻辑性。

而如果scrollTop的初始值不为0,则不需要nextTick,也不需要old.scrollTop,直接goTop: function(e) {this.scrollTop =0}就完事了,但初始值不为0会导致滚动条一开始不在最上方,不符合正常使用习惯,不可取。

总结:“点击使滚动条回到顶部”功能要用到nextTick是因为scrollTop的初始值为0。要改变scrollTop的值后渲染一次,再置为0才能生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值