Vue scrollBehavior 滾動行為
原文https://www.cnblogs.com/sophie_wang/p/7880261.html
https://blog.csdn.net/wandoumm/article/details/80270865
使用前端路由,當切換到新路由時,想要頁面滾到頂部,或者是保持原先的滾動位置,就像重新載入頁面那樣。 vue-router
能做到,而且更好,它讓你可以自定義路由切換時頁面如何滾動。
注意: 這個功能只在 HTML5 history 模式下可用。
當建立一個 Router 例項,你可以提供一個 scrollBehavior
方法:
const router = new VueRouter({ routes: [...], scrollBehavior (to, from, savedPosition) { // return 期望滾動到哪個的位置 } })
scrollBehavior
方法接收 to
和 from
路由物件。第三個引數 savedPosition
當且僅當 popstate
導航 (通過瀏覽器的 前進/後退 按鈕觸發) 時才可用。
這個方法返回滾動位置的物件資訊,長這樣:
{ x: number, y: number }
{ selector: string, offset? : { x: number, y: number }}
(offset 只在 2.6.0+ 支援)
如果返回一個 falsy (譯者注:falsy 不是 false
舉例:
scrollBehavior (to, from, savedPosition) {
return { x: 0, y: 0 }
}
對於所有路由導航,簡單地讓頁面滾動到頂部。
返回 savedPosition
,在按下 後退/前進 按鈕時,就會像瀏覽器的原生表現那樣:
scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { x: 0, y: 0 } } }
如果你要模擬『滾動到錨點』的行為:
scrollBehavior (to, from, savedPosition) {
if (to.hash) {
return {
selector: to.hash
}
}
}
我們還可以利用路由元資訊更細顆粒度地控制滾動。檢視完整例子:
const scrollBehavior = (to, from, savedPosition) => {
if (savedPosition) {
// savedPosition is only available for popstate navigations.
return savedPosition
} else {
const position = {}
// new navigation.
// scroll to anchor by returning the selector
if (to.hash) {
position.selector = to.hash
}
// 如果meta中有scrollTop
if (to.matched.some(m => m.meta.scrollToTop)) {
// cords will be used if no selector is provided,
// or if the selector didn't match any element.
position.x = 0
position.y = 0
}
// if the returned position is falsy or an empty object,
// will retain current scroll position.
return position
}
}
與keepAlive結合,如果keepAlive的話,儲存停留的位置:
scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
if (from.meta.keepAlive) {
from.meta.savedPosition = document.body.scrollTop;
}
return { x: 0, y: to.meta.savedPosition ||0}
}
}
在文件頁面(http://localhost:8080/document)拉動滾動條,然後重新整理瀏覽器會發現滾動條依然在原來的位置,這是瀏覽器的預設行為,會記錄瀏覽器滾動條預設位置。
但是點選瀏覽器“前進/後退”按鈕,會發現當初那個頁面的滾動條從0開始了,沒有記錄上一次滾動條的位置。現在要求點選瀏覽器“前進/後退”按鈕,頁面滾動條要記錄上一次的位置,這時需要設定它的的滾動行為。
這時候需要在路由配置中設定 scrollBehavior(to,from,savePosition)函式,函式有三個引數。scrollBehavior() 函式在點選瀏覽器的“前進/後退”,或者切換導航的時候觸發。
-
scrollBehavior(to,from,savePosition){ // 在點選瀏覽器的“前進/後退”,或者切換導航的時候觸發。
-
console.log(to) // to:要進入的目標路由物件,到哪裡去
-
console.log(from) // from:離開的路由物件,哪裡來
-
console.log(savePosition) // savePosition:會記錄滾動條的座標,點選前進/後退的時候記錄值{x:?,y:?}
-
}
實現滾動行為的程式碼:router/index.js
-
let router = new VueRouter({
-
mode:'history',//預設是hash模式
-
linkActiveClass:'menvscode-active',
-
scrollBehavior(to,from,savePosition){ // 在點選瀏覽器的“前進/後退”,或者切換導航的時候觸發。
-
console.log(to) // to:要進入的目標路由物件,到哪裡去
-
console.log(from) // from:離開的路由物件,哪裡來
-
console.log(savePosition) // savePosition:會記錄滾動條的座標,點選前進/後退的時候記錄值{x:?,y:?}
-
if(savePosition) {
-
return savePosition;
-
}else{
-
return {x:0,y:0}
-
}
-
},
-
routes:[
-
{
-
path:'/',
-
name:'index',
-
component:Home,
-
},
-
{
-
path:'/home',
-
name:'Home',//name代表當前的路由
-
component:Home,
-
alias:'/index' //當訪問'/index'的時候,就能匹配到當前的路由了。
-
},
-
{
-
path:'/document',
-
name:'Document',
-
components:{ // 多個檢視的時候,預設渲染default的檢視。
-
default:Document,
-
slider:Slider,
-
home:Home
-
}
-
}
-
]
-
})
-
export default router
我們還可以設hash來控制滾動行為,定位到某一位置
-
if(to.hash){ //先判斷目標路由有沒有hash值
-
return {selector:to.hash}
-
}
App.vue:在路勁後面新增 hash 值。
-
<template>
-
<div id="app">
-
<div class="nav-box">
-
<ul class="f-cb">
-
<li>
-
<router-link to="/" exact tag="div" event="mouseover">home</router-link>
-
</li>
-
<li>
-
<router-link :to="{path:'/document#abc'}" event="mouseover">document</router-link>
-
</li>
-
<router-link to="/about" tag="li" event="mouseover">
-
<i></i>
-
<span>about</span>
-
</router-link>
-
</ul>
-
</div>
-
<div class="content f-cb">
-
<router-view name="slider"></router-view> <!-- 命名檢視 -->
-
<router-view class="center"></router-view>
-
</div>
-
</div>
-
</template>
@/components/Document.vue
-
<template>
-
<div>
-
我是文件
-
<p id="abc">定位到這個元素</p>
-
</div>
-
</template>
router/index.js
-
let router = new VueRouter({
-
mode:'history',//預設是hash模式
-
linkActiveClass:'menvscode-active',
-
scrollBehavior(to,from,savePosition){ // 在點選瀏覽器的“前進/後退”,或者切換導航的時候觸發。
-
console.log(to) // to:要進入的目標路由物件,到哪裡去
-
console.log(from) // from:離開的路由物件,哪裡來
-
console.log(savePosition) // savePosition:會記錄滾動條的座標,點選前進/後退的時候記錄值{x:?,y:?}
-
/*if(savePosition) {
-
return savePosition;
-
}else{
-
return {x:0,y:0}
-
}*/
-
if(to.hash){ //先判斷目標路由有沒有hash值
-
return {selector:to.hash}
-
}
-
},
-
routes:[]
-
})
-
export default router