請啟用 Javascript 查看內容

Vue Router - 滾動行為

 ·  ☕ 1 分鐘

竹白的 Vue 記事本 目錄

這個功能只在支持 history.pushState 的瀏覽器中可用。
1
2
3
4
5
6
const router = new VueRouter({
  routes: [...],
  scrollBehavior(to, from, savedPosition) {
    // return {}
  },
});

scrollBehavio 方法接收參數為:

  • to:即將要進入的目標路由物件。
  • from:當前導航正要離開的路由物件。
  • savedPosition:這個參數只有當 popstate 導航(透過瀏覽器的前進、後退按鈕觸發)時才可用。

這個方法需要回傳一個滾動位置物件,有兩種格式:

  • { x: number, y: number }
  • { selector: string, offset? : { x: number, y: number }}offset 只在 2.6.0+ 支持)

如果回傳一個 falsy 值或空物件,則不會發生滾動。

對於所有路由導航,簡單地讓頁面滾動到頂部:

1
2
3
scrollBehavior(to, from, savedPosition) {
  return { x: 0, y: 0};
}

若是透過瀏覽器的前進、後退按鈕切換路由時,可以使用 savedPosition 取得上次位置:

1
2
3
4
5
6
7
scrollBehavior(to, from, savedPosition) {
  if (savedPosition) {
    return savedPosition;
  } else {
    return { x: 0, y: 0};
  }
}

若希望路由切換時,讓頁面滾動到指定位置,可以利用 hash,模擬「滾動到錨點」的行為:

<router-link :to="{name: 'nav', hash: '#nav'}">nav</router-link>
1
2
3
4
5
scrollBehavior(to, from, savedPosition) {
  if (to.hash) {
    return { selector: to.hash };
  }
}

若是希望滾動位置可以預留空間,可以加上 offset 屬性:

1
2
3
4
5
6
7
8
scrollBehavior(to, from, savedPosition) {
  if (to.hash) {
    return { 
      selector: to.hash,
      offset: { x: 0, y: 100 },
    };
  }
}

非同步滾動

2.8.0 新增了非同步滾動,可以回傳一個 Promise 來處理

1
2
3
4
5
6
7
  scrollBehavior(to, from, savedPosition) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({ x: 0, y: 0 });
      }, 500);
    });
  },

竹白
作者
竹白
前端筆記

文章目錄