当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vue项目中scrollTo在加载好后回到原来的地方?

王凯旋
2024-08-26

我想要在页面加载好后通过scrollTo进行滚动,虽然在加载时它到了正确的地方,但是在加载完成时又会回到之前的地方,我是在mounted调用这个函数的:

to: function() {
  window.scrollTo(0, $("#to").offset().top);
}

共有1个答案

侯兴为
2024-08-26

在Vue项目中,如果你遇到在mounted钩子中使用scrollTo方法后页面又跳回到原来位置的问题,这通常是因为页面上的某些元素(如图片、异步数据等)在mounted钩子执行时尚未完全加载完成,导致页面高度在scrollTo执行后发生了变化。

为了解决这个问题,你可以考虑以下几种方法:

1. 使用nextTick

Vue的nextTick方法可以在DOM更新完成后立即执行你的回调函数。这可以确保在调用scrollTo之前,所有依赖的数据和DOM都已经更新完毕。

export default {
  mounted() {
    this.$nextTick(() => {
      this.to();
    });
  },
  methods: {
    to() {
      window.scrollTo(0, $("#to").offset().top);
    }
  }
}

2. 监听图片加载

如果你的页面中有大量图片,并且这些图片的大小对页面滚动位置有影响,你可以监听图片的加载状态,在所有图片加载完成后执行滚动。

export default {
  data() {
    return {
      imagesLoaded: 0,
      totalImages: 0
    };
  },
  mounted() {
    this.totalImages = document.querySelectorAll('img').length;
    document.querySelectorAll('img').forEach(img => {
      img.onload = () => {
        this.imagesLoaded++;
        if (this.imagesLoaded === this.totalImages) {
          this.to();
        }
      };
    });
  },
  methods: {
    to() {
      window.scrollTo(0, $("#to").offset().top);
    }
  }
}

3. 使用Vue Router的导航守卫

如果你的页面跳转是通过Vue Router实现的,并且你希望在路由跳转完成后滚动到特定位置,你可以使用Vue Router的导航守卫。

router.beforeEach((to, from, next) => {
  // 可以在这里设置滚动位置,但通常不推荐,因为可能不是所有路由跳转都需要滚动
  next();
});

// 或者在组件内使用
export default {
  watch: {
    '$route'(to, from) {
      this.$nextTick(() => {
        this.to();
      });
    }
  },
  methods: {
    to() {
      window.scrollTo(0, $("#to").offset().top);
    }
  }
}

4. 延迟执行

如果上述方法都不适用,你可以简单地使用setTimeout来延迟scrollTo的执行,但这通常不是最佳实践,因为它依赖于不确定的时间间隔。

mounted() {
  setTimeout(() => {
    this.to();
  }, 500); // 延迟500毫秒执行
},
methods: {
  to() {
    window.scrollTo(0, $("#to").offset().top);
  }
}

在实际应用中,推荐使用nextTick方法,因为它既简单又可靠,能够确保DOM更新完成后再执行滚动操作。

 类似资料:
  • vue项目已经使用UglifyJsPlugin进行打包压缩了,上级要求项目打包之后js文件再小点,还有什么处理办法呢? 希望大佬们能给点建议,如果可以的话,有点代码支持! 拜谢!!!

  • vue 项目打包报错? 应该怎么调整? package.json

  • 本文向大家介绍vue加载完成后的回调函数方法,包括了vue加载完成后的回调函数方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇vue加载完成后的回调函数方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有一个项目,其中网页4.43。已使用vue cli设置了0。我正在尝试使用图像大小加载程序在构建时获取图像大小。 为了这个,在我的一本书里。我尝试使用在项目中安装的自定义加载程序加载模块的vue文件: 当我的项目构建时,它输出以下错误: 文件存在,js/ts/css文件解析良好。我的设置有什么问题?

  • 本文向大家介绍在vue-cli搭建的项目中增加后台mock接口的方法,包括了在vue-cli搭建的项目中增加后台mock接口的方法的使用技巧和注意事项,需要的朋友参考一下 用vue-cli搭建一个前端开发环境确实是极其方便,在写前端代码肯定也是少不了需要调用后台提供的业务接口进行前后端交互,特别在敏捷开发中,前后端都要提前确定业务接口并进行打桩,在开发过程中基本是没有现成的后台可以调用,基本上都是

  • 这似乎是一个非常基本的流程,而且Laravel有很多很好的基本解决方案,我觉得我错过了一些东西。 用户单击需要身份验证的链接。Laravel的身份验证过滤器启动并将它们路由到登录页面。用户登录,然后转到他们试图在“身份验证”过滤器启动之前进入的原始页面。 有没有一个好方法可以知道他们最初想要到达的页面?由于Laravel是拦截请求的人,我不知道它是否会在用户登录后跟踪某个地方以方便路由。 如果没有

  • Clojure/Leiningen/Eclipse(和Java)newby。我试图让Eclipse加载Clojure/Leiningen项目,但在搜索Lein插件解决方案时,我看到了令人困惑/矛盾的结果。 Eclipse IDE for Java开发者版本:Juno Service Release 2构建id:20130225-0426(Windows 8) 我在中有以下用户配置文件。lein\p

  • 我正在实现一个自定义TableCellFactory以从数据库异步加载数据。查询数据库不应阻塞UI线程。 它大部分时间都在工作,但并不总是如此。它的一个奇怪之处是总是。在哪些情况下,我可以期望为? 对应的表格代码: } 编辑:在此处找到更好的方法。