26.Vue Router路由组件传参

  我们点击路由的时候,经常需要传递参数,路由组件传参分为param和query传参两种方式;

  我们分别来学习下;

  首先我开发了两个服务接口:

  http://localhost:81/student/list 获取所有学生信息接口

  返回:

{"ret":1,"studentList":[{"id":1,"name":"张三","age":20,"grade":"一年级"},{"id":2,"name":"李四","age":25,"grade":"二年级"},{"id":3,"name":"王五","age":21,"grade":"三年级"}]}

  http://localhost:81/student/findById?id=1 获取指定Id的学生信息

  返回:

{"ret":1,"student":{"id":1,"name":"张三","age":20,"grade":"一年级"}}

  需求:

  我们再搞个 学生信息菜单,点击显示所有学生信息,然后在点击学生,显示当前学生的相信信息;

  这时候,就需要路由传参了,我们点击路由的时候,需要带一个id过去;

  先把学生信息组件Menu2.vue搞下:

<template>
  <div>
    学生信息列表
  </div>
</template>

<script>
    export default {
        name: "Menu2"
    }
</script>

<style scoped>

</style>

  router/index.js修改下,增加Menu2的路由跳转

/*
路由器模块
 */
import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from '../pages/Index'
import Menu1 from '../pages/Menu1'
import SubMenu1 from '../pages/SubMenu1'
import SubMenu2 from '../pages/SubMenu2'
import Menu2 from '../pages/Menu2'
Vue.use(VueRouter)
export default new VueRouter({
  // 多个路由
  routes:[
    {
      path:'/index',
      component:Index
    },
    {
      path:'/menu1',
      component:Menu1,
      children:[
        {
          path:'/menu1/subMenu1',
          component:SubMenu1
        },
        {
          path:'subMenu2',  // 简化写法 类似 /menu1/subMenu2
          component:SubMenu2
        },
        {
          path:'',
          redirect: '/menu1/subMenu1'
        }
      ]
    },
    {
      path:'/Menu2',
      component:Menu2
    },
    {
      //默认访问
      path:'/',
      redirect:'/index'
    }
  ]
})

  App.vue中也修改,增加学生信息菜单

<template>
  <div>
    <div class="menu">
      <ul>
        <li>
          <!--<a href="">首页</a>-->
          <router-link to="/index">首页</router-link>
        </li>
        <li>
          <!--<a href="">菜单1</a>-->
          <router-link to="/menu1">菜单1</router-link>
        </li>
        <li>
          <!--<a href="">学生信息</a>-->
          <router-link to="/menu2">学生信息</router-link>
        </li>
      </ul>
    </div>
    <div class="content">
      <keep-alive>
      <router-view></router-view>
      </keep-alive>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'App',
  }
</script>

<style scoped>

  ul li{
    float:left;
    padding-left: 20px;
    list-style-type: none;
  }

  ul li a{
    text-decoration: none;
  }

  .content{
    clear: both;
    padding: 20px;
  }
</style>

在这里插入图片描述
  我们在网页加载的时候mounted勾子里 ajax获取数据,然后v-for遍历,直接路径上带上id参数

<template>
  <div>
    学生信息列表
    <ul>
      <li v-for="(student,index) in students" :key="student.id">
        <router-link :to="`/menu2/subMenu3/${student.id}`">{{student.name}}</router-link>
      </li>
    </ul>
    <hr/>
    <router-view></router-view>
  </div>
</template>

<script>
  import axios from 'axios'
    export default {
        name: "Menu2",
        data(){
          return{students:[]}
        },
        mounted() {
          let url='http://localhost:81/student/list';
          axios.get(url).then(response=>{
            console.log(response.data)
            let data=response.data;
            if(data.ret==1){
              this.students=data.studentList;
            }
          }).catch(error=>{
            console.log(error)
          })
        }
    }
</script>

<style scoped>

</style>

在这里插入图片描述
  router/index.js里配置下路由,路由中携带参数id:

/*
路由器模块
 */
import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from '../pages/Index'
import Menu1 from '../pages/Menu1'
import SubMenu1 from '../pages/SubMenu1'
import SubMenu2 from '../pages/SubMenu2'
import Menu2 from '../pages/Menu2'
import SubMenu3 from '../pages/SubMenu3'
Vue.use(VueRouter)
export default new VueRouter({
  // 多个路由
  routes:[
    {
      path:'/index',
      component:Index
    },
    {
      path:'/menu1',
      component:Menu1,
      children:[
        {
          path:'/menu1/subMenu1',
          component:SubMenu1
        },
        {
          path:'subMenu2',  // 简化写法 类似 /menu1/subMenu2
          component:SubMenu2
        },
        {
          path:'',
          redirect: '/menu1/subMenu1'
        }
      ]
    },
    {
      path:'/Menu2',
      component:Menu2,
      children: [
        {
          path:'subMenu3/:id',
          component:SubMenu3
        }
      ]
    },
    {
      //默认访问
      path:'/',
      redirect:'/index'
    }
  ]
})

  新建一个嵌套路由SubMenu3.vue

<template>
  <div>
    Id:{{$route.params.id}}<br/>
    {{student.name}}<br/>
    {{student.age}}<br/>
    {{student.grade}}<br/>
  </div>
</template>

<script>
  import axios from 'axios'
    export default {
        name: "SubMenu3",
      data(){
        return{
          student:{}
        }
      },
      mounted() {
        let id=this.$route.params.id
        let url= 'http://localhost:81/student/findById?id=${id}'
        axios.get(url).then(response=>{
          console.log(response.data)
          let data=response.data;
          if(data.ret==1){
            this.student=data.student
          }
        }).catch(error=>{
          console.log(error)
        })
      },
      watch:{
        $route(value){
          let id=value.params.id
          let url= `http://localhost:81/student/findById?id=${id}`
          axios.get(url).then(response=>{
            console.log(response.data)
            let data=response.data;
            if(data.ret==1){
              this.student=data.student
            }
          }).catch(error=>{
            console.log(error)
          })
        }
      }
    }
</script>

<style scoped>

</style>

我们通过 r o u t e . p a r a m s . i d 可 以 获 取 到 p a r a m s 方 式 的 路 由 参 数 ; 得 到 i d 后 , 我 们 a j a x 请 求 , 得 到 学 生 信 息 的 详 细 数 据 ; 不 过 m o u n t e d 只 能 执 行 一 次 ; 我 们 切 换 的 时 候 , 需 要 通 过 w a t c h 检 测 route.params.id可以获取到params方式的路由参数; 得到id后,我们ajax请求,得到学生信息的详细数据; 不过mounted只能执行一次;我们切换的时候,需要通过watch检测 route.params.idparamsidajaxmountedwatchroute变化,再来请求;

在这里插入图片描述
  前面这种是常见的param传参,还有一种是?后面带参数的query方式 ?id=1 类似这样;

  我们改写下Menu2.vue代码:

<router-link :to="`/menu2/subMenu3/${student.id}`">{{student.name}}</router-link>
改为:
<router-link :to="`/menu2/subMenu3?id=${student.id}`">{{student.name}}</router-link>

  同时去掉路由中的id参数:

{
  path:'/Menu2',
  component:Menu2,
  children: [
    {
      path:'subMenu3',
      component:SubMenu3
    }
  ]
}

  SubMenu3.vue里的 r o u t e . p a r a m s 全 部 改 成 route.params全部改成 route.paramsroute.query;

<template>
  <div>
    Id:{{$route.query.id}}<br/>
    {{student.name}}<br/>
    {{student.age}}<br/>
    {{student.grade}}<br/>
  </div>
</template>

<script>
  import axios from 'axios'
    export default {
        name: "SubMenu3",
      data(){
        return{
          student:{}
        }
      },
      mounted() {
        let id=this.$route.query.id
        let url= 'http://localhost:81/student/findById?id=${id}'
        axios.get(url).then(response=>{
          console.log(response.data)
          let data=response.data;
          if(data.ret==1){
            this.student=data.student
          }
        }).catch(error=>{
          console.log(error)
        })
      },
      watch:{
        $route(value){
          let id=value.query.id
          let url= `http://localhost:81/student/findById?id=${id}`
          axios.get(url).then(response=>{
            console.log(response.data)
            let data=response.data;
            if(data.ret==1){
              this.student=data.student
            }
          }).catch(error=>{
            console.log(error)
          })
        }
      }
    }
</script>

<style scoped>

</style>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值