1、把子路由容器放在home模板结构,<router-view></router-view>

<template id="home">
		<div>
			<h1>首页</h1>
			<button @click="tap()">跳转到other</button>
			
			<hr />
			<ul>
				<li v-for="(item,i) in arr"><router-link  :to="'/detail/'+item.pid">{{item.pname}}</router-link></li>
			</ul>
			
			<hr />
			<!--子路由容器-->
			<router-view></router-view>
			
			
		</div>
</template>

2、改变路由规则为父子元素

//	路由规则定义
	var routes=[
		{path:'/home',component:Home,
			children:[
				{path:'/detail/:id',component:Detail}
			]
		},
		{path:'/about',components:{default:About,'other':Other}},
		{path:'/qita',name:'other',component:Other},
		{path:'*',redirect:'/home'}
	]

3、此时点击后只能点击一次,原因是路由嵌套不能动态改变新得到的值(路由嵌套传值的弊端),这里解决方法是用watch(‘$route’(a,b){a为新传入的值,b为原来的值})监听,这里只用a值即可,a.params.id即为新传入的值,这时候a.params.id=_this.$route

var Detail={
		template:'#detail',
		data:function(){
			return{
				detail:''
			}
		},
		mounted(){
			var _this=this;
			axios({
				url:"http://jx.xuzhixiang.top/ap/api/detail.php",
				params:{id:_this.$route.params.id}
			})
			.then(function(data){
				_this.detail=data.data.data.pdesc
			})

		},
		watch:{
			'$route'(a){
//				console.log(a.params.id)
				var _this=this;
				axios({
					url:"http://jx.xuzhixiang.top/ap/api/detail.php",
					params:{id:a.params.id}
				})
				.then(function(data){
					_this.detail=data.data.data.pdesc
				})
				
			}
		}
	}

 

params 方式传参和接收参数

params 传参 路由界面: router.js: 路由设置这里,当你使用 params 方法传参的时候,要在路由后面加参数名,并且传参的时候,参数名要跟路由后面设置的参数名对应。使用 query 方法,就没有这种限制,直接在跳转里面用就可以 image传参: this.$router.push({ name:'xxx' params:{ id:id } }) 接收参数: this.$route.params.id

注意:如果路由上面不写参数,也是可以传过去的,但不会在 url 上面显示出你的参数,并且当你跳到别的页面或者刷新页面的时候参数会丢失(如下图所示),那依赖这个参数的 http 请求或者其他操作就会失败。

query 传参和 params 传参的区别

  • 用法上的: query 要用 path 来引入,params 要用 name 来引入,接收参数都是类似的,分别是 this.$route.query.name 和 this.$route.params.name。注意接收参数的时候,已经是$route 而不是$router 了哦!!
  • 展示上的: query 更加类似于我们 ajax 中 get 传参,params 则类似于 post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示所以两者不能同时使用!!!

 

编程式导航

image

  • router.push 
  • router.replace 和 router.push()不同,使用 router.replace()会将一个访问记录 push 到 url 中,所以再退回了的时候一定会回到这里,而 router.replace()不是添加一个新的进入,而是替换栈顶元素,这样,在返回的时候,就会返回到栈顶元素的下面一个。
  • router.go

    • 在浏览器记录中前进一步,等同于 history.forward() router.go(1)
    • 后退一步记录,等同于 history.back() router.go(-1)

动态传参之坑

注意:params 传参,push 里面只能是 name:'xxxx',不能是 path:'/xxx',因为 params 只能用 name 来引入路由,如果这里写成了 path,接收参数页面会是 undefined!!


完整的代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/axios.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/vue-router.min.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
	.router-link-active{
		color: blue;
	}
</style>
</head>
<body>
	<div id="out">
		
		<h1>路由</h1>
		<!--导航标签-->
		<router-link to="/home" tag="span">首页</router-link>
		<router-link to='/about' tag="span">关于</router-link>
		<router-link :to="{name:'other'}" tag="span">其他</router-link>
		
		
		<!--路由容器-->
		<router-view></router-view>	 
		
		<router-view name="other"></router-view>
		
		
	</div>
	
	
	<template id="home">
		<div>
			<h1>首页</h1>
			<button @click="tap()">跳转到other</button>
			
			<hr />
			<ul>
				<li v-for="(item,i) in arr"><router-link  :to="'/detail/'+item.pid">{{item.pname}}</router-link></li>
			</ul>
			
			<hr />
			<!--子路由容器-->
			<router-view></router-view>
			
			
		</div>
	</template>
	
	<template id="about">
		<div>
			<h1>about</h1>
			<!--<p>{{this.$route.params.id}}</p>-->
		</div>
	</template>
	
	<template id="other">
		<div>
			<h1>.qita.</h1>
		</div>
	</template>
	
	<template id="detail">
		<div>
			<h2>详情</h2>
			<p>{{detail}}</p>
		</div>
	</template>
	
	 
	
</body>
<script type="text/javascript">
	
	var Home={
		template:'#home',
		data:function(){
			return {
				arr:[]
			}
		},
		methods:{
			tap(){
				router.push('/other')
			}
		},
		mounted(){
			var _this=this;
			axios({
				url:"http://jx.xuzhixiang.top/ap/api/productlist.php"
			})
			.then(function(data){
//				console.log(data.data.data)
				_this.arr=data.data.data
			})
		}
	}
	
	
	var Detail={
		template:'#detail',
		data:function(){
			return{
				detail:''
			}
		},
		mounted(){
			var _this=this;
			axios({
				url:"http://jx.xuzhixiang.top/ap/api/detail.php",
				params:{id:_this.$route.params.id}
			})
			.then(function(data){
				_this.detail=data.data.data.pdesc
			})

		},
		watch:{
			'$route'(a){
//				console.log(a.params.id)
				var _this=this;
				axios({
					url:"http://jx.xuzhixiang.top/ap/api/detail.php",
					params:{id:a.params.id}
				})
				.then(function(data){
					_this.detail=data.data.data.pdesc
				})
				
			}
		}
	}
	
	
	var About={
		template:'#about'
	}
	
	var Other={
		template:'#other'
	}
	
//	路由规则定义
	var routes=[
		{path:'/home',component:Home,
			children:[
				{path:'/detail/:id',component:Detail}
			]
		},
		{path:'/about',components:{default:About,'other':Other}},
		{path:'/qita',name:'other',component:Other},
		{path:'*',redirect:'/home'}
	]
	
//	实例化路由对象
	var router=new VueRouter({
		routes:routes
	})
	
	
	
	var vm=new Vue({
		el:'#out',
		router:router
	})
	
	
//	导航路由
//	编程路由
//	单容器路由
//	嵌套路由
//	路由params传参
	
	
</script>
</html>

 

 

 

 

 

Logo

Vue社区为您提供最前沿的新闻资讯和知识内容

更多推荐