vue-router工作中常用基礎

vue-router官方文檔

router的使用

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 組件來導航. -->
    <!-- 通過傳入 `to` 屬性指定鏈接. -->
    <!-- <router-link> 默認會被渲染成一個 `<a>` 標籤 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的組件將渲染在這裏 -->
  <router-view></router-view>
</div>


//  定義路由
// 每個路由應該映射一個組件。 其中"component" 可以是
// 通過 Vue.extend() 創建的組件構造器,
// 或者,只是一個組件配置對象。
// 我們晚點再討論嵌套路由。
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

//  創建 router 實例,然後傳 `routes` 配置
// 你還可以傳別的配置參數, 不過先這麼簡單着吧。
const router = new VueRouter({
  routes // (縮寫) 相當於 routes: routes
})

動態路由

  1. 什麼是動態路由?
    動態路由就是可以接收參數數據的路由形式,路由地址的一部分是會發生變化的
  2. 如何接收動態路由傳遞的參數?
    $route.params
    通過props屬性獲取與傳遞參數數據的方式
    A.我們可以將props屬性設置爲true,route.params將會被設置爲組件屬性,那麼組件可以通過props接收route.params
    B.可以將props屬性設置爲一個對象,那麼組件可以通過props接收對象的數據
    C.還可以將props屬性設置爲一個函數,那麼就可以同時將參數數據以及對象數據傳遞給組件。

在這裏插入圖片描述

編程式導航與路由傳參

  // 1. 用name路徑的方式進行路由傳參
  this.$router.push({ name: 'Goods', params: { goodsID: id } })
 // 2.  用path路徑的方式進行路由傳參
   this.$router.push({path:'goods',query:{goodsID:id}})	
    //接收this.$route.query.goodsID

Hash與History模式

在這裏插入圖片描述
vue- router默認hash模式, ur使用#後面定位路由,對seo不利,設置history,就可以使用普通的url模式
history模式即普通url模式,這種模式充分利用history.pushState API來完成URL跳轉而無須重新加載頁面

使用:

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

兩者的區別

  1. hash模式url帶#號,history模式不帶#號
  2. 如果考慮url規範的話,那就需要使用history模式,因爲history模式不帶#,是個正常的url,適合開發習慣
  3. 把用Vue和React做的頁面分享至第三方APP,有的app是不允許帶url的,所以要用history模式
  4. 使用history的一個問題就是,在訪問二級頁面的時候,做刷新操作會出現404錯誤,那麼就需要和後端人配合讓特配置一下Apache或者是Nginx的url重定向,重定向到你的首頁路由

路由守衛

可以用來做用戶在沒有登錄註冊時的攔截
你可以使用 router.beforeEach 註冊一個全局前置守衛:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})

每個守衛方法接收三個參數:

  • to: Route: 即將要進入的目標 路由對象
  • from: Route: 當前導航正要離開的路由
  • next: Function: 一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。

組件中的守衛

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應路由被 confirm 前調用
    // 不!能!獲取組件實例 `this`
    // 因爲當守衛執行前,組件實例還沒被創建
  },
  beforeRouteUpdate (to, from, next) {
    // 在當前路由改變,但是該組件被複用時調用
    // 舉例來說,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
    // 由於會渲染同樣的 Foo 組件,因此組件實例會被複用。而這個鉤子就會在這個情況下被調用。
    // 可以訪問組件實例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導航離開該組件的對應路由時調用
    // 可以訪問組件實例 `this`
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章