Vue Router

前端路由尝鲜

  • 前端路由是依靠hash值(锚链接)实现的

  • 下面我们就来实现一个简单的前端路由效果

实现效果:就是一个Tab栏切换效果

  • 我们有两个区域,一个区域放置我们的按钮,

  • 另一个区域根据按钮的变化展示不用的内容

 

 

  • 页面理解

  • 在页面中有三个按钮,这三个按钮点击触发修改本页的hash

  • 通过window.onhashchange函数,监听hash值的变化,一旦变化,就修改vm中comName的值

  • vm中的comName的值一旦被修改,<component>标签中的is属性也会随着变动,然后就会去在家我们在vm中注册的组件,显示不同的组件在页面中

三分钟初识 Vue Router

都是Vue全家桶,怎么能少了Vue Router呢,它就是Vue官方提供的前端路由器,这里需要注意的就是,这个路由器依赖Vue.js,所有在引入依赖时,得放在vue.js后面

  • 下面我们来实现一个简单的Vue Router案列

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <!-- 第一步,相关依赖-->
        <script src="../js/vue.js"></script>
        <script src="../js/vue-router_3.0.2.js"></script>
    </head>
    <body>
        <div id="app">
            <!-- 第二步:添加特制的路由标签 <router-link> -->
            <!-- 渲染时,也会被渲染成a标签,to属性默认被渲染为href属性 -->
            <router-link to='/user'>User</router-link>
            <router-link to='/login'>Login</router-link>
            <!-- 第三步:添加路由占位符 ,也就是待会显示组件的位置-->
            <router-view></router-view>
        </div>
        <script type="text/javascript">
            // 第四步,定义我们需要的路由组件
            var User = {
                template: `<div>用户界面</div>`
            };
            var Login = {
                template: `<div>登陆界面</div>`
            };
            // 第五步:创建路由规则,并创建路由实列
            var MyRouter = new VueRouter({
              //5.1 routes是一个规则数组,一个对象代表一个路由
              //path:路由匹配的hash地址,component:对应要展示的组件对象
                routes: [{
                    path: '/user',
                    component: User
                }, {
                    path: '/login',
                    component: Login
                }]
            });
            new Vue({
                el: '#app',
                // 最后一步:将路由挂载到Vue的实列当中
                router: MyRouter
            })
        </script>
    </body>
    </html>

vue-router的嵌套路由

  • 顾名思义就是A页面点击后显示B组件,B组件中又有点击显示B组件内的子组件C

  • 这里涉及到VueRouter实列中routes数组内部对象的一个children属性

  • children属性的值同 routes数组中的对象一直,嵌套就是这么嵌套起的

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <script src="../js/vue.js"></script>
 <script src="../js/vue-router_3.0.2.js"></script>
</head>
<body>
 <div id="app">
     <router-link to='/user'>用户信息展示页面</router-link>
     <router-view></router-view>
 </div>
 <script type="text/javascript">
     var User = {
         template: `
             <div>
                 <router-link to='/user/add'>增加一个用户</router-link>
                 <router-link to='/user/del'>删除一个用户</router-link>
                 <router-view></router-view>
             </div>
         `
     };
     //Demo需要的两个组件,一个代表新增用户界面,一个删除用户界面
     var UserAdd = {
         template: '<div>添加一个用户页面,请填写用户相关信息</div>'
     };
     var UserDel = {
         template: '<div>删除一个用户页面,请确认是否删除该用户</div>'
     };
     var MyRouter = new VueRouter({
         // redirect:路由重定向修改/ 为 /user
         routes: [{
             path: '/',
             redirect: '/user'
         }, {
             path: '/user',
             component: User,
             children: [{
                 path: '/user/add',
                 component: UserAdd
             }, {
                 path: '/user/del',
                 component: UserDel
             }]
         }]
     });
     new Vue({
         el: '#app',
         router: MyRouter,
     })
 </script>
</body>
</html>

vue-router的动态路由匹配

  • 有这样一个场景,根据用户id查询用户信息,并渲染该用户的详细信息到页面

  • 每一个用户的id都是不同的,可是我们套用的组件模版是一个

  • 我们不可能单独为一个用户创建一个路由规则吧,动态路由一键搞定

  • 动态路由就涉及到一个传值问题,下面我们唠叨唠叨

  • 第一种传值方式已经在上面一个案列中演示了,点名不够优雅,遂弃之

动态路由传值:props=true

  • 在上一个列子中,有说到取值不优雅的问题,下面我们解决这个问题

动态路由传值:props为函数类型

  • 在上一个列子中,我们解决了传值不够优雅的问题,但是这种也有一定的局限,比如说我们传递多个值怎么办,这种场景是很常见,那就是传递一个函数

动态路由传值:props对象类型

  • 为什么这个要放到最后来说呢,不是以为它最重要,而是我懒,因为这种方式和上一中方式大径相同,但是缺点也很明显,相对上面的函数类型,对象类型不能 获取动态路由传递过来的值,比如那个id,我们就不能传递过去,只能传递其他源来的值

//其他不做改变,就变动这里,函数类型中有个route参数可以获取路由而来的值
//这个无法获取路由对象
props: {
id: '1',
uname: '李四',
sex: '女性'
}

命名路由

  • 命名路由顾名思义就是给路由起一个名字,然后可以使用别名,具体见下

编程式导航

  • 页面导航的两种方式

  • 声明式导航:通过点击链接实现导航的方式,比如a标签,Vue的router-link标签

  • 编程式导航:调用js形式的api方式,比如localtion.href

  • 解释哈

  • 开局两个按钮,一个没账户路由到注册页面,一个有账户路由到登陆后的页面

  • 路由注册页面后,使用编程式导航提供回退到登陆页面的按钮

  • 路由到登陆成功页面后,会完成在登陆页面的数据传递到登陆成功页面,并显示,其中使用编程式导航改变路由实现,基本方式都有详写

.

posted @ 2019-03-06 13:20  鞋破露脚尖儿  阅读(285)  评论(0编辑  收藏  举报