javascript - vue.js每次切换路由时无法正确重置滚动位置?
大家讲道理
大家讲道理 2017-04-11 12:04:48
[JavaScript讨论组]
//a.vue
export default {
    events:{
        SetScroll: function(){
            var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
            scrollTop = 300;
            alert(scrollTop);
        }
    },
    route: {
                data: function () {
                    this.$emit('SetScroll')
                }
              }
}

a组件页面是用ajax请求数据后v-for渲染的一个列表页。
需求是从a组件跳到同级的b组件然后再跳回来的时候要把滚动位置定位在300这里。现在问题是每次返回a组件时alert能正常弹出来,但位置就是在顶部没有滚下来。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
黄舟

Vue 的节点是异步渲染,当执行到 scrollTop = 300 时页面节点不一定渲染了出来,来举个例子:

如上图,this.listData 已经明明被赋值,浏览器里面却没有任何东西渲染出来。再看下一张图:

setTimeout 进行断点,此时可看到方块已经被 v-for 出来了。

那么结论就很明显:题主在执行 scrollTop = 300 时因为页面中根本没有渲染出组件,因此很可能是因为高度不够,滚不到 300.

解决方法也很简单,使用 setTimeout 将操作推入任务队列,在 v-for 执行完毕后再 scrollTop.

另外发现:滚动用法有问题,这样只是取值.

大家讲道理
var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    scrollTop = 300;
    
        这里显然出错了,因为scrollTop并未保存引用,而是复制了值。
        
    if(window.pageYOffset)window.pageYOffset=300;
    if(document.documentElement.scrollTop)document.documentElement.scrollTop=300;
    if(document.body.scrollTop)document.body.scrollTop=300;
    
    这样就可以了,虽说不太优雅。
黄舟

nextTick

http://cn.vuejs.org/api/#Vue-...

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号