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


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

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

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

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

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

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

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

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

    设置了路由后:

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

    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
                        })
                    
                    
                    },

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

    以粤菜为例:

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

     最终所有的代码:

      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="UTF-8">
      5         <title> 使用props替代路由对象的方式获取参数</title>
      6 </head>
      7     <body>
      8         <div id="one">
      9             <router-link to="/home">首页</router-link>
     10             <router-link to="/foods">美食</router-link>
     11             
     12             <div>
     13                 <!--将数据显示在这里-->
     14                 <router-view></router-view>
     15             </div>
     16         </div>
     17     </body>
     18     <template id="foods">
     19         
     20         
     21         <div>
     22             
     23             <h2>美食广场</h2>
     24             <ul>
     25                 <router-link to="/foods/bjc/北京烤鸭/68" tag="li"> 北京菜</router-link>
     26                 <router-link to="/foods/hnc" tag="li"> 湖南菜</router-link>
     27                 <router-link to="/foods/xc?name=剁椒鱼头&price=128" tag="li"> 湘菜</router-link>
     28                 <router-link :to="ycParam" tag="li"> 粤菜</router-link>
     29                 <router-link :to="sccParam" tag="li"> 四川菜</router-link>
     30             </ul>
     31             
     32             <router-view></router-view>
     33         </div>
     34     </template>
     35     
     36     <script type="text/javascript" src="../js/vue.js" ></script>
     37     <script type="text/javascript" src="../js/vue-router.js" ></script>
     38     <script>
     39         
     40         //1 定义组件
     41         let Home = {
     42             template : "<h2>首页</h2>"
     43         }
     44         let Foods = {
     45             template : "#foods",
     46             data(){
     47                 
     48                 return{
     49                     sccParam:{
     50                         
     51                         name:'sccRouter',
     52                         
     53                         params:{
     54                             
     55                             name:"麻婆豆腐",
     56                             price:28
     57                         }
     58                     },
     59                     
     60                     ycParam:{
     61                         path:'/foods/yc',
     62                         query:{
     63                             name:"蜜汁叉烧",
     64                             price:56
     65                             
     66                         }
     67                         
     68                     }
     69                 }
     70             }
     71         }
     72         
     73         //定义foods中的子组件
     74         
     75         let Bjc={
     76             
     77             props:['name','price'],
     78             template : "<h3>北京菜 菜名:{{name}} 价格:{{price}}</h3>"
     79             
     80         }
     81         
     82         let Hnc={
     83             template : "<h3>湖南菜  </h3>"
     84             
     85         }
     86         let Xc={
     87             props:['name','price'],
     88             template : "<h3 >湘菜  菜名:{{name}} 价格:{{price}}</h3>"
     89             
     90         }
     91         
     92         let Yc={
     93             props:['name','price'],
     94             template : "<h3>粤菜  菜名:{{name}} 价格:{{price}}</h3>"
     95             
     96         }
     97         
     98         let Scc={
     99             props:['name','price'],
    100             template : "<h3>四川菜  菜名:{{name}} 价格:{{price}}</h3>"
    101             
    102             
    103             
    104         }
    105         
    106         //2 配置路由 路由可能有多个
    107         const myRoutes = [
    108             {
    109                 path : "/home",
    110                 component : Home
    111             },
    112             {
    113                 path : "/foods",
    114                 component : Foods,
    115                 
    116                 children:[
    117                 {
    118                     path:"bjc/:name/:price",//定义其属性
    119                     component:Bjc,
    120                     props:true
    121                 
    122                 
    123                 },
    124                 {
    125                     path:"hnc",
    126                     component:Hnc
    127                 
    128                 
    129                 },
    130                 
    131                 {
    132                     path:"xc",
    133                     component:Xc,
    134                     props : (route) => ({
    135                             name : route.query.name,
    136                             price : route.query.price
    137                     })
    138                 
    139                 
    140                 },
    141                 {
    142                     path:"yc",
    143                     component:Yc,
    144                     props:{
    145                         
    146                         name:'蜜汁叉烧量版式',
    147                         price:648
    148                     }
    149                 
    150                 
    151                 },
    152                 {
    153                     name:'sccRouter',
    154                     path:"scc",
    155                     component:Scc,
    156                     props:true
    157                 
    158                 
    159                 }
    160                 
    161                 
    162                 
    163                 
    164                 
    165                 ]
    166             },
    167         {
    168             path:"*",
    169                 redirect:"/home"
    170             }
    171         ]
    172         
    173         // 3 创建路由对象
    174         const myRouter = new VueRouter({
    175             //routes : routes
    176             routes : myRoutes,
    177             //mode:'history'
    178              linkActiveClass : "active"
    179 
    180         });
    181         
    182         new Vue({
    183             //router : router
    184             router : myRouter //4 注入路由 简写
    185         }).$mount("#one");
    186     </script>
    187     <style>
    188         
    189         
    190         .active{
    191             color: white;
    192             
    193             background-color: black;
    194         }
    195     </style>
    196 </html>
    使用props替代路由对象的方式获取参数
  • 相关阅读:
    完美世界笔试(动态规划,背包问题)
    腾讯笔试3
    腾讯笔试2
    腾讯笔试1
    阿里笔试1
    Merge Sorted Array
    Partition List
    Reverse Linked List II
    Remove Duplicates from Sorted List II
    白菜刷LeetCode记-704. Binary Search
  • 原文地址:https://www.cnblogs.com/jiguiyan/p/10794293.html
Copyright © 2020-2023  润新知