1. 程式人生 > >Vue.js 從 Vue Router 0.7.x 遷移

Vue.js 從 Vue Router 0.7.x 遷移

從 Vue Router 0.7.x 遷移

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

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 }
  ]
})

考慮到不同瀏覽器中遍歷物件不能保證會使用相同的鍵值,這種陣列的語法可以保證更多可預測的路由匹配。

升級路徑

執行 遷移助手 找到 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 指令已經被一個新的 <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 這一元件進行替代。

升級路徑

執行 遷移路徑 找到 beforeRouteEnter 鉤子的示例。

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
      })
  }
}

 

from:https://cn.vuejs.org/v2/guide/migration-vue-router.html