vue.js路由

注意:执行以下操作时提前安装node.js。如何安装请看俺的node.js学习路程。

1.安装vue命令行工具

      GitHub地址:https://github.com/vuejs/vue-cli

      全局安装vue命令行工具:npm install vue-cli -g

      安装之后查看是否安装成功:vue -V,安装成功如下图所示:

2.安装vue

    1.安装模板:vue init webpack helloworld

     2.安装生产环境:nmp install --production

     3.安装vue:npm install vue --save-dev

     4.运行vue:npm run dev

      当然也可以将官方的webpack从GitHub上复制到自己的项目中,github地址:https://github.com/vuejs-templates/webpack,然后npm install 项目的路径

   3.安装vue路由和4.vue子路由

      在命令窗口输入:npm install vue-router --save-dev

      在项目目录下src中的main.js做修改。

import Vue from 'vue'
import Router from './Router'

       在src中新建Router.js文件并且写入一下代码

      

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const first = {template:'<div>first內容</div>'}
const second = {template:'<div>second內容</div>'}
const Home = {template:'<div>home內容</div>'}
const ab = {
		template:`
			<div class="asdf">
				<h2>组件</h2>
				<router-view class='asdf'></router-view>
			</div>
		`
	}
const firstFirst =  {template:'<div>firstFirst內容</div>'}
const firstSecond =  {template:'<div>firstSecond內容</div>'}

const router = new VueRouter({
	mode:'history',
	base:__dirname, //当前路径
	routes:[
		{path:'/',component:Home},
		{path:'/second',component:second},
		{path:'/first',component:ab,
			children:[
				{path:'/',component:first},
				{path:'first',component:firstFirst},
				{path:'second',component:firstSecond},
			]},
	]
})

// 模板
new Vue({
	router,
	template:`
		<div id='r'>
		    <h1>导航</h1>
		    <ol>
		    	<li><router-link to="/">/</router-link></li>
		    	<li><router-link to="/first">first</router-link></li>
		    	<ol>
		    	   <li><router-link to="/first/first">/first/first</router-link></li>
		    	   <li><router-link to="/first/second">/first/second</router-link></li>
		    	</ol>
		    	<li><router-link to="/second">second</router-link></li>
		    </ol>
		    <router-view class="sadfj"></router-view>
		 </div>
		 `
}).$mount('#app')

   最后运行vue:npm run dev

5.vue中路由传参

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/'},
		{path:'/params/:aaa/:bbb'},
		{path:'/params-regex/:id(\\d+)'}
	]
})

new Vue({
	router,
	template:`
		<div>
			<h1>Good Morning</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<li><router-link to="/params/111/222">/params/111/222</router-link></li>
				<li><router-link to="/params-regex/222">/params-regex/222</router-link></li>
			</ul>
			<p>Show</p>
			<p>aaa:{{$route.params.aaa}}  bbb:{{$route.params.bbb}} id:{{$route.params.id}}</p>
			<pre><code>
				{{JSON.stringify($route,null,2)}}
			</code></pre>
		</div>
	`
}).$mount('#app');

6.路由表中的组件群

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const first = {template:'<div>first内容</div>'}
const second = {template:'<div>second内容</div>'}
const Home = {template:'<div>Home内容</div>'}
const hehe = {template:'<div>hehe内容</div>'}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
	    // 路由组件群
		{path:'/',components:{
			default:Home,
			left:first,
			right:second
		}},
		{path:'/first',components:{
			default:hehe,
			left:first,
			right:second
		}},
	]
})

new Vue({
	router,
	template:`
		<div id='r'>
			<h1>导航</h1>
			<p>{{$route.name}}</p>
			<ol>
				<li><router-link to='/'>/</router-link></li>
				<li><router-link to='/first'>/first</router-link></li>
			</ol>
			<!--路由组件群-->
			<router-view></router-view>
			<router-view name="left" style="float:left;width:50%;background-color:orange;height:50px;"></router-view>
			<router-view name="right" style="float:right;width:50%;background-color:red;height:50px;"></router-view>
		</div>
	`
}).$mount('#app')

7.url传值

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/'},
		{path:'/params/:aaa/:bbb'}, //非正则
		{path:'/params-regex/:id(\\d+)'}  // 正则传参
	]
})

new Vue({
	router,
	template:`
		<div>
			<h1>Good Morning</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<!--非正则-->
				<li><router-link to="/params/111/222">/params/111/222</router-link></li>
				<!--正则-->
				<li><router-link to="/params-regex/222">/params-regex/222</router-link></li>
			</ul>
			<p>Show</p>
			<p>aaa:{{$route.params.aaa}}  bbb:{{$route.params.bbb}} id:{{$route.params.id}}</p>
			<pre><code>
				{{JSON.stringify($route,null,2)}}
			</code></pre>
		</div>
	`
}).$mount('#app');

8.query&append;&exact;

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const users = {
	template:`
		<div>
			<h2>Users</h2>
			<router-view></router-view>
		</div>
	`
}

const user = {
	template:`
		<div>
		    {{$route.params.username}}
		    {{$route.query.aaa}}
		    {{$route.params.id}}
		</div>
	`
}

const Home = {template:'<div><h2>Home</h2></div>'}
const about = {template:'<div><h2>about</h2></div>'}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',name:'Home',component:Home},
		{path:'/',name:'about',component:about},
		{path:'/users',component:users,
		      children:[
		      	{path:':username',name:'user',component:user}
		      ]
		},
	]
})

new Vue({
	router,
	template:`
		<div id='r'>
			<h1>导航</h1>
			<ol>
			  <li><router-link to="/">/</router-link></li>
			  <li><router-link to="/first">/first</router-link></li>
			  	<ol>
			  	   <li>
			  	      <router-link :to="{path:'/users/wos',query:{aaa:'bbb'}}">
			  	        wos
			  	      </router-link>
			  	   </li>
			  	   <li>
			  	      <router-link to="about" append>
			  	        append
			  	      </router-link>
			  	   </li>
			  	   <li>
			  	      <router-link to="about" exact>
			  	        exact
			  	      </router-link>
			  	   </li>
			  	</ol>
			</ol>
			<router-view></router-view>
		</div>
	`
}).$mount('#app')

9.路由重定向

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const first = {template:'<div>first內容</div>'}
const second = {template:'<div>second內容</div>'}
const Home = {template:'<div>home內容</div>'}
const ab = {
		template:`
			<div class="asdf">
				<h2>组件</h2>
				<router-view class='asdf'></router-view>
			</div>
		`
	}
const firstFirst =  {template:'<div>firstFirst內容{{$route.params.id}}</div>'}
const firstSecond =  {template:'<div>firstSecond內容</div>'}

const router = new VueRouter({
	mode:'history',
	base:__dirname, //当前路径
	routes:[
		{path:'/',component:Home},
		{path:'/second',component:second},
		{path:'/first',component:ab,
			children:[
				{path:'/',component:first},
				{path:'first',component:firstFirst},
				{path:'second',component:firstSecond},
				// 路由重定向
	     		{path:'third',redirect:'first'},
			]},
	    //重定向传参
	    {path:'/aaa/:id',component:firstFirst},
	    {path:'/bbb/:id',redirect:'/aaa/:id'},

	    // 使用函数
	    {
	    	path:'/ccc/:id',
	    	redirect:xxxx => {
	    		const { hash,params,query} = xxxx;
	    		if(params.id == '001'){
	    			return '/'
	    		}
	    	}
	    }
	    
	]
})

// 模板
new Vue({
	router,
	template:`
		<div id='r'>
		    <h1>导航</h1>
		    <ol>
		    	<li><router-link to="/">/</router-link></li>
		    	<li><router-link to="/first">first</router-link></li>
		    	<ol>
		    	   <li><router-link to="/first/first">/first/first</router-link></li>
		    	   <li><router-link to="/first/second">/first/second</router-link></li>
		    	    <!--路由重定向-->
		    	   <li><router-link to="third">third</router-link></li>
		    	</ol>
		    	<li><router-link to="/second">second</router-link></li>

		    	<li><router-link to="/aaa/123">aaa</router-link></li>
		    	<li><router-link to="/bbb/456">bbb</router-link></li>
		    	<li><router-link to="/ccc/001">ccc</router-link></li>

		    </ol>
		    <router-view class="sadfj"></router-view>
		 </div>
		 `
}).$mount('#app')

10.alias别名

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const first = {template:'<div>first內容</div>'}
const second = {template:'<div>second內容</div>'}
const Home = {template:'<div>home內容</div>'}
const ab = {
		template:`
			<div class="asdf">
				<h2>组件</h2>
				<router-view class='asdf'></router-view>
			</div>
		`
	}
const firstFirst =  {template:'<div>firstFirst內容{{$route.params.id}}</div>'}
const firstSecond =  {template:'<div>firstSecond內容</div>'}

const router = new VueRouter({
	mode:'history',
	base:__dirname, //当前路径
	routes:[
		{path:'/',component:Home},
		// alias 重命名
		{path:'/second',component:second,alias:['/gogo','/abab']},
		{path:'/first',component:ab,
			children:[
				{path:'/',component:first},
				{path:'first',component:firstFirst},
				{path:'second',component:firstSecond},
				// 路由重定向
	     		{path:'third',redirect:'first'},
			]},
	    //重定向传参
	    {path:'/aaa/:id',component:firstFirst},
	    {path:'/bbb/:id',redirect:'/aaa/:id'},

	    // 使用函数
	    {
	    	path:'/ccc/:id',
	    	redirect:xxxx => {
	    		const { hash,params,query} = xxxx;
	    		if(params.id == '001'){
	    			return '/'
	    		}
	    	}
	    }
	    
	]
})

// 模板
new Vue({
	router,
	template:`
		<div id='r'>
		    <h1>导航</h1>
		    <ol>
		    	<li><router-link to="/">/</router-link></li>
		    	<li><router-link to="/first">first</router-link></li>
		    	<ol>
		    	   <li><router-link to="/first/first">/first/first</router-link></li>
		    	   <li><router-link to="/first/second">/first/second</router-link></li>
		    	    <!--路由重定向-->
		    	   <li><router-link to="third">third</router-link></li>
		    	</ol>
		    	<li><router-link to="/second">second</router-link></li>

		    	<li><router-link to="/aaa/123">aaa</router-link></li>
		    	<li><router-link to="/bbb/456">bbb</router-link></li>
		    	<li><router-link to="/ccc/001">ccc</router-link></li>
		    	<!--重命名-->
		    	<li><router-link to="/gogo">gogo</router-link></li>
		    	<li><router-link to="/abab">abab</router-link></li>

		    </ol>
		    <router-view class="sadfj"></router-view>
		 </div>
		 `
}).$mount('#app')

11. 路由的过渡动画

      1.修改main.js文件

              

import Vue from 'vue'
 // 路由动画
 import tranistion from './tranistion.vue'
 new Vue({
 	el:'#demo',
 	render:xx=>xx(tranistion)
 })

       修改完之后修改最外面的index.html

        

//body中添加
<div id="demo"></div>

        2.新建tranistion.vue并编辑

           

<template>
	<div>
		<button v-on:click="show =! show"> show/hide text</button>
		<transition name="fade">
			<p v-if="show">Hello world</p>
		</transition>
	</div>
</template>

<script>
	export default{
		name:'demo',
		data (){
		  return{
		      show:true
		  }
		}
	}
</script>

<style scoped>
	.fade-enter-active,.fade-leave-active{
	   transition:opacity .5s
	}
	.fade-enter,.fade-leave-active{
	  opacity:0
	}
</style>

     编辑完成运行:npm run vue

    点击切换效果out-in

// main.js文件
import Vue from 'vue'
import Router from './Router'
// router.js文件
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const Home = {
	template:`
		<div>
			<h2>Home</h2>
			<p>This is Home</p>
		</div>
	`
}

const Parent = {
	template:`
		<div>
			<h2>Parent</h2>
			<p>This is Parent</p>
		</div>
	`
}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',component:Home},
		{path:'/Parent',component:Parent}
	]
})

new Vue({
	router,
	template:`
		<div id="app">
			<h1>This is Transition</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<li><router-link to="/Parent">/Parent</router-link></li>
			</ul>
			<transition name="fade" mode="out-in">
				<router-view></router-view>
			</transition>
		</div>
	`
}).$mount('#app')

12.watch监控动画

修改index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>helloworld</title>
    <style type="text/css">
    	a.router-link-active{
    		color:#f66;
    	}
    	li.router-link-active a{
    		color:#f66;
    	}
    	.fade-enter-active,.fade-leave-active{
    		transition: opacity .5s
    	}
    	.fade-enter,.fade-leave-active{
    		opacity: 0
    	}
    	.fade2-enter-active,.fade2-leave-active{
    		transition: background 0.5s ease-in,color 0.3s ease-out
    	}
    	.fade2-enter,.fade2-leave-active{
    		background-color:#f6f6f6;
    		color:red;
    	}
    </style>
  </head>
  <body>
    <div id="app"></div>
    <div id="demo"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

  修改Router.js

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const Home = {
	template:`
		<div>
			<h2>Home</h2>
			<p>This is Home</p>
		</div>
	`
}

const Parent = {
	template:`
		<div>
			<h2>Parent</h2>
			<p>This is Parent</p>
		</div>
	`
}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',component:Home},
		{path:'/Parent',component:Parent}
	]
})

new Vue({
	router,
	// 绑定数据
	data(){
		return {
			aaa:'fade'
		}
	},
	template:`
		<div id="app">
			<h1>This is Transition</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<li><router-link to="/Parent">/Parent</router-link></li>
			</ul>
			<!--数据绑定-->
			<transition :name="aaa" mode="out-in">
				<router-view></router-view>
			</transition>
		</div>
	`,
	// 监听渐变
	watch:{
		"$route"(to,from){
			if(from.path == '/Parent'){
				this.aaa = 'fade'
			}else{
				this.aaa = 'fade2'
			}
		}
	}
}).$mount('#app')

13.404页面和引入.vue文件

import Vue from 'vue'
import VueRouter from 'vue-router'
import Parent from './tranistion.vue'
Vue.use(VueRouter)

const Home = {
	template:`
		<div>
			<h2>Home</h2>
			<p>This is Home</p>
		</div>
	`
}

// const Parent = {
// 	template:`
// 		<div>
// 			<h2>Parent</h2>
// 			<p>This is Parent</p>
// 		</div>
// 	`
// }

// 404模板
const page404 = {
	template:`
		<div>
			<h2>error:404</h2>
		</div>
	`
}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',component:Home},
		{path:'/Parent',component:Parent},
		// 404
		{path:'*',component:page404}
	]
})

new Vue({
	router,
	// 绑定数据
	data(){
		return {
			aaa:'fade'
		}
	},
	template:`
		<div id="app">
			<h1>This is Transition</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<li><router-link to="/Parent">/Parent</router-link></li>
				<!--404-->
				<li><router-link to="/fafdafa">where no here</router-link></li>
			</ul>
			<!--数据绑定-->
			<transition :name="aaa" mode="out-in">
				<router-view></router-view>
			</transition>
		</div>
	`
}).$mount('#app')

14.路由里的勾子

import Vue from 'vue'
import VueRouter from 'vue-router'
//import Parent from './tranistion.vue'
Vue.use(VueRouter)

const Home = {
	template:`
		<div>
			<h2>Home</h2>
			<p>This is Home</p>
		</div>
	`
}

const Parent = {
	template:`
		<div>
			<h2>Parent</h2>
			<p>This is Parent</p>
		</div>
	`
}

// 404模板
const page404 = {
	template:`
		<div>
			<h2>error:404</h2>
		</div>
	`,//钩子
	beforeRouteEnter:(to,from,next)=>{
		console.log(to)
		console.log(from)
		next()
	},
	beforeRouteLeave:(to,from,next)=>{
		console.log(to)
		console.log(from)
		next()
	},
}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',component:Home},
		{path:'/Parent',component:Parent,
			beforeEnter:(to,from,next) =>{
				//路由中的钩子
				console.log(to)
				console.log(from)
				next({path:'/alkdflakfj'})
			}
		},
		// 404
		{path:'*',component:page404}
	]
})

new Vue({
	router,
	// 绑定数据
	data(){
		return {
			aaa:'fade'
		}
	},
	template:`
		<div id="app">
			<h1>This is Transition</h1>
			<ul>
				<li><router-link to="/">/</router-link></li>
				<li><router-link to="/Parent">/Parent</router-link></li>
				<!--404-->
				<li><router-link to="/fafdafa">where no here</router-link></li>
			</ul>
			<!--数据绑定-->
			<transition :name="aaa" mode="out-in">
				<router-view></router-view>
			</transition>
		</div>
	`
}).$mount('#app')

15.编程式导航(前进 后退 返回首页)

import Vue from 'vue'
import VueRouter from 'vue-router'
//import Parent from './tranistion.vue'
Vue.use(VueRouter)

const Home = {
	template:`
		<div>
			<h2>Home</h2>
			<p>This is Home - {{$route.query.a}}</p>
		</div>
	`
}

const Parent = {
	template:`
		<div>
			<h2>Parent</h2>
			<p>This is Parent</p>
		</div>
	`
}

// 404模板
const page404 = {
	template:`
		<div>
			<h2>error:404</h2>
		</div>
	`,//钩子
	beforeRouteEnter:(to,from,next)=>{
		console.log(to)
		console.log(from)
		next()
	},
	beforeRouteLeave:(to,from,next)=>{
		console.log(to)
		console.log(from)
		next()
	},
}

const router = new VueRouter({
	mode:'history',
	base:__dirname,
	routes:[
		{path:'/',component:Home},
		{path:'/Parent',component:Parent},
		{path:'/test',component:test},
		{path:'*',component:page404},
	]
})

const test = {
	template:`
		<div>
			<h2>测试404是否能显示</h2>
		</div>
	`
}

new Vue({
	router,
	// 绑定数据
	data(){
		return {
			aaa:'fade'
		}
	},
	template:`
		<div id="app">
			<button v-on:click="houtui">后退</button>
			<button v-on:click="qianjin">前进</button>
			<button v-on:click="home">返回首页</button>
			<button v-on:click="query">query</button>
			<ul>
				<li><router-link to="/?a=1&b=22">/</router-link></li>
				<li><router-link to="/Parent">/Parent</router-link></li>
				<!--404-->
				<li><router-link to="/fafdafa">where no here</router-link></li>
			</ul>
			<!--数据绑定-->
			<transition :name="aaa" mode="out-in">
				<router-view></router-view>
			</transition>
		</div>
	`,
	methods:{
		houtui:function(){
			router.go(-1)
		},
		qianjin:function(){
			router.go(1)
		},
		home:function(){
			console.log(router)
			router.push("/")
		},
		query:function(){
			router.push({path:'/',query:{a:1,b:22}})
		}
	}
}).$mount('#app')

      接下来探秘vuex,敬请期待。。。

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2019ab

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值