在上一章博文中使用路由对象$route获取参数时,组件和路由对象耦合,在这篇博文中就可以使用props来进行解耦;

1、在组件中使用props选项定义数据,接收参数;

2、在路由中,使用props选项来进行设置,路由中的props有三种模式:

a、布尔模式:props设置为true,可接收params方式的参数传递;

实例:以上一篇的博文为例

当使用了props使用一个数组定义了北京菜数据的属性:

let Bjc={

            props:['name','price'],
template : "<h3>北京菜 菜名:{{name}} 价格:{{price}}</h3>" }

Vue-Router路由Vue-CLI脚手架和模块化开发      之 使用props替代路由对象的方式获取参数-LMLPHP

由于没有设置路由,因此北京菜数据获取不到

设置了路由后:

{
path:"bjc/:name/:price",//定义其属性
component:Bjc,
props:true },

Vue-Router路由Vue-CLI脚手架和模块化开发      之 使用props替代路由对象的方式获取参数-LMLPHP

b、函数模式:props为函数,可接收query方式参数的传递;

query的方式的获取的参数,不能使用布尔模式,需要使用函数模式

函数模式格式:

const router = new VueRouter({
routes: [
{ path: '/search', component: SearchUser, props: (route) => ({ query: route.query.q }) }
]
})

其中:

URL /search?q=vue 会将 {query: 'vue'} 作为属性传递给 SearchUser 组件。

请尽可能保持 props 函数为无状态的,因为它只会在路由发生变化时起作用。如果你需要状态来定义 props,请使用包装组件,这样 Vue 才可以对状态变化做出反应。

以获取湘菜的数据为例

let Xc={
props:['name','price'],
template : "<h3 >湘菜 菜名:{{name}} 价格:{{price}}</h3>" }
{
path:"xc",
component:Xc,
props : (route) => ({
name : route.query.name,
price : route.query.price
}) },

Vue-Router路由Vue-CLI脚手架和模块化开发      之 使用props替代路由对象的方式获取参数-LMLPHP

c、对象模式:props为对象。如果处理静态数据,可使用对象模式;

以粤菜为例:

let Yc={
props:['name','price'],
template : "<h3>粤菜 菜名:{{name}} 价格:{{price}}</h3>" }
{
path:"yc",
component:Yc,
props:{ name:'蜜汁叉烧量版式',
price:
} },

Vue-Router路由Vue-CLI脚手架和模块化开发      之 使用props替代路由对象的方式获取参数-LMLPHP

最终所有的代码:

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> 使用props替代路由对象的方式获取参数</title>
</head>
<body>
<div id="one">
<router-link to="/home">首页</router-link>
<router-link to="/foods">美食</router-link> <div>
<!--将数据显示在这里-->
<router-view></router-view>
</div>
</div>
</body>
<template id="foods"> <div> <h2>美食广场</h2>
<ul>
<router-link to="/foods/bjc/北京烤鸭/68" tag="li"> 北京菜</router-link>
<router-link to="/foods/hnc" tag="li"> 湖南菜</router-link>
<router-link to="/foods/xc?name=剁椒鱼头&price=128" tag="li"> 湘菜</router-link>
<router-link :to="ycParam" tag="li"> 粤菜</router-link>
<router-link :to="sccParam" tag="li"> 四川菜</router-link>
</ul> <router-view></router-view>
</div>
</template> <script type="text/javascript" src="../js/vue.js" ></script>
<script type="text/javascript" src="../js/vue-router.js" ></script>
<script> //1 定义组件
let Home = {
template : "<h2>首页</h2>"
}
let Foods = {
template : "#foods",
data(){ return{
sccParam:{ name:'sccRouter', params:{ name:"麻婆豆腐",
price:
}
}, ycParam:{
path:'/foods/yc',
query:{
name:"蜜汁叉烧",
price: } }
}
}
} //定义foods中的子组件 let Bjc={ props:['name','price'],
template : "<h3>北京菜 菜名:{{name}} 价格:{{price}}</h3>" } let Hnc={
template : "<h3>湖南菜 </h3>" }
let Xc={
props:['name','price'],
template : "<h3 >湘菜 菜名:{{name}} 价格:{{price}}</h3>" } let Yc={
props:['name','price'],
template : "<h3>粤菜 菜名:{{name}} 价格:{{price}}</h3>" } let Scc={
props:['name','price'],
template : "<h3>四川菜 菜名:{{name}} 价格:{{price}}</h3>" } //2 配置路由 路由可能有多个
const myRoutes = [
{
path : "/home",
component : Home
},
{
path : "/foods",
component : Foods, children:[
{
path:"bjc/:name/:price",//定义其属性
component:Bjc,
props:true },
{
path:"hnc",
component:Hnc }, {
path:"xc",
component:Xc,
props : (route) => ({
name : route.query.name,
price : route.query.price
}) },
{
path:"yc",
component:Yc,
props:{ name:'蜜汁叉烧量版式',
price:
} },
{
name:'sccRouter',
path:"scc",
component:Scc,
props:true } ]
},
{
path:"*",
redirect:"/home"
}
] // 3 创建路由对象
const myRouter = new VueRouter({
//routes : routes
routes : myRoutes,
//mode:'history'
linkActiveClass : "active" }); new Vue({
//router : router
router : myRouter //4 注入路由 简写
}).$mount("#one");
</script>
<style> .active{
color: white; background-color: black;
}
</style>
</html>

使用props替代路由对象的方式获取参数

05-11 13:34