Vue Router query 命名路由 params props

6.5.路由的 query 参数

  1. 传递参数
    <!-- 跳转并携带query参数,to的字符串写法 -->
    <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">跳转</router-link>
    
    <!-- 跳转并携带query参数,to的对象写法(推荐) -->
    <router-link
      :to="{ 
        path:'/home/message/detail', 
        query:{ id: m.id, title: m.title } 
      }" >
      跳转
    </router-link>
    
  2. 接收参数
    $route.query.id 
    $route.query.title
    

在这里插入图片描述


src/router.index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children: [
                {
                    path:'news',
                    component:News
                },
                {
                    path:'message',
                    component:Message,
                    children: [
                        {
                            path:'detail',
                            component:Detail
                        }
                    ]
                }
            ]
        }
    ]
})

src/pages/Message.vue

<template>
    <div>
        <ul>
            <li v-for="m in messageList" :key="m.id">
                <!-- 跳转路由并携带query参数,to的字符串写法 -->
                <!-- router-link
                        :to="`/home/message/detail?id=${m.id}&title=${m.title}`">
                    {{m.title}}
                </router-link> -->

                <!-- 跳转路由并携带query参数,to的对象写法 -->
                <router-link
                        :to="{
                        path:'/home/message/detail',
                        query:{ id:m.id, title:m.title }
                    }">
                    {{m.title}}
                </router-link>
            </li>
        </ul>
        <hr/>
        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Message",
        data() {
            return {
                messageList:[
                    {id:'001',title:'消息001'},
                    {id:'002',title:'消息002'},
                    {id:'003',title:'消息003'}
                ]
            }
        }
    }
</script>

src/pages/Detail.vue

<template>
    <ul>
        <li>消息编号:{{ $route.query.id }}</li>
        <li>消息标题:{{ $route.query.title }}</li>
    </ul>
</template>

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

6.6.命名路由

命名路由

  1. 作用:可以简化路由的跳转
  2. 如何使用
    1. 给路由命名
      { 
        path:'/demo', 
        component:Demo, 
        children:[
          { 
            path:'test', 
            component:Test, 
            children:[ 
              { 
                name:'hello' // 给路由命名 
                path:'welcome', 
                component:Hello, 
              } 
            ] 
          }
        ]
      }
      
    2. 简化跳转
      <!--简化前,需要写完整的路径 --> 
      <router-link to="/demo/test/welcome">跳转</router-link>
      
      <!--简化后,直接通过名字跳转 --> 
      <router-link :to="{name:'hello'}">跳转</router-link>
      
      <!--简化写法配合传递参数 --> 
      <router-link 
        :to="{ 
          name:'hello', 
          query:{ id:666, title:'你好' } 
        }" >
        跳转
      </router-link>
      

src/router/index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children: [
                {
                    path:'news',
                    component:News
                },
                {
                    path:'message',
                    component:Message,
                    children: [
                        {
                            name:'detail', // name配置项为路由命名
                            path:'detail',
                            component:Detail
                        }
                    ]
                }
            ]
        }
    ]
})

src/pages/Message.vue

<template>
    <div>
        <ul>
            <li v-for="m in messageList" :key="m.id">
                <!-- 跳转路由并携带query参数,to的字符串写法 -->
                <!-- router-link
                        :to="`/home/message/detail?id=${m.id}&title=${m.title}`">
                    {{m.title}}
                </router-link> -->

                <!-- 跳转路由并携带query参数,to的对象写法 -->
                <router-link
                        :to="{
                        //path:'/home/message/detail',
                        name: 'detail', // 使用name进行跳转
                        query:{ id:m.id, title:m.title }
                    }">
                    {{m.title}}
                </router-link>
            </li>
        </ul>
        <hr/>
        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Message",
        data() {
            return {
                messageList:[
                    {id:'001',title:'消息001'},
                    {id:'002',title:'消息002'},
                    {id:'003',title:'消息003'}
                ]
            }
        }
    }
</script>

6.7.路由的 params 参数

  1. 配置路由,声明接收params参数
    { 
      path:'/home', 
      component:Home,
      children:[
        { 
          path:'news', 
          component:News 
        },
        { 
          component:Message, 
          children:[ 
            { 
              name:'xiangqing', 
              path:'detail/:id/:title', // 🔴使用占位符声明接收params参数 
              component:Detail 
            } 
          ]
        }
      ]
    }
    
  2. 传递参数,特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!
    <!-- 跳转并携带params参数,to的字符串写法 -->
    <router-link :to="/home/message/detail/666/你好">跳转</router-link>
    
    <!-- 跳转并携带params参数,to的对象写法 -->
    <router-link 
      :to="{ 
        name:'xiangqing', 
        params:{ id:666, title:'你好' } 
      }" >
      跳转
    </router-link>
    
  3. 接收参数
    $route.params.id 
    $route.params.title
    

src/router/index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children: [
                {
                    path:'news',
                    component:News
                },
                {
                    path:'message',
                    component:Message,
                    children: [
                        {
                            name:'detail', // name配置项为路由命名
                            path:'detail/:id/:title', // 使用占位符声明接收params参数
                            component:Detail
                        }
                    ]
                }
            ]
        }
    ]
})

src/pages/Message.vue

<template>
    <div>
        <ul>
            <li v-for="m in messageList" :key="m.id">
                <!-- 跳转并携带params参数,to的字符串写法 -->
                <!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`"> {{m.title}} </router-link> -->

                <!-- 跳转路由并携带params参数,to的对象写法 -->
                <router-link :to="{
                    name:'detail',
                    params:{ id:m.id, title:m.title }
                }">
                    {{m.title}}
                </router-link>&nbsp;&nbsp;
            </li>
        </ul>
        <hr/>
        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Message",
        data() {
            return {
                messageList:[
                    {id:'001',title:'消息001'},
                    {id:'002',title:'消息002'},
                    {id:'003',title:'消息003'}
                ]
            }
        }
    }
</script>

src/pages/Detail.vue

<template>
    <ul>
        <li>消息编号:{{ $route.params.id }}</li>
        <li>消息标题:{{ $route.params.title }}</li>
    </ul>
</template>

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

6.8.路由的 props 配置

props作用:让路由组件更方便的收到参数

{ 
  name:'xiangqing',
  path:'detail/:id', 
  component:Detail,
  
  //第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件 
  // props:{a:900} 
  
  //第二种写法:props值为布尔值,为true时,则把路由收到的所有params参数通过props传给Detail组件 
  // props:true
  
  //第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件 
  props($route){ 
    return { 
      id: $route.query.id, 
      title: $route.query.title 
    } 
  }
}

src/router/index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
export default new VueRouter({
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children: [
                {
                    path:'news',
                    component:News
                },
                {
                    path:'message',
                    component:Message,
                    children: [
                        {
                            name:'detail', // name配置项为路由命名
                            path:'detail/:id/:title', // 使用占位符声明接收params参数
                            component:Detail,

                            // props的第一种写法,值为对象(用的很少,因为值都是死数据)
                            // 该对象中的所有key-value都会以props的形式传给Detail组件
                            // props:{a:1,b:'hello'}

                            // 第二种写法:props值为布尔值,为true时,则把路由收到的所有params参数通过props传给Detail组件
                            // props:true

                            // props的第三种写法,值为函数
                            props($route){ // 这里可以使用解构赋值
                                return {
                                    id: $route.params.id,
                                    title: $route.params.title
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})

src/pages/Message.vue

<template>
    <div>
        <ul>
            <li v-for="m in messageList" :key="m.id">
                <!-- 跳转并携带params参数,to的字符串写法 -->
                <!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`"> {{m.title}} </router-link> -->

                <!-- 跳转路由并携带params参数,to的对象写法 -->
                <router-link :to="{
                    name:'detail',
                    params:{ id:m.id, title:m.title }
                }">
                    {{m.title}}
                </router-link>&nbsp;&nbsp;
            </li>
        </ul>
        <hr/>
        <router-view></router-view>
    </div>
</template>

<script>
    export default {
        name: "Message",
        data() {
            return {
                messageList:[
                    {id:'001',title:'消息001'},
                    {id:'002',title:'消息002'},
                    {id:'003',title:'消息003'}
                ]
            }
        }
    }
</script>

src/pages/Detail.vue

<template>
    <ul>
        <li>消息编号:{{ id }}</li>
        <li>消息标题:{{ title }}</li>
    </ul>
</template>

<script>
    export default {
        name: "Detail",
        props:['id','title']
    }
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值