5.vue知识点vue router


在做单页面应用的时候很方便,可以在界面中定义的各种区域进行组件替换,每个路由应该对应一个组件

一、定义路由跳转的步骤

1.定义要跳转的组件

  • 组件:Foorouter
    • 代码
          <template>
              <div>
                  <div>
                      <div>this is foorouter</div>
                  </div>
              </div>
          </template>
      
  • 组件:Barrouter
    • 代码
          <template>
              <div>
                  <div>this is barrouter</div>
                  <p>username:{{username}}</p>
                  <button @click="goBack">回到上一层</button>
              </div>
          </template>
      
          <script>
              export default {
                  computed: {
                      username:function(){
                          // 我们很快就会看到 `params` 是什么
                          return 'Nelson'
                      }
                  },
                  methods: {
                      goBack() {
                      console.log("window.history:",window.history)
                      window.history.length > 1 ? this.$router.go(-1) : this.$router.push('/')
                      }
                  }
              }
          </script>
      

2.为组件定义路由(跳转路径)

  • 代码
        const routes = [
          { path: '/foorouter', component: Foorouter },
          { path: '/barrouter', component: Barrouter }
        ]
    

3.将定义好的路由作为参数创建router实例

  • 代码
        const router = new VueRouter({
            routes
        })
    

4.将创建的router实例挂载到app(根节点)上,在整个应用中都具有了这个路由功能

  • 代码
    router1

5.然后在页面定义路由出口,路由匹配到的组件会渲染在这个出口

  • 说明
    这里是默认的出口,还有命名视图,后面会介绍

  • 代码

        <p class="title">路由匹配到的组件将渲染在这里 ↓:</p>
        <router-view></router-view>
    
  • 效果
    router2

6.路由导航

  • 说明
    可以使用<router-link>定义导航链接,将路由导航传给to属性

  • 代码

        <router-link to="/foorouter">Go to Foo</router-link>
        <router-link to="/barrouter">Go to Bar</router-link>
    
  • 效果
    router4

二、动态路由匹配

1.使用动态路由参数(用’:'来标记参数)控制多个路径复用一个组件

  • 在一.2步骤中,定义一个动态路由
    router5

  • User组件

        <template>
            <div>
                <div>User</div>
                Hello {{$route.params.id}}
                <br>
                {{message}}
            </div>
        </template>
        <script>
            export default {
                watch:{
                    $route(to,from){
                        //对路由变化作出响应
                        console.log('From: '+from.path);
                        console.log('To: '+to.path);
                    }
                },
                computed:{
                    message:function(){
                        return '这是'+this.$route.params.id+'页面。'
                    }
                }
            }
        </script>
    
  • 在页面定义路由导航
    在两个导航中会分别把foorouter、barrouter作为参数匹配到.$route.params动态参数id中,在组件中可以使用this.$route.params调用 (如上面的User组件的massage计算属性中)

        <router-link to="/user/foorouter">Go to UserFoo</router-link>
        <router-link to="/user/barrouter">Go to UserBar</router-link>
    
  • 效果
    router6

2.路由优先级

  • 说明

    • 有时候一个路径会匹配多个路由,路由匹配会优先匹配第一个符合条件的路由
    • 在图中框起来的路径设置会匹配到任意链接,也就是后面所设置的都会失效,往往这种需要放到所有设置的最后,用来匹配其他默认情况(比如404提示页面)
  • 代码
    router7

3.对路由参数的变化作出响应

  • 说明
    可以简单地 watch (监测变化) $route 对象
    比如 1 中定义的User组件定义了响应方法,当外部页面点击两个链接,路径会变化,从而执行对应方法

  • 代码
    router8

  • 效果
    router9

三、嵌套路由

  • 说明
    就是在路由的组件内部再定义路由出口,内部的路径需要在children属性中定义,注意不要加/ ,因为/代表根路径,定义内部路由的时候需要在外部路由的基础上定义相对匹配路径

  • 代码

    • 嵌套路由定义
      router10
    • 外部组件:NestComponent
      内部定义了路由出口
          <template>
              <div>
                <h2>NestComponent: {{ $route.params.nestID }}</h2>
                <router-view></router-view>
              </div>
          </template>
      
    • 内部嵌套组件:NestUser
          <template>
              <div>
                  <div>Nest-User</div>
                  Hello {{$route.params.nestID}}
                  <br>
                  嵌套内部的组件NestUser
              </div>
          </template>
      
          <script>
              export default {
      
              }
          </script>
      
    • 内部嵌套组件:NestUserAdmin
          <template>
              <div>
                  <div class="notice">Nest-UserAdmin</div>
                  Hello {{$route.params.nestID}}
                  <div class="notice">嵌套内部的组件NestUserAdmin</div>
              </div>
          </template>
      
          <script>
              export default {
                  watch:{
                      $route(to,from){
                          //对路由变化作出响应
                          console.log('From: '+from.path);
                          console.log('To: '+to.path);
                      }
                  }
              }
          </script>
          <style>
              .notice{
                  color: red;
                  font-size: 30px;
              }
          </style>
      
  • 效果
    router11

  • 注意
    上面代码中内部组件监听$route变化是不起作用的,需要在外部组件监听。

四、编程式导航

1.push

  • 说明

    • 通过 $router.push(location) 方法,往window.history中添加跳转
    • window.history中记录了页面的跳转记录,所以可以通过 this.$router.go(n) 实现回退(n为负值)和前进n步的页面跳转
  • 代码

        <button v-on:click='addRouterItem'>编程式导航:push跳转路由信息</button>
    
        addRouterItem:function(){
            const userid='TurnTo'
            this.$router.push({path:`/Nest/${userid}/user`})
            console.log('Success Turn To Router Item')
        },
    
  • 效果
    router21
    router12

    还可以用 this.$router.push({ name: ‘user’, params: { userId: ‘123’ }}) 的形式来访问user/123页面,当有path的时候,params参数失效

2.replace

  • 说明
    replace和push功能类似,但是注意它是直接替换window.history中这个当前的记录,而不是在window.history中添加,所以在使用this.$router.go()方法时 后退不会回到刚才的页面

  • 效果
    router13
    如图,在第三个页面的时候直接点击页面返回按钮,则回到的是第一次的页面

五、命名路由

  • 代码
    • 定义路径和路由名useridrouter
      router14
          <button v-on:click='GoNamedRouterItem'>跳转命名路由信息</button>
      
    • 定义跳转方法
          GoNamedRouterItem:function(){
              this.$router.push({name:'useridrouter'})
            }
      
  • 效果
    router15

六、命名视图

未命名的<router-view>默认名为default

1.一般命名视图

  • 说明
    可以同时展示多个视图,每个视图对应一个组件,如果想要控制哪个命名视图解耦合必须为每个视图设置prop
  • 代码
    • 在路由列表中添加
          { 
              path:'/multiview/',
              components:{
              viewone:ViewOneComp,
              viewtwo:ViewTwoComp,
              viewthree:ViewThreeComp
              }
          }
      
    • 在页面上定义三个命名视图viewone、viewtwo、viewthree
          <div class="title">-----------------测试多视图-----------------</div>
          <button v-on:click='GoToMultiRouters'>跳转到命名(多)视图</button>
          <button v-on:click='HideMultiRouters'>隐藏命名(多)视图</button>
          <router-view name="viewone"></router-view>
          <router-view name="viewtwo"></router-view>
          <router-view name="viewthree"></router-view>
      
  • 效果
    router16

2.嵌套命名多视图

  • 说明
    其实就是在嵌套视图的基础上,显示多个命名子视图,其中未命名的视图名称默认为default
  • 代码
    • 页面内容
          <template>
              <div>
                  <h1>显示嵌套命名()视图</h1>
                  <button v-on:click="ShowEmailView">显示Email视图</button>
                  <button v-on:click="ShowProfileView">显示Profile视图</button>
                  <router-view></router-view>
                  <router-view name="helper"></router-view>
              </div>
          </template>
      
          <script>
              export default {
                  methods:{
                      ShowEmailView:function(){
                          this.$router.push('/settings/emails');
                      },
                      ShowProfileView:function(){
                          this.$router.push('/settings/profile');
                      }
                  }
              }
          </script>
      
    • 在路由列表中定义路由
          {
              path:'/settings/',
              component:UserSettings,
              children:[{
              path:'emails',
              component:UserSettingEmail
              },{
              path:'profile',
              components:{
                  default:UserSettingProfile,
                  helper:UserSettingProfilePreview
              }
              }]
          },
      
  • 效果
    router17

七、重定向与别名

1.静态重定向

  • 代码
        GoToRedirectFoo:function(){
            this.$router.push('/tempTofoorouter')
        },
    
    在路由路径为/tempTofoorouter设置重定向路径:
        { path:'/tempTofoorouter',redirect:'/foorouter'},
    
  • 效果
    router18

2.动态重定向

  • 代码
    在routes路由设置中redirect传入一个函数,返回重定向路径,其中to是包含目的路径的对象

        { path:'/user',redirect:to=>{
                console.log("to:",to)
                return to.path+'/nel'
            }
        },
    

    函数中可以定义怎么对原目的路径进行处理,返回新的路径。

        GoToRedirectBar:function(){
            this.$router.push('/user')
        },
    
  • 效果
    router19

3.别名

  • 说明
    在路由设置中使用alias属性设置
  • 代码
        { path:'/foorouter',component:Foorouter,alias:'/aliasfoo'}
    
  • 注意别名和重定向的区别
    • 重定向:/a重定向到/b,显示/b对应的组件,URL也发生变化
    • 别名:/a 别名为 /b 当访问/a,/b时都对应同一组件,URL也分别是/a,/b;不会因为访问/a而发生URL变化

八、路由组件传参

  • 说明
    使用 props 将组件和路由解耦可以向路由组件传递prop

  • 代码

    • 当组件路由设置中 属性props设置为true,$route.params全部变成组件属性
          { path: '/user/:id/:message', component: User,props:true}
      
    • 在组件中就可以不用再使用this.$route.params调用属性了,而是通过props传值的形式将$route.params里面的值作为属性使用
          <template>
              <div>
                  <div>User</div>
                  Hello {{id}}
                  <br>
                  {{message}}
              </div>
          </template>
          <script>
              export default {
                  props:['id','message'],
              }
          </script>
      
    • 使用组件
          <router-link to="/user/foorouter/这是通过props传递param的页面">Go to UserFoo</router-link>
      
  • 效果
    router20

参考

Vue Router官方文档

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值