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

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

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

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

  • 使用vue搭建一个仿window系统。 大体实现思路是: 有一个config变量layers里面装的是每一个组件的相关配置。每一个组件都是以绝对定位的方式定位在页面上,x代表left,y代表top。 在拖动组件的时候,每触发一次mousemove事件就去修改这个config变量。从而实现拖动效果 在更换壁纸组件里,当使用img加载图片没有任何问题。 当使用background-image展示图片时

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