Vue 路由

路由的query参数

  1. 传递参数

     <!-- 跳转并携带query参数,to的字符串写法 -->
     <router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link>
     
     <!-- 跳转并携带query参数,to的对象写法 -->
     <router-link
     	:to="{
     		path:'/home/message/detail',
     		query:{
     				id:666,
     				title:'你好'
     		}
     	}"
     	>
     	跳转
     </router-link>
    
  2. 接收参数:

     $route.query.id
     $route.query.title
    

案例

  • main.js
import Vue from 'vue'
import App from './App.vue'

// 引入VueRouter
import VueRouter from 'vue-router'

// 引入路由器
import router from './router'
Vue.config.productionTip = false

// 应用插件
Vue.use(VueRouter)
new Vue({
    render: h => h(App),
    router: router
}).$mount('#app')
  • App.vue
<template>
  <div>
    <div class="row">
      <Banner />
    </div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-2">
        <div class="list-group">
          <router-link
            to="./about"
            class="list-group-item"
            active-class="active"
            >About</router-link
          >
          <router-link to="./home" class="list-group-item" active-class="active"
            >Home</router-link
          >
        </div>
      </div>
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
            <router-view></router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import Banner from "./components/Banner";
export default {
  name: "App",
  components: { Banner },
};
</script>
  • router文件夹
    index.js
// 该文件用于创建整个应用的路由器

// 引入VueRouter
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,
                        }
                    ]
                }
            ]
        },
    ]
})
  • pages文件夹

    • About.vue
    <template>
    	<div>
    		<h2>我是About的内容</h2>
    	</div>
    </template>
    
    <script>
    export default {
    	name: "About",
    };
    </script>
    
    • Home.vue
    <template>
    	<div>
    		<h2>我是Home的内容</h2>
    		<div>
      			<h2>Home组件内容</h2>
      			<div>
       	 		<ul class="nav nav-tabs">
          			<li>
            		<router-link
              			to="/home/news"
              			class="list-group-item"
              			active-class="active"
            			>
              			News
            			</router-link>
          			</li>
          			<li>
            		<router-link
              		to="/home/message"
              		class="list-group-item"
              		active-class="active"
            		>
              		Message
            		</router-link>
          			</li>
        		</ul>
        		<router-view></router-view>
      		</div>
    	</div>
    </div>
    </template>
    
    <script>
    export default {
    	name: "Home",
    };
    </script>
    
    • 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>
     	<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>
    
    • News.vue
    	<template>
    		<ul>
    			<li>news001</li>
    			<li>news002</li>
    			<li>news003</li>
    		</ul>
    	</template>
    
    	<script>
    	export default {
    		name: "News",
    	};
    </script>
    
    • Detail.vue
    <template>
    	<ul>
    		<li>消息编号:{{ $route.query.id }}</li>
    		<li>消息标题:{{ $route.query.title }}</li>
    	</ul>
    </template>
    
    <script>
    export default {
    	name: "Detail",
    };
    </script>
    
  • components文件夹
    Bannet.vue

    <template>
    	<div>
    		<div class="col-xs-offset-2 col-xs-8">
      			<div class="page-header">
        			<h2>Vue Router Demo</h2>
      			</div>
    		</div>
    	</div>
    </template>
    
    <script>
    	export default {
    		name: "Banner",
    	};
    </script>
    

命名路由

作用:

可以简化路由的跳转

如何使用

  1. 给路由命名

     {
     	path :' /demo'
     	component:Demo ,
     	children:[
     		{
     			path:'test',
     			component:Test,
     			children:[
     				{
     					name:'hello',    //给路由命名
     					path:'welcome',
     					component :Hel1o
     				}
     			]
     		}
     	]
     }
    
  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> 
    

路由的params参数

  1. 配置路由,声明接收params参数

     {
     	path:' /home',
     	component:Home,
     	children:[
     		{
     			path:'news',
     			component:News,
     		},
     		{
     			path:'message',
     			component:Message,
     			children:[
     					{
     						name:'xiangqing',
     						path:'detail/:id/:title’,//使用占位符声明接收params参数
     						component:Detail
     					}
     			]
     		}
     	]
     }
    
  2. 传递参数

     <!-- 跳转并携带params参数,to的字符串写法 -->
     <router-link :to="/home/message/detail/666/你好”跳转</router-link>
     
     <!-- 跳转并携带params参数,to的对象写法 -->
     <router-link
     	:to="{
     		name: 'xiangqing',
     		params:{
     			id:666,
     			title:'你好'
     		}
     	}"
     >跳转</router-link>
    

: 路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

  1. 接收参数:

     $route.params.id$route.params.title
    
案例:
  • main.js
import Vue from 'vue'
import App from './App.vue'

// 引入VueRouter
import VueRouter from 'vue-router'

// 引入路由器
import router from './router'
Vue.config.productionTip = false

// 应用插件
Vue.use(VueRouter)
new Vue({
    render: h => h(App),
    router: router
}).$mount('#app')
  • App.vue
<template>
  <div>
    <div class="row">
      <Banner />
    </div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-2">
        <div class="list-group">
          <router-link
            to="./about"
            class="list-group-item"
            active-class="active"
            >About</router-link
          >
          <router-link to="./home" class="list-group-item" active-class="active"
            >Home</router-link
          >
        </div>
      </div>
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
            <router-view></router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import Banner from "./components/Banner";
export default {
  name: "App",
  components: { Banner },
};
</script>
  • router文件夹
    index.js
// 该文件用于创建整个应用的路由器

// 引入VueRouter
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: 'xq',
                            path: 'detail/:id/:title',
                            component: Detail,
                        }
                    ]
                }
            ]
        },
    ]
})
  • pages文件夹

    • About.vue
    <template>
    	<div>
    		<h2>我是About的内容</h2>
    	</div>
    </template>
    
    <script>
    export default {
    	name: "About",
    };
    </script>
    
    • Home.vue
    <template>
    	<div>
    		<h2>我是Home的内容</h2>
    		<div>
      			<h2>Home组件内容</h2>
      			<div>
       	 		<ul class="nav nav-tabs">
          			<li>
            		<router-link
              			to="/home/news"
              			class="list-group-item"
              			active-class="active"
            			>
              			News
            			</router-link>
          			</li>
          			<li>
            		<router-link
              		to="/home/message"
              		class="list-group-item"
              		active-class="active"
            		>
              		Message
            		</router-link>
          			</li>
        		</ul>
        		<router-view></router-view>
      		</div>
    	</div>
    </div>
    </template>
    
    <script>
    export default {
    	name: "Home",
    };
    </script>
    
    • Message.vue
    <template>
    	<div>
    		<ul>
      			<li v-for="m in MessageList" :key="m.id">
        		<!-- 跳转路由并携带params参数,to的字符串写法  -->
        		<!-- <router-link :to="`/home/message/detail/id=${m.id}/$title=${m.title}`">{{ m.title }}</router-link> -->
    
        		<!-- 跳转路由并携带params参数,to的对象写法 -->
        		<router-link
          			:to="{
            			name: 'xq',
           	 			params: {
              				id: m.id,
              				title: m.title,
            			},
          			}"
          		>{{ m.title }}</router-link>
      		</li>
     	</ul>
     	<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>
    
    • News.vue
    	<template>
    		<ul>
    			<li>news001</li>
    			<li>news002</li>
    			<li>news003</li>
    		</ul>
    	</template>
    
    	<script>
    	export default {
    		name: "News",
    	};
    </script>
    
    • Detail.vue
    <template>
    	<ul>
    		<li>消息编号:{{ $route.query.id }}</li>
    		<li>消息标题:{{ $route.query.title }}</li>
    	</ul>
    </template>
    
    <script>
    export default {
    	name: "Detail",
    };
    </script>
    
  • components文件夹
    Bannet.vue

    <template>
    	<div>
    		<div class="col-xs-offset-2 col-xs-8">
      			<div class="page-header">
        			<h2>Vue Router Demo</h2>
      			</div>
    		</div>
    	</div>
    </template>
    
    <script>
    	export default {
    		name: "Banner",
    	};
    </script>
    

路由的props配置

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

{
	name:'xiangqing',
	path:'detail/:id',
	component:Detail,
	
	// props的第一种写法,值为对象,该对象中所有key-value都会以props的形式传给Detail组件
    // props: {a:1}

	// props的第二种写法,值为布尔值,若布尔值为真,就会把该组件收到的所有params参数,以props的形式传给Detail组件
    // props: true

    // props的第三种写法,值为函数
         props($route) {
               return {
                    id: $route.query.id, title: $route.query.title
                }
         }
}

案例:

  • main.js
import Vue from 'vue'
import App from './App.vue'

// 引入VueRouter
import VueRouter from 'vue-router'

// 引入路由器
import router from './router'
Vue.config.productionTip = false

// 应用插件
Vue.use(VueRouter)
new Vue({
    render: h => h(App),
    router: router
}).$mount('#app')
  • App.vue
<template>
  <div>
    <div class="row">
      <Banner />
    </div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-2">
        <div class="list-group">
          <router-link
            to="./about"
            class="list-group-item"
            active-class="active"
            >About</router-link
          >
          <router-link to="./home" class="list-group-item" active-class="active"
            >Home</router-link
          >
        </div>
      </div>
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
            <router-view></router-view>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import Banner from "./components/Banner";
export default {
  name: "App",
  components: { Banner },
};
</script>
  • router文件夹
    index.js
// 该文件用于创建整个应用的路由器

// 引入VueRouter
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: 'xq',
                            path: 'detail/:id/:title',
                            component: Detail,
                            // props的第一种写法,值为对象,该对象中所有key-value都会以props的形式传给Detail组件
                            // props: {a:1}

                            // props的第二种写法,值为布尔值,若布尔值为真,就会把该组件收到的所有params参数,以props的形式传给Detail组件
                            // props: true

                            // props的第三种写法,值为函数
                            props($route) {
                                return {
                                    id: $route.query.id, title: $route.query.title
                                }
                            }
                        }
                    ]
                }
            ]
        },
    ]
})
  • pages文件夹

    • About.vue
    <template>
    	<div>
    		<h2>我是About的内容</h2>
    	</div>
    </template>
    
    <script>
    export default {
    	name: "About",
    };
    </script>
    
    • Home.vue
    <template>
    	<div>
    		<h2>我是Home的内容</h2>
    		<div>
      			<h2>Home组件内容</h2>
      			<div>
       	 		<ul class="nav nav-tabs">
          			<li>
            		<router-link
              			to="/home/news"
              			class="list-group-item"
              			active-class="active"
            			>
              			News
            			</router-link>
          			</li>
          			<li>
            		<router-link
              		to="/home/message"
              		class="list-group-item"
              		active-class="active"
            		>
              		Message
            		</router-link>
          			</li>
        		</ul>
        		<router-view></router-view>
      		</div>
    	</div>
    </div>
    </template>
    
    <script>
    export default {
    	name: "Home",
    };
    </script>
    
    • Message.vue
    <template>
    	<div>
    		<ul>
      			<li v-for="m in MessageList" :key="m.id">
        		<!-- 跳转路由并携带params参数,to的字符串写法  -->
        		<!-- <router-link :to="`/home/message/detail/id=${m.id}/$title=${m.title}`">{{ m.title }}</router-link> -->
    
        		<!-- 跳转路由并携带params参数,to的对象写法 -->
        		<router-link
          			:to="{
            			name: 'xq',
           	 			query: {
              				id: m.id,
              				title: m.title,
            			},
          			}"
          		>{{ m.title }}</router-link>
      		</li>
     	</ul>
     	<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>
    
    • News.vue
    	<template>
    		<ul>
    			<li>news001</li>
    			<li>news002</li>
    			<li>news003</li>
    		</ul>
    	</template>
    
    	<script>
    	export default {
    		name: "News",
    	};
    </script>
    
    • Detail.vue
    <template>
    	<ul>
    		<li>消息编号:{{ id }}</li>
    		<li>消息标题:{{ title }}</li>
    	</ul>
    </template>
    
    <script>
    export default {
    	name: "Detail",
    	props: ["id", "title"],
    };
    </script>
    
  • components文件夹
    Bannet.vue

    <template>
    	<div>
    		<div class="col-xs-offset-2 col-xs-8">
      			<div class="page-header">
        			<h2>Vue Router Demo</h2>
      			</div>
    		</div>
    	</div>
    </template>
    
    <script>
    	export default {
    		name: "Banner",
    	};
    </script>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值