1. 程式人生 > >vue-router菜鳥進階!(巢狀路由VS命名路由)

vue-router菜鳥進階!(巢狀路由VS命名路由)

巢狀路由

一個被渲染元件可以包含自己的巢狀< router-view >。

在巢狀的出口中渲染元件,需要在VueRouter的引數中使用children配置:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<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>
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: [ // UserHome will be rendered inside User's <router-view> // when /user/:id is matched { path: '', component: UserHome }, // UserProfile will be rendered inside User's <router-view> // when /user/:id/profile is matched { path: 'profile', component: UserProfile }, // UserPosts will be rendered inside User's <router-view> // when /user/:id/posts is matched { path: 'posts', component: UserPosts } ] } ] }) const app = new Vue({ router }).$mount('#app')

要注意,以 / 開頭的巢狀路徑會被當作根路徑。 這讓你充分的使用巢狀元件而無須設定巢狀的路徑。

命名路由

有時候,通過一個名稱來標識一個路由顯得更方便一些,特別是在連結一個路由,或者是執行一些跳轉的時候。可以在建立Router例項的時候,在routes配置中給某個路由設定名稱。

const router = new VueRouter({
    routes: [
        {
            path: '/user/:user:id',
            name: 'user',
            component: User
        }
    ]
})

要連結到一個命名路由,可以給router-link的to屬性傳一個物件:

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

跟程式碼呼叫 router.push()是一回事:

router.push({ name: 'user', params: { userId: 123 }})

這兩種方式都會把路由導航到/user/123路徑。

For example:

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', 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')