使用props参数,可以更方便的给路由组件传递数据。
本篇基于路由的query参数中的完整实例,实现需求:从路由组件Message.vue向路由组件Detail.vue传递数据。

路由规则配置中,props参数的使用有如下三种方式:

  1. props值是一个对象。
  2. props值是一个布尔值。
  3. props值是一个函数。

接下来我们一一来看下这3种方式。

props值是一个对象

在Detail的路由规则中配置props值为一个对象,该对象中的key-value会全部以props的形式传递给Detail组件。

  • 修改router/index.js
import VueRouter from "vue-router";
import Home from "../pages/Home";
import About from "../pages/About";
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:"message",
                    component:Message,
                    children:[
                        {
                            path:"detail",
                            component:Detail,
                            props:{
                                id:"xxx",
                                title:"yyy"
                            }
                        }
                    ]
                },
                {
                    path:"news",
                    component:News
                }
            ]
        }
    ]
})

在这里插入图片描述

  • 修改路由组件Message.vue
<template>
   <div>
       <ul>
           <li v-for="message in messageList" :key="message.id">
               <router-link to="/home/message/detail">
                {{message.title}}
               </router-link>
           </li>
       </ul>
       <hr>
       <router-view></router-view>
   </div>
</template>

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

<style>

</style>
  • 修改路由组件Detail.vue
    Detail组件通过props接收参数:id和title。
<template>
    <ul>
        <li>消息编号:{{id}}</li>
        <li>消息标题:{{title}}</li>
    </ul>
</template>

<script>
export default {
    name:"Detail",
    props:['id','title']
}
</script>

<style>

</style>

在这里插入图片描述
在这里插入图片描述

props值是一个布尔值

Detail路由规则中配置props值为布尔值true,则Detail组件接收到的所有params参数会以props形式传递给过来。

  • 修改router/index.js
import VueRouter from "vue-router";
import Home from "../pages/Home";
import About from "../pages/About";
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:"message",
                    component:Message,
                    children:[
                        {
                            name:"xiangqing",
                            path:"detail/:id/:title",
                            component:Detail,
                            props:true
                        }
                    ]
                },
                {
                    path:"news",
                    component:News
                }
            ]
        }
    ]
})

在这里插入图片描述

  • 路由组件Message.vue
<template>
   <div>
       <ul>
           <li v-for="message in messageList" :key="message.id">
               <router-link :to="{
                    name:'xiangqing',
                    params:{
                        id:message.id,
                        title:message.title
                    }
                   }">
                {{message.title}}
               </router-link>
           </li>
       </ul>
       <hr>
       <router-view></router-view>
   </div>
</template>

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

<style>

</style>

在这里插入图片描述

  • 路由组件Detail.vue
<template>
    <ul>
        <li>消息编号:{{id}}</li>
        <li>消息标题:{{title}}</li>
    </ul>
</template>

<script>
export default {
    name:"Detail",
    props:['id','title']
}
</script>

<style>

</style>

在这里插入图片描述

在这里插入图片描述

props值是一个函数

路由规则配置中props值为一个函数,且函数的参数是$route

通过props接收params参数

  • 修改router/index.js
import VueRouter from "vue-router";
import Home from "../pages/Home";
import About from "../pages/About";
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:"message",
                    component:Message,
                    children:[
                        {
                            name:"xiangqing",
                            path:"detail/:id/:title",
                            component:Detail,
                            props($route){
                                return {
                                    id:$route.params.id,
                                    title:$route.params.title
                                }
                            }
                        }
                    ]
                },
                {
                    path:"news",
                    component:News
                }
            ]
        }
    ]
})

在这里插入图片描述

  • 路由组件Message.vue
<template>
   <div>
       <ul>
           <li v-for="message in messageList" :key="message.id">
               <router-link :to="{
                    name:'xiangqing',
                    params:{
                        id:message.id,
                        title:message.title
                    }
                   }">
                {{message.title}}
               </router-link>
           </li>
       </ul>
       <hr>
       <router-view></router-view>
   </div>
</template>

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

<style>

</style>

在这里插入图片描述

  • 路由组件Detail.vue
<template>
    <ul>
        <li>消息编号:{{id}}</li>
        <li>消息标题:{{title}}</li>
    </ul>
</template>

<script>
export default {
    name:"Detail",
    props:['id','title']
}
</script>

<style>

</style>

在这里插入图片描述

在这里插入图片描述

通过props接收query参数

  • 修改router/index.js
import VueRouter from "vue-router";
import Home from "../pages/Home";
import About from "../pages/About";
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:"message",
                    component:Message,
                    children:[
                        {
                            path:"detail",
                            component:Detail,
                            props($route){
                                return {
                                    id:$route.query.id,
                                    title:$route.query.title
                                }
                            }
                        }
                    ]
                },
                {
                    path:"news",
                    component:News
                }
            ]
        }
    ]
})

在这里插入图片描述

  • 路由组件Message.vue
<template>
   <div>
       <ul>
           <li v-for="message in messageList" :key="message.id">
               <router-link :to="{
                    path:'/home/message/detail',
                    query:{
                        id:message.id,
                        title:message.title
                    }
                   }">
                {{message.title}}
               </router-link>
           </li>
       </ul>
       <hr>
       <router-view></router-view>
   </div>
</template>

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

<style>

</style>

在这里插入图片描述

  • 路由组件Detail.vue
<template>
    <ul>
        <li>消息编号:{{id}}</li>
        <li>消息标题:{{title}}</li>
    </ul>
</template>

<script>
export default {
    name:"Detail",
    props:['id','title']
}
</script>

<style>

</style>

在这里插入图片描述
在这里插入图片描述

Logo

前往低代码交流专区

更多推荐