VUE开发-- 滚动行为

一、Vue scrollBehavior 滚动行为

测试中Google浏览器不存在该问题。

通常我们很少会对页面回退或前进进行操作,在浏览器用户界面上提供有前进、回退按钮,页面跳转到离开页面之前的位置,而不是重新刷新页面,这个功能是由浏览器引擎(与渲染引擎、解析引擎概念不同)来完成的。当用户进入一个页面的时候,会往 history 栈中放入当前的记录,对页面级别的操作通过操作内置对象 history 可以满足一些需求。
vue 路由跳转就是通过对 history.pushState() 和 history.replaceState() 方法的模拟来实现,会往 history 栈中存放一条记录,这也是为什么 vue 的 router.push 方法只能在支持 history.pushState() 方法的浏览器中使用,当调用 router.go() 或者 router.back() 方法的时候就和 history.go()、history.back() 效果一样,都是对 history 栈中的记录进行访问,上述行为与通过浏览器的回退和前进效果也是一样。
但是,在不加处理的情况下,组件的滚动行为会跟我们想象的不同。

  1. vue组件滚动行为
    设置三个路由 /home、/list、/about,即对应三个不同的组件:
    1) 路由:
import Vue from 'vue'
import Router from 'vue-router'

import Home from '@/views/Home'
import List from '@/views/List'
import About from '@/views/About'


Vue.use(Router)
//创建路由对象
export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    },
    {
      path: '/List',
      name: 'List',
      component: List
    },
    {
      path: '/About',
      name: 'About',
      component: About
    }
  ]
})

2)主页:

<template>
  <div class="container">
    <h2>主页</h2>
  </div>
</template>
<script>
export default {
  name: 'Home'
}
</script>
<style scoped>

</style>


3)列表:

<template>
  <div class="container">
    <h2>列表</h2>
  </div>
</template>
<script>
export default {
  name: 'List'
}
</script>
<style scoped>

</style>

4)关于我们;

<template>
  <div class="container">
    <h2>关于我们</h2>
  </div>
</template>
<script>
export default {
  name: 'About'
}
</script>
<style scoped>

</style>

回退功能与浏览器的回退功能相同。
4)给Home组件与List组件添加内容。

//Home组件
<template>
  <div class="container">
    <ul >
      <li class="list_content" v-for="i in 10" :key="i">{{ i }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  name: "Home"
};
</script>
<style scoped>
.list_content{
  background-color: gold;
  width: 300px;
  height: 90px;
  list-style: none;
}
</style>
//List组件
<template>
  <div class="container">
    列表
    <ul >
      <li class="list_content" v-for="i in 10" :key="i">{{ i }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  name: 'List'
}
</script>
<style scoped>
.list_content{
  background-color:green;
  width: 300px;
  height: 90px;
  list-style: none;
}
</style>

请注意,现在开始滚动首页位置至第 5 屏的位置,当切换到列表以及关于页面的时候,会发现这两个页面的滚动行为和浏览前滚动行为一致。

添加回到顶部功能:

二、常见问题:

  1. 问题:使用keep-alive标签后部分安卓机返回缓存页位置不精确问题
    解决方案:
<div id="app">
  <keep-alive>
   <router-view v-if="$route.meta.keepAlive"></router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
const router = new Router({
 scrollBehavior(to, from, savedPosition) {
  if (savedPosition && to.meta.keepAlive) {
   return savedPosition;
  }
  return { x: 0, y:0 };
 },
});

  1. 不能返回到原有浏览位置
    当我们从A页面跳转到B页面,然后在B页面浏览一篇很长的文章,但是这时候我们讲页面滚动到某个位置的时候,我们不小心按了一下浏览器的后退键,这时候我们再按浏览器的前进键的时候会发现,该文章又要从头开始阅读了。

在route后面加上scrollBehavior这个函数。该scrollBehavior函数接收to和from路由对象。第三个参数savedPosition仅在这是popstate导航(由浏览器的后退/前进按钮触发)时才可用该函数可以返回滚动位置对象。
如果返回假值或空对象,则不会进行滚动。


Vue.use(Router)
//创建路由对象
export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    },
    {
      path: '/List',
      name: 'List',
      component: List
    },
    {
      path: '/About',
      name: 'About',
      component: About
    }
  ],
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition && to.meta.keepAlive) {
      return savedPosition;
    }
    return { x: 0, y: 0 };
  }
})

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 浏览器对用户访问网页的记录 在聊如何管理vue组件滚动行为之前,先简单说说(毕竟深入了我也很模糊o(╯□╰)o)浏...
    一慢呀阅读 45,753评论 0 49
  • 那这次呢?我决定直接就先放一个小小demo上来 其实我们在引入vue-router插件那一刻,我们的网页就已经附带...
    看物看雾阅读 904评论 0 1
  • 学习目的 学习Vue的必备技能,必须 熟练使用 Vue-router,能够在实际项目中运用。 Vue-rout...
    _1633_阅读 92,805评论 3 58
  • 回忆: 我们知道,h5的history或者hash帮助我们解决了,变化url跳转页面不发送请求,并且我们能监听到u...
    LoveBugs_King阅读 3,798评论 0 5
  • 什么是Vue Vue.js 是一套构建用户界面的框架 只关注视图层 易于上手,还便于与第三方库或即有项目整合 M...
    ef44694b25cb阅读 921评论 0 0

友情链接更多精彩内容