vue路由介紹,命名路由,巢狀路由,命名檢視
路由,對於大多數單頁面應用,都推薦使用官方支援的 vue-router 庫。更多細節可以看 vue-router 文件https://router.vuejs.org/。以下為簡單實現路由的程式碼: 寫html <div class="tab-item"> <router-link to="/one">第一個路由</router-link>//to="/one"為,當點選時,跳轉到/one路徑下的檔案 </div> <div class="tab-item"> <router-link to="/tow">第二個路由</router-link> </div> <div class="tab-item"> <router-link to="/three">第三個路由</router-link> </div> 書寫js
import Vue from 'vue'//引入vue import VueRouter from 'vue-router'//引入vue路由元件 import one from 'one.vue' import two from 'two.vue' import three from 'three.vue'
Vue.use(VueRouter)//使用路由元件
export default new VueRouter ({ routes: [ { path: '/one',//對應html中的to="/one"路徑 component: one//跳轉到one元件下 }, { path: '/tow', component: tow }, { path: '/three', component: three }, { path: '/',//重定向路由,即當開啟頁面時,重定向到哪個路徑下 redirect: '/one' } ] })
動態路由匹配 我們經常需要把某種模式匹配到的所有路由,全都對映到同個元件。例如,我們有一個 User 元件,對於所有 ID 各不相同的使用者,都要使用這個元件來渲染。那麼,我們可以在 vue-router 的路由路徑中使用“動態路徑引數”(dynamic segment) 來達到這個效果: html: <div id="app"> <p> <router-link to="/user/foo">/user/foo</router-link> <router-link to="/user/bar">/user/bar</router-link> </p> <router-view></router-view> </div> js: const router = new VueRouter({ routes: [ // 動態路徑引數 以冒號開頭 { path: '/user/:id', component: User } ] })
一個“路徑引數”使用冒號 : 標記。當匹配到一個路由時,引數值會被設定到 this.$route.params,可以在每個元件內使用。於是,我們可以更新 User 的模板,輸出當前使用者的 ID:
const User = { template: '<div>User:{{ $route.params.id }}</div>'//當點選/user/foo時,輸出User:foo。點選/user/bar時,輸出User:bar }
巢狀路由 我們經常將動態路由和巢狀路由共同使用,巢狀路由即是在原路由的基礎上增加一個 children ,children 是一個數組.並且我們還需要在原來的元件上新增< router-view >來渲染 chlidren 裡面的路由。例項:
html <div id="app"> <p> <router-link to="/user/foo">/user/foo</router-link> <router-link to="/user/foo/profile">/user/foo/profile</router-link> <router-link to="/user/foo/posts">/user/foo/posts</router-link> </p> <router-view></router-view> </div>
js 定義模板 const User = { template: ` <div class="user"> <h2>User {{ $route.params.id }}</h2> <router-view></router-view> </div> ` }
const UserHome = { template: '<div>Home</div>' } const UserProfile = { template: '<div>Profile</div>' } const UserPosts = { template: '<div>Posts</div>' }
const router = new VueRouter({ routes: [ { path: '/user/:id', component: User, children: [ { path: '', component: UserHome },//預設匹配的路徑 { path: 'profile', component: UserProfile },//當點選/user/foo/profile。匹配到id為profile時,跳轉UserProfile模板 { path: 'posts', component: UserPosts }//當點選/user/foo/posts。匹配到id為profile時,跳轉UserPosts模板 ] } ] })
const app = new Vue({ router }).$mount('#app')
程式設計式的導航 除了使用 <router-link> 建立 a 標籤來定義導航連結,我們還可以藉助 router 的例項方法,通過編寫程式碼來實現。
#router.push(location, onComplete?, onAbort?) 注意:在 Vue 例項內部,你可以通過 $router 訪問路由例項。因此你可以呼叫 this.$router.push。
想要導航到不同的 URL,則使用 router.push 方法。這個方法會向 history 棧新增一個新的記錄,所以,當用戶點選瀏覽器後退按鈕時,則回到之前的 URL。
當你點選 <router-link> 時,這個方法會在內部呼叫,所以說,點選 <router-link :to="..."> 等同於呼叫 router.push(...)。
宣告式:<router-link :to="..."> 程式設計式:router.push(...) 該方法的引數可以是一個字串路徑,或者一個描述地址的物件。例如:
// 字串 router.push('home')
// 物件 router.push({ path: 'home' })
// 命名的路由 router.push({ name: 'user', params: { userId: 123 }})
// 帶查詢引數,變成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }}) 注意:如果提供了 path,params 會被忽略,上述例子中的 query 並不屬於這種情況。取而代之的是下面例子的做法,你需要提供路由的 name 或手寫完整的帶有引數的 path:
const userId = 123 router.push({ name: 'user', params: { userId }}) // -> /user/123 router.push({ path: `/user/${userId}` }) // -> /user/123 // 這裡的 params 不生效 router.push({ path: '/user', params: { userId }}) // -> /user 同樣的規則也適用於 router-link 元件的 to 屬性。例項:
import Vue from 'vue' import VueRouter from 'vue-router'
Vue.use(VueRouter)
const Home = { template: '<div>This is Home</div>' } const Foo = { template: '<div>This is Foo</div>' } const Bar = { template: '<div>This is Bar {{ $route.params.id }}</div>' }
const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', name: 'home', component: Home }, { path: '/foo', name: 'foo', component: Foo }, { path: '/bar/:id', name: 'bar', component: Bar } ] })
new Vue({ router, template: ` <div id="app"> <h1>Named Routes</h1> <p>Current route name: {{ $route.name }}</p> <ul> <li><router-link :to="{ name: 'home' }">home</router-link></li> <li><router-link :to="{ name: 'foo' }">foo</router-link></li> <li><router-link :to="{ name: 'bar', params: { id: 123 }}">bar</router-link></li> </ul> <router-view class="view"></router-view> </div> ` }).$mount('#app')
路由介紹就告一段落了,來看看檢視 命名檢視,有時候想同時(同級)展示多個檢視,而不是巢狀展示,例如建立一個佈局,有 sidebar(側導航) 和 main(主內容) 兩個檢視,這個時候命名檢視就派上用場了。你可以在介面中擁有多個單獨命名的檢視,而不是隻有一個單獨的出口。如果 router-view 沒有設定名字,那麼預設為 default。
<router-view></router-view> <router-view></router-view> 當我們的檢視如上時,我們會發現每一個路由被渲染了兩次,所以我們需要為檢視命名
<router-view name="a"></router-view> <router-view name="b"></router-view> var Foo = { template: '<div>foo</div>' } var Bar = { template: '<div>bar</div>' } var routes = [ { path:"/one", name:"one", components:{ a:Foo, b:Bar } }, ]