從 Vue Router 0.7.x 遷移
只有 Vue Router 2 是與 Vue 2 相容的,所以如果你更新了 Vue ,你也需要更新 Vue Router 。這也是我們在主文檔中將遷移路徑的詳情加入的原因。
有關使用 Vue Router 2 的完整教程,請參閱 #Vue Router 文件。
目錄
- 程式導覽
- 路由選擇:Modes
- #activate
- canActivate
- deactivate
- canDeactivate
- canReuse: false
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######### ##################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
指令已經被一個新的
指令取代,這部分的工作已經被Vue 2 中的元件完成。這將意味著在任何情況下,如果你擁有這樣一個連結:<a v-link="'/about'">About</a>
你需要把它更新成:<router-link to="/about">About</router-link>
注意:
不支援target="_blank"屬性,如果你想開啟一個新標籤頁,你必須用<a>標籤。
v-link-active
#取代
#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
移除
升級方式
運行遷移助手 找到 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
移除
appear transition control
的存在,這個選項將不再需要。
升級方式
運行遷移助理 找到 #transitionOnLoad: true 選項的範例。
suppressTransitionError
移除
升級方式
運行遷移助理 找到 suppressTransitionError: true 選項的範例。
#路由掛鉤
#activate
執行
遷移助手
activate 鉤子的範例。
canActivate
deactivate
移除
beforeDestroy
或destroyed 鉤子作為替代。
升級方式
遷移助手 找到 deactivate
鉤子的範例。
beforeRouteLeave 作為替代。
升級方式執行
找到 canDeactivate
鉤子的範例。
watch: { '$route': 'fetchData' }, methods: { fetchData: function () { // ... } }### #########升級方式############執行 ###遷移助手### 找到 ###data### 鉤子的範例。 ######
$loadingRouteData
移除
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 }) } }#########