当前位置: 首页 > news >正文

《Vue Router实战教程》19.滚动行为

欢迎观看《Vue Router 实战(第4版)》视频课程

    1. 滚动行为

使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样。 vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动。

注意: 这个功能只在支持 history.pushState 的浏览器中可用。

当创建一个 Router 实例,你可以提供一个 scrollBehavior 方法:

const router = createRouter({

  history: createWebHashHistory(),

  routes: [...],

  scrollBehavior (to, from, savedPosition) {

    // return 期望滚动到哪个的位置

  }

})

scrollBehavior 函数接收 to和 from 路由对象,如 Navigation Guards。第三个参数 savedPosition,只有当这是一个 popstate 导航时才可用(由浏览器的后退/前进按钮触发)。

该函数可以返回一个 ScrollToOptions 位置对象:

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    // 始终滚动到顶部

    return { top: 0 }

  },

})

你也可以通过 el 传递一个 CSS 选择器或一个 DOM 元素。在这种情况下,top 和 left 将被视为该元素的相对偏移量。

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    // 始终在元素 #main 上方滚动 10px

    return {

      // 也可以这么写

      // el: document.getElementById('main'),

      el: '#main',

      // 在元素上 10 像素

      top: 10,

    }

  },

})

如果返回一个 falsy 的值,或者是一个空对象,那么不会发生滚动。

返回 savedPosition,在按下 后退/前进 按钮时,就会像浏览器的原生表现那样:

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    if (savedPosition) {

      return savedPosition

    } else {

      return { top: 0 }

    }

  },

})

如果你要模拟 “滚动到锚点” 的行为:

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    if (to.hash) {

      return {

        el: to.hash,

      }

    }

  },

})

如果你的浏览器支持滚动行为,你可以让它变得更流畅:

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    if (to.hash) {

      return {

        el: to.hash,

        behavior: 'smooth',

      }

    }

  }

})

      1. 延迟滚动

有时候,我们需要在页面中滚动之前稍作等待。例如,当处理过渡时,我们希望等待过渡结束后再滚动。要做到这一点,你可以返回一个 Promise,它可以返回所需的位置描述符。下面是一个例子,我们在滚动前等待 500ms:

const router = createRouter({

  scrollBehavior(to, from, savedPosition) {

    return new Promise((resolve, reject) => {

      setTimeout(() => {

        resolve({ left: 0, top: 0 })

      }, 500)

    })

  },

})

我们可以将其与页面级过渡组件的事件挂钩,以使滚动行为与你的页面过渡很好地结合起来,但由于使用场景可能存在的差异和复杂性,我们只是提供了这个基础来实现特定的用户场景。

相关文章:

  • 原生多模态大模型时代:统一感知的智能跃迁
  • Vue 3 国际化实战:支持 Element Plus 组件和语言持久化
  • Git开发
  • 【Java集合】TreeSet、TreeMap源码解读
  • BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调
  • C++动态分配内存知识点!
  • vue2使用ezuikit-js播放萤石视频
  • 手撕红黑树
  • Python Lambda表达式详解
  • Vue 3 响应式更新问题解析
  • chrome extension开发框架WXT之WXT Storage api解析
  • 数列分块入门4
  • 信奥赛之c++课后练习题及解析(关系运算符+选择结构)
  • JAVA中正则表达式的入门与使用
  • Matlab 分数阶PID控制永磁同步电机
  • Codeforces Round 1016 (Div. 3) C ~ G 题解
  • Golang|协程
  • python-1. 找单独的数
  • 关于nacos注册的服务的ip异常导致网关路由失败的问题
  • 科技项目验收测试怎么做?验收测试报告如何获取?
  • 网站索引量下降/如何做网销
  • wordpress 去谷歌/seo快速排名外包
  • 素材网站/360识图
  • 江西建筑培训网/官网seo怎么做
  • 网站做优化按点击收费/长沙疫情最新消息
  • 机加工外贸网站/seo教学实体培训班