Vue.js 路由
本章節我們將爲大家介紹 Vue.js 路由。
Vue.js 路由允許我們通過不同的 URL 訪問不同的內容。
通過 Vue.js 可以實現多視圖的單頁Web應用(single page web application,SPA)。
Vue.js 路由需要載入 vue-router 庫
中文文檔地址:vue-router文檔。
安裝
1、直接下載 / CDN
https://unpkg.com/vue-router/dist/vue-router.js
NPM
推薦使用淘寶鏡像:
cnpm install vue-router
簡單實例
Vue.js + vue-router 可以很簡單的實現單頁應用。
<router-link> 是一個組件,該組件用於設置一個導航鏈接,切換不同 HTML 內容。 to 屬性爲目標地址, 即要顯示的內容。
以下實例中我們將 vue-router 加進來,然後配置組件和路由映射,再告訴 vue-router 在哪裏渲染它們。代碼如下所示:
<body>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用router-link路由組件來導航 -->
<router-link to="/foo"> To Foo</router-link>
<router-link to="/bar"> To Bar</router-link>
</p>
<!-- 路由出口 路由匹配到的組件都會渲染到這裏 -->
<router-view></router-view>
</div>
<script>
// 0.如果要使用模塊化編程機制,引入Vue及Router,則需要調用Vue.ues(Router)
// 1.定義路由組件 可以從其它文件中import進來
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 2.定義路由
// 每個路由應該映射一個組件,其中"component"可以是
// 通過Vue.extend()創建組件構造器
// 或者 只是一個配置對象
const routes = [
{ path: "/foo", component: Foo },
{ path: "/bar", component: Bar }
]
// 3.創建router實例 傳入路由
const router = new VueRouter({
routes
})
// 4.創建個掛載根實例
// 記得要通過router注入參數配置路由
// 從而讓整個應用有路由功能
const app = new Vue({
router
}).$mount('#app')
</script>
</body>
點擊過的導航鏈接都會加上樣式 class ="router-link-exact-active router-link-active"。
<router-link> 相關屬性
接下來我們可以瞭解下更多關於 <router-link> 的屬性。
to
表示目標路由的鏈接。 當被點擊後,內部會立刻把 to 的值傳到 router.push(),所以這個值可以是一個字符串或者是描述目標位置的對象。
<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染結果 -->
<a href="home">Home</a>
<!-- 使用 v-bind 的 JS 表達式 -->
<router-link v-bind:to="'home'">Home</router-link>
<!-- 不寫 v-bind 也可以,就像綁定別的屬性一樣 -->
<router-link :to="'home'">Home</router-link>
<!-- 同上 -->
<router-link :to="{ path: 'home' }">Home</router-link>
<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
<!-- 帶查詢參數,下面的結果爲 /register?plan=private -->
<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>
replace
設置 replace 屬性的話,當點擊時,會調用 router.replace() 而不是 router.push(),導航後不會留下 history 記錄。
<router-link :to="{ path: '/abc'}" replace></router-link>
append
設置 append 屬性後,則在當前 (相對) 路徑前添加基路徑。例如,我們從 /a 導航到一個相對路徑 b,如果沒有配置 append,則路徑爲 /b,如果配了,則爲 /a/b
<router-link :to="{ path: 'relative/path'}" append></router-link>
tag
有時候想要 <router-link>
渲染成某種標籤,例如 <li>
。 於是我們使用 tag
prop 類指定何種標籤,同樣它還是會監聽點擊,觸發導航。
<router-link to="/foo" tag="li">foo</router-link>
<!-- 渲染結果 -->
<li>foo</li>
active-class
設置 鏈接激活時使用的 CSS 類名。可以通過以下代碼來替代。
<style>
._active{
background-color : red;
}
</style>
<p>
<router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1</router-link>
<router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>
注意這裏 class 使用 active_class="_active"。
exact-active-class
配置當鏈接被精確匹配的時候應該激活的 class。可以通過以下代碼來替代。
<p>
<router-link v-bind:to = "{ path: '/route1'}" exact-active-class = "_active">Router Link 1</router-link>
<router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>
event
聲明可以用來觸發導航的事件。可以是一個字符串或是一個包含字符串的數組。
<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>
以上代碼設置了 event 爲 mouseover ,及在鼠標移動到 Router Link 1 上時導航的 HTML 內容會發生改變。