從 Vue Router 0.7.x 遷移


只有 Vue Router 2 是與 Vue 2 相容的,所以如果你更新了 Vue ,你也需要更新 Vue Router 。這也是我們在主文檔中將遷移路徑的詳情加入的原因。
有關使用 Vue Router 2 的完整教程,請參閱 
#Vue Router 文件


目錄

  • Router 初始化

  • Route 定義

    • router.map

    • #router.on

    • ##router.beforeEach

    • #subRoutes

    • router.redirect

    • router.alias

    • 任意的Route 屬性

    • URL 中的Query 陣列[] 語法

  • Route 符合

    • #一個或更多的命名參數

  • 」連結

    • #v-link

    • #v-link-active

  • 程式導覽
    • router.go
  • 路由選擇:Modes
    • hashbang: false
    • # #history: true

    • abstract: true

      ############路由選項:Misc##################saveScrollPosition#################root######################################################### #########transitionOnLoad###################suppressTransitionError######
  • 路由掛鉤

    • activate

    • #activate

    • canActivate

    • deactivate

    • canDeactivate

    • canReuse: false

    data


data


$loadingRouteData
Router 初始化




##router.start

##取代不再會有一個特殊的API 用來初始化包含Vue Router 的app ,這意味著不再是:

router.start({
  template: '<router-view></router-view>'
}, '#app')
你只需要傳一個路由屬性給Vue 實例:
new Vue({
  el: '#app',
  router: router,
  template: '<router-view></router-view>'
})
或者,如果你使用的是運行時建構(runtime-only) 方式:
new Vue({
  el: '#app',
  router: router,
  render: h => h('router-view')
})

升級方式

執行 

遷移助理

 找到 

router.start
 被呼叫的範例。

#Route 定義

######### ##################router.map############### ###取代########## ########路由現在被定義為一個在router 實例裡的一個######routes### 選項###陣列。所以這些路由:###
router.map({
  '/foo': {
    component: Foo
  },
  '/bar': {
    component: Bar
  }
})
###會以這種方式定義:###
var router = new VueRouter({
  routes: [
    { path: '/foo', component: Foo },
    { path: '/bar', component: Bar }
  ]
})
###考慮到不同瀏覽器中遍歷物件不能保證會使用相同的property 順序,這種陣列的語法可以保證更多可預測的路由匹配。 ###############升級方式############運行 ###遷移助理### 找到 ###router.map### 被調用的範例。 ######


router.on 移除

#如果你需要在啟動的app 時透​​過程式碼產生路由,你可以動態地向路由數組推送定義來完成這個操作。舉個例子:

// 普通的路由
var routes = [
  // ...
]

// 动态生成的路由
marketingPages.forEach(function (page) {
  routes.push({
    path: '/marketing/' + page.slug
    component: {
      extends: MarketingComponent
      data: function () {
        return { page: page }
      }
    }
  })
})

var router = new Router({
  routes: routes
})

如果你需要在router 被實例化後增加新的路由,你可以把router 原來的匹配方式換成一個包括你新添的加路由的匹配方式:

router.match = createMatcher(
  [{
    path: '/my/new/path',
    component: MyComponent
  }].concat(router.options.routes)
)

升級方式

執行 遷移助理 找到 router.on 被呼叫的範例。


router.beforeEach changed

router.beforeEach 現在是非同步工作的,並且攜帶一個next 函數作為其第三個參數。

router.beforeEach(function (transition) {
  if (transition.to.path === '/forbidden') {
    transition.abort()
  } else {
    transition.next()
  }
})
router.beforeEach(function (to, from, next) {
  if (to.path === '/forbidden') {
    next(false)
  } else {
    next()
  }
})


subRoutes 換名

#出於Vue Router 和其他路由庫一致性的考慮,重新命名為children

升級方式

執行 遷移助理 找到 subRoutes 選項的範例。


router.redirect 取代

現在用一個路由定義的選項來代替。舉個例子,你將會更新:

router.redirect({
  '/tos': '/terms-of-service'
})

成像下面的routes配置裡定義的樣子:

{
  path: '/tos',
  redirect: '/terms-of-service'
}

升級方式

執行 遷移助理 找到 router.redirect 被呼叫的範例。


router.alias 取代

現在是你進行alias 操作的路由定義裡的一個選項。舉個例子,你需要在你的routes定義裡將:

router.alias({
  '/manage': '/admin'
})

配置這個樣子:

{
  path: '/admin',
  component: AdminPanel,
  alias: '/manage'
}

如果你需要進行多次alias 操作,你也可以使用一個陣列語法去實現:

alias: ['/manage', '/administer', '/administrate']

升級方式

運行 遷移助手 找到 


####################################################################。 router.alias### 被呼叫的範例。 ######################## 任意的Route 屬性###取代###############現在任意的route 屬性必須在新meta 屬性的作用域內,以避免和以後的新特性發生衝突。舉個例子,如果你以前這樣定義:###
'/admin': {
  component: AdminPanel,
  requiresAuth: true
}
###你現在需要把它更新成:###
{
  path: '/admin',
  component: AdminPanel,
  meta: {
    requiresAuth: true
  }
}
###如果在一個路由上存取一個屬性,你仍然會透過 meta 。舉例:###
if (route.meta.requiresAuth) {
  // ...
}
############升級方式############執行 ###遷移助理### 找到任意的路由不在meta 作用域下的範例。 ######


URL 中的Query 陣列[] 語法移除

當傳遞陣列給query 參數時,URL 語法不再是/foo?users[]=Tom&users[]=Jerry,取而代之,新語法是/foo?users=Tom&users=Jerry,此時$route.query.users 將仍舊是一個數組,不過如果在該query 中只有一個參數:/foo?users=Tom,當直接訪問該路由時,vue-router 將無法知道我們期待的users 是個陣列。因此,可以考慮新增一個計算屬性並且在每個使用$route.query.users 的地方以該計算屬性取代:

export default {
  // ...
  computed: {
    // 此计算属性将始终是个数组
    users () {
      const users = this.$route.query.users
      return Array.isArray(users) ? users : [users]
    }
  }
}


Route 匹配


#路由匹配現在使用path-to-regexp 這個包,這將會使得工作與之前相比更加靈活。


一個或更多的命名參數改變

#文法稍微有些許改變,所以以/category/*tags為例,應該更新為/category/:tags

升級方式

執行 遷移助理 找到棄用路由語法的範例。




##v-link

取代

v-link 指令已經被一個新的

<router-link>
元件

指令取代,這部分的工作已經被Vue 2 中的元件完成。這將意味著在任何情況下,如果你擁有這樣一個連結:

<a v-link="'/about'">About</a>
你需要把它更新成:
<router-link to="/about">About</router-link>
注意:

<router-link>

不支援target="_blank"屬性,如果你想開啟一個新標籤頁,你必須用<a>標籤。

###升級方式############執行 ###遷移助理### 找到 ###v-link### 指令的範例。 ######


#v-link-active 也因為指定了一個在<router-link> 元件上的tag 屬性而被棄用了。舉個例子,你需要更新:

<li v-link-active>
  <a v-link="'/about'">About</a>
</li>

成這個寫法:

<router-link tag="li" to="/about">
  <a>About</a>
</router-link>

<a>標籤將會成為真實的連結(並且可以獲得正確的跳轉),但是啟動的類別將會被應用在外部的<li>標籤上。

升級方式

執行 遷移助理 找到 v-link-active#指令的範例


程式導覽



##router.go 改變

為了與

HTML5 History API 保持一致性,router.go 已經被用來作為後退/前進導航router. push 用來導向特殊頁面。

升級方式

運行 

遷移助理 ,找到 router.go 和router.push 指令被呼叫的範例。


路由選擇:Modes



hashbang: false 移除

##Hashbangs 將不再為谷歌需要去爬去一個網址,所以他們將不再成為哈希策略的預設選項。

升級方式

運行 

遷移助手 找到 hashbang: false 選項的範例。


history: true##取代所有路由模型選項將會簡化為單一的

mode 選項。你需要更新:

var router = new VueRouter({
  history: 'true'
})
成這個寫法:

var router = new VueRouter({
  mode: 'history'
})

#升級方式執行 

遷移助手

 找到 history: true 選項的範例。


abstract: true 取代所有路由模型選項將會簡化為單一的

mode 選項。你需要更新:

var router = new VueRouter({
  abstract: 'true'
})
成這個寫法:

var router = new VueRouter({
  mode: 'abstract'
})

#升級方式執行 

遷移助手

 找到 abstract: true 選項的範例。


路由選項:Misc



saveScrollPosition 取代

##它已經被替換為可以接受一個函數的

scrollBehavior 選項,所以滑動行為可以完全的被定制化處理- 甚至為每次路由進行定制也可以滿足。這將會開啟許多新的可能,但是簡單的複製舊的行為:

saveScrollPosition: true

你可以替換為:

scrollBehavior: function (to, from, savedPosition) {
  return savedPosition || { x: 0, y: 0 }
}

升級方式

執行 

遷移助理 找到 saveScrollPosition: true 選項的範例。


root 取代

為了與

HTML 的<base> 標籤保持一致性,重新命名為base

升級方式

執行 

遷移助理 找到 root 選項的範例。


transitionOnLoad移除

由於Vue 的過渡系統

appear transition control 的存在,這個選項將不再需要。

升級方式

運行 

遷移助理 找到 #transitionOnLoad: true 選項的範例。


suppressTransitionError 移除

##出於簡化鉤子的考慮被移除。如果你真的需要抑制過渡錯誤,你可以使用

trycatch 作為替代。

升級方式

運行 

遷移助理 找到 suppressTransitionError: true 選項的範例。


#路由掛鉤



#activate

取代

使用beforeRouteEnter 這個元件進行替代。

升級方式

執行 
遷移助手

 找到 

activate 鉤子的範例。 canActivate

##取代

使用

beforeEnter 在路由中作為替代。

升級方式

執行 ###遷移助手### 找到 ###canActivate### 鉤子的範例。 ######


deactivate 移除

##使用


beforeDestroy

destroyed 鉤子作為替代。 升級方式

執行 

遷移助手 找到 deactivate 鉤子的範例。

canDeactivate



在元件中使用

beforeRouteLeave 作為替代。 升級方式執行 

遷移助手

 找到 canDeactivate 鉤子的範例。

canReuse: false

移除###############在新的Vue 路由中將不再被使用。 ###############升級方式############運行 ###遷移助手### 找到 ###canReuse: false### 選項的範例。 ###########################data############### ################################################################################### ###############$route###屬性是響應式的,所以你可以就用一​​個watcher 去回應路由的改變,就像這樣:###
watch: {
  '$route': 'fetchData'
},
methods: {
  fetchData: function () {
    // ...
  }
}
### #########升級方式############執行 ###遷移助手### 找到 ###data### 鉤子的範例。 ######


$loadingRouteData 移除


########定義你自己的屬性(例如:###isLoading###),然後在路由上的watcher 中更新載入狀態。舉個例子,如果使用 ###axios### 取得資料:###
data: function () {
  return {
    posts: [],
    isLoading: false,
    fetchError: null
  }
},
watch: {
  '$route': function () {
    var self = this
    self.isLoading = true
    self.fetchData().then(function () {
      self.isLoading = false
    })
  }
},
methods: {
  fetchData: function () {
    var self = this
    return axios.get('/api/posts')
      .then(function (response) {
        self.posts = response.data.posts
      })
      .catch(function (error) {
        self.fetchError = error
      })
  }
}
#########