学习Vue-router

2018-03-15  本文已影响0人  都江堰古巨基

趁着放假的时间,继续撸Vue全家桶,感觉很炫酷,和以前用过的系统完全不一样,撸了Vue之后撸一下Vue的路由配置管理工具:Vue-router。
类比Django来学习,在Django中定义路由通常是定义在url.py文件里面,然后在模板中使用{{ url }}的标签,进行路由指定。
而在Vue中主要使用的Vue-router这个插件:
现在主要实现的功能是动态跳转,即url改变,但页面只是部分改变。

# 静态的路由 :
<!DOCTYPE html>
<html>
  <head>
    <title>Vue-router</title>
    <script type="text/javascript" src="https://unpkg.com/vue/dist/vue.js"></script>
    <script type="text/javascript" src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
        <h1>Hello Vue-router!</h1>
        <p>
            <router-link to='/user/twy'>twy</router-link>
            <router-link to='/user/dw'>dw</router-link>
        </p>
        # 路由渲染的内容都是在<router-view>标签中实现的:
        <router-view></router-view>
    </div>
    <script>
        # 定义渲染的模板:
        const twy = { template:'<div>This is twy !!!</div>' }
        const dw  = { template:'<div>This is dw !!!</div>' }
        # 定义渲染的路径及对应组件,如:url为host/twy时渲染twy组件
        const routes = [
            { path:'/twy',component:twy },
            { path:'/dw', component:dw }
         ]
        # 这里是初始化Vue-router插件的
        const router = new VueRouter({
            routes
        })
        # 将Vue-router初始化在app上
        const app = new Vue({
            router
        }).$mount('#app')
    </script>
  </body>
</html>

动态路由

可以根据不同的path在<router-view>渲染出不同的内容

<!DOCTYPE html>
<html>
  <head>
    <title>Vue-router</title>
    <script type="text/javascript" src="https://unpkg.com/vue/dist/vue.js"></script>
    <script type="text/javascript" src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
        <h1>Hello Vue-router!</h1>
        <p>
            <router-link to='/user/twy'>twy</router-link>
            <router-link to='/user/dw'>dw</router-link>
        </p>
        <router-view></router-view>
    </div>
    <script>
        const User = {
            # 这里相当于定义路由渲染出来的模板为 This is User + <router-link>标签的内容
            template:'<div>This is User{{ $route.params.id }}</div>'
        }

        const router = new VueRouter({
            routes:[
           # 这里定义出渲染的路径:id相当于是上面的params.id
                { path:'/user/:id',component:User}
            ]
        })

        const app = new Vue({
            router
        }).$mount('#app')
    </script>
  </body>
</html>

嵌套路由:

在一个被渲染出的组件中,再在这个组件里渲染这个组件里面的路由组件

<!DOCTYPE html>
<html>
<head>
    <title>嵌套路由</title>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
    <div id="app">
        <router-link to="/car/brand/honda">honda</router-link>
        <router-link to="/car/brand/toyota">toyota</router-link>
        <router-link to="/car/brand"></router-link>
        <router-view></router-view>
    </div>
    <script>
        # 这里定义的是/car/:name渲染的内容,如直接访问这个地址,则先渲染出Car组件再根据children的path渲染出CarHome组件。
        const Car = {
            template:`
                <div class="car">
                    <h2>CAR {{ $route.params.name }}</h2>
                    <router-view></router-view>
                </div>
            `
        }

        const CarHonda  = {
            template: '<div>This is CarHonda!!!</div>'
        }
        const CarToyota = {
            template: '<div>This is CarToyota!!!</div>'
        }
        const CarHome = {
            template: '<div>Home</div>'
        }

        # 这里定义不同嵌套的路由渲染不同组件:
        const router = new VueRouter({
            routes:[
                { path:'/car/:name',component: Car, 
                  children:[
                    {
                        path:'honda',
                        component: CarHonda
                    },
                    {
                        path:'toyota',
                        component:CarToyota
                    },
                    {
                        path:'',
                        component:CarHome
                    }
                  ]
                }
            ]
        })

        const app = new Vue({
            router
        }).$mount('#app')

    </script>

    <style>
        .car{
            color: skyblue;
            font-size: 24px;
        }
    </style>
</body>
</html>

命名路由

这个功能可以将路由命名

<div id="app">
    # 注意命名的位置和格式!
    <router-link :to="{ name:'user', params:{ userId: 123 }}">User</router-link>
    <router-view></router-view>
</div>
const router = new VueRouter({
    routes:[
        {
            path:'/user/:userId',
            # 注意命名的位置和格式
            name:'user',
            component:User
        }
    ]
})

命名视图

有时候我们需要渲染多个视图,这时候我们就需要对每个视图进行命名渲染

# 命名视图和嵌套路由一起使用的例子:
<div id="app">
  <h1>Named Views</h1>
  <ul>
    <li>
        <router-link to="/car/brand/honda">honda</router-link>
    </li>
    <li>
        <router-link to="/car/brand/toyota">toyota</router-link>
    </li>
    <li>
        <router-link to="/car/brand/">home</router-link>
    </li>
  </ul>
  <router-view></router-view>
</div>
<script>
    const honda  = { template: '<div>honda</div>' }
    const toyota = { template: '<div>toyota</div>' }
    const benz   = { template: '<div>benz</div>' }

    const Car = {
        template:`
            <div>
                <h2>Car {{ $route.params.name }}</h2>
                <router-view class="view one"></router-view>
                <router-view class="view two" name="a"></router-view>
                <router-view class="view three" name="b"></router-view>
            </div>
        `
    }

    const router = new VueRouter({
        routes: [
            { path: '/car/:name', component: Car,
    
                children:[
                    {
                        path:'honda',
                        components: {
                            default:honda,
                            a:toyota,
                            b:benz
                        }
                    },
                    {
                        path:'toyota',
                        components: {
                            default:benz,
                            a:toyota,
                            b:honda
                        }
                    },
                    {
                        // 定义空路由不渲染子组件
                        path:'',
                    }
                ]
            }
        ]
    })

    new Vue({
        router,
        el: '#app'
    })
</script>

向路由组件传递props、重定向

在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性。
使用 props 将组件和路由解耦:

// 通过 props 解耦
const Car = {
    props:['name'],
    template:`
        <div>
            <h2>Car {{ name }}</h2>
            <router-view class="view one"></router-view>
            <router-view class="view two" name="a"></router-view>
            <router-view class="view three" name="b"></router-view>
        </div>
    `
}

const router = new VueRouter({

  routes: [
    { path: '/car/:name', component: Car, props:true,

        children:[
            {
                path:'honda',
                components: {
                    default:honda,
                    a:toyota,
                    b:benz
                },
                props:{ default:true,a:false,b:false }
            },
            {
                path:'toyota',
                components: {
                    default:benz,
                    a:toyota,
                    b:honda
                },
                props:{ default:true,a:false,b:false }
            },
            {
                // 定义空路由不渲染子组件
                path:'',
            }
        ]
    },
    // 这里是进行redirect设置:即访问'/a/b'这个路由就会跳转到'/car/brand/honda'下:
    // 访问'/t'这个路由就会跳转到'/a/b'这个路由下,然后在跳转到'/car/brand/honda'下:
    {
        path:'/a/b',redirect:'/car/brand/honda',
        name:'toyota2',
    },
    {  path: '/t', redirect: { name: 'toyota2' }}
  ]
})

上一篇下一篇

猜你喜欢

热点阅读