vue学习七:vue路由

什么是路由

后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;

前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;

在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);

vue-router的基本使用

安装 vue-router 路由模块:

直接下载 / CDN 

<script src="./lib/vue-router-2.7.0.js"></script>

创建组件的模板对象:

var login = {
  template: '<h1>登录组件</h1>'
}

var register = {
  template: '<h1>注册组件</h1>'
}

创建一个路由对象:

当 导入 vue-router 包之后,在 window 全局对象中,就有了一个 路由的构造函数,叫做 VueRouter

拿到url以后要进行路由规则的匹配

var routerObj = new VueRouter({
  routes: [ // 路由匹配规则 
    // 每个路由规则,都是一个对象,这个规则对象,身上,有两个必须的属性:
    //  属性1 是 path, 表示监听 哪个路由链接地址;
    //  属性2 是 component, 表示,如果 路由是前面匹配到的 path ,则展示 component 属性对应的那个组件
    // 注意: component 的属性值,必须是一个 组件的模板对象, 不能是 组件的引用名称;
    // { path: '/', component: login },
    { path: '/', redirect: '/login' }, // 这里的 redirect 和 Node 中的 redirect 完全是两码事
    { path: '/login', component: login },
    { path: '/register', component: register }
  ],
  // linkActiveClass默认值是router-link-active,可以修改为自己定义的类名
  linkActiveClass: 'myactive'
})

将路由规则对象注册到 vm 实例上:

用来监听 URL 地址的变化,然后展示对应的组件

var vm = new Vue({
  el: '#app',
  data: {},
  methods: {},
  router: routerObj 
});

vm实例挂载位置:

<div id="app">

  <!-- <a href="#/login">登录</a> -->
  <!-- <a href="#/register">注册</a> -->

  <!-- router-link 默认渲染为一个a 标签 -->
  <router-link to="/login" tag="span">登录</router-link>
  <router-link to="/register">注册</router-link>


  <!-- 这是 vue-router 提供的元素,专门用来 当作占位符的,将来,路由规则,匹配到的组件,就会展示到这个 router-view 中去 -->
  <!-- 所以: 我们可以把 router-view 认为是一个占位符 -->
  <transition mode="out-in">
    <router-view></router-view>
  </transition>

</div>

切换动效及router-link样式:

.router-link-active,
.myactive {
  color: red;
  font-weight: 800;
  font-size: 80px;
  text-decoration: underline;
  background-color: green;
}

.v-enter,
.v-leave-to {
  opacity: 0;
  transform: translateX(140px);
}

.v-enter-active,
.v-leave-active {
  transition: all 0.5s ease;
}

效果:

路由传参:

使用query方式传递参:

如果在路由中,使用 查询字符串,给路由传递参数,不需要修改 路由规则的 path 属性

<div id="app">
  <router-link to="/login?id=10&name=zs">登录</router-link>
  <router-link to="/register">注册</router-link>

  <router-view></router-view>
</div>

创建组件的模板对象:

var login = {
  template: '<h1>登录 --- {{ $route.query.id }} --- {{ $route.query.name }}</h1>',
  data(){
    return {
      msg: '123'
    }
  },
  created(){ // 组件的生命周期钩子函数
    // console.log(this.$route)
    // console.log(this.$route.query.id)
  }
}

var register = {
  template: '<h1>注册</h1>'
}

创建一个路由对象:

var router = new VueRouter({
  routes: [
    { path: '/login', component: login },
    { path: '/register', component: register }
  ]
})

将路由规则对象注册到 vm 实例上:

// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
  el: '#app',
  data: {},
  methods: {},
  // router: router
  router
});

使用params方式传递:

修改上面的部分代码

vm实例挂载位置:

  <div id="app">
    <router-link to="/login/12/ls">登录</router-link>
    <router-link to="/register">注册</router-link>

    <router-view></router-view>
  </div>

登录组件的模板对象:

var login = {
  template: '<h1>登录 --- {{ $route.params.id }} --- {{ $route.params.name }}</h1>',
  data(){
    return {
      msg: '123'
    }
  },
  created(){ // 组件的生命周期钩子函数
    // console.log(this.$route.params.id)
  }
}

修改匹配规则:

var router = new VueRouter({
  routes: [
    { path: '/login/:id/:name', component: login },
    { path: '/register', component: register }
  ]
})

路由的嵌套:

vm实例挂载位置:

<div id="app">

  <router-link to="/account">Account</router-link>

  <router-view></router-view>

</div>

组件模板:

<template id="tmpl">
  <div>
    <h1>这是 Account 组件</h1>

    <router-link to="/account/login">登录</router-link>
    <router-link to="/account/register">注册</router-link>

    <router-view></router-view>
  </div>
</template>

组件的模板对象:

var account = {
  template: '#tmpl'
}

var login = {
  template: '<h3>登录</h3>'
}

var register = {
  template: '<h3>注册</h3>'
}

创建一个路由对象:

var router = new VueRouter({
  routes: [
    {
      path: '/account',
      component: account,
      // 使用 children 属性,实现子路由,同时,子路由的 path 前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户去理解URL地址
      children: [
        { path: 'login', component: login },
        { path: 'register', component: register }
      ]
    }
    //路由不是这么嵌套的
    // { path: '/account/login', component: login },
    // { path: '/account/register', component: register }
  ]
})

创建一个vm实例:

var vm = new Vue({
  el: '#app',
  data: {},
  methods: {},
  router
});

效果:

命名视图

vm实例挂载位置:

  <div id="app">
    <!-- 无命名放默认组件 -->
    <router-view></router-view>
    <div class="container">
      <!-- 放left对应的组件 -->
      <router-view name="left"></router-view>
      <!-- 放main对应的组件 -->
      <router-view name="main"></router-view>
    </div>

  </div>

模板对象:

var header = {
  template: '<h1 class="header">Header头部区域</h1>'
}

var leftBox = {
  template: '<h1 class="left">Left侧边栏区域</h1>'
}

var mainBox = {
  template: '<h1 class="main">mainBox主体区域</h1>'
}

创建路由对象:

    var router = new VueRouter({
      routes: [
        /* 
        { path: '/', component: header },
        { path: '/left', component: leftBox },
        { path: '/main', component: mainBox }
        */


        {
          path: '/', components: {
            'default': header,
            'left': leftBox,
            'main': mainBox
          }
        }
      ]
    })

vm实例:

var vm = new Vue({
  el: '#app',
  data: {},
  methods: {},
  router
});

效果:

使用编程式导航:

template:

<div class="mui-card-footer">
    <mt-button type="primary" size="large" plain @click="goDesc(id)">图文介绍</mt-button>
    <mt-button type="danger" size="large" plain @click="goComment(id)">商品评论</mt-button>
</div>

script:

goDesc(id) {
      // 点击使用编程式导航跳转到 图文介绍页面
      this.$router.push({ name: "goodsdesc", params: { id } });
},
goComment(id) {
      // 点击跳转到 评论页面
      this.$router.push({ name: "goodscomment", params: { id } });
}

router.js添加路由匹配规则:

{ path: '/home/goodsdesc/:id', component:GoodsDesc, name: 'goodsdesc'  },
{ path: '/home/goodscomment/:id', component: GoodsComment, name: 'goodscomment' }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值