Vue.js之路由
以前的跳转都是使用a标签,a标签里有一个属性叫href,给他一个对应的网络地址或者一个路径的话,它就会帮助跳转到对应的页面。
Vue.js的路由,其实跟我们的a标签实现的功能是一样的,我们也是实现一个对应的跳转,只不过路由的性能更优化,a标签不管点击多少次,都会发生对应的网络请求,页面会不停地进行页面刷新,但是路由不一样,只要使用路由机制的话,你只要点击之后,他不会出现我们的请求以及页面刷新,直接就转换到你要去的地址,这是我们使用路由的好处。
要使用路由,需要先安装路由模块,在IDE的Terminal中输入这句话: npm install vue-router --save-dev 来安装。
安装路由模块以后就可以在项目里使用路由了。
使用路由首先要在main.js当中进行设置,通过 import VueRouter from 'vue-router' 将我们的路由模块先引进来,然后在下面通过 Vue.use(VueRouter) 使用一下引用进来的模块。
使用路由以后就可以在下面进行配置路由了:
1 const router = new VueRouter({ 2 routes:[ 3 {path:'/',component:Home}, 4 {path:'/helloworld',component:HelloWorld} 5 ], 6 mode:"history" 7 })
path是要路由的地址,component是抓取到地址后要跳转到的组件。这里要跳转到的组件也要在main.js中引入.
例如: import HelloWorld from './components/HelloWorld' 和 import Home from './components/Home'
一个小demo
main.js文件:
1 import Vue from 'vue' 2 import VueRouter from 'vue-router' 3 import App from './App' 4 import HelloWorld from './components/HelloWorld' 5 import Home from './components/Home' 6 7 Vue.config.productionTip = false 8 Vue.use(VueRouter) 9 10 //配置路由 11 const router = new VueRouter({ 12 routes:[ 13 {path:'/',component:Home}, 14 {path:'/helloworld',component:HelloWorld}, 15 ], 16 mode:"history" 17 }) 18 19 new Vue({ 20 router, 21 el: '#app', 22 components: { App }, 23 template: '<App/>' 24 })
要在路由中加 mode:”history“ ,否则项目地址会多出 localhost:8080/#/ ,会影响我们项目的功能。
Home.vue文件:
1 <!--模板-->
2 <template>
3 <div id="home">
4 <app-header @titleChanged="updateTitle($event)" :title="title"></app-header>
5 <users :users="users"></users>
6 <app-footer></app-footer>
7 </div>
8 </template>
9
10 <!--行为-->
11 <script>
12 //局部注册组件
13 import Users from './Users'
14 import Header from './Header'
15 import Footer from './Footer'
16
17 export default {
18 name: 'home',
19 data(){
20 return {
21 users:[
22 {name:"Henry",Position:"Java工程师",show:false},
23 {name:"Lily",Position:"Java工程师",show:false},
24 {name:"Kang",Position:"Java工程师",show:false},
25 {name:"Henry",Position:"Java工程师",show:false},
26 {name:"Henry",Position:"Java工程师",show:false}
27 ],
28 title:"这是一个title!"
29 }
30 },
31 methods:{
32 updateTitle:function (title) {
33 this.title = title;
34 }
35 },
36 components:{
37 "users":Users,
38 "app-header":Header,
39 "app-footer":Footer
40 }
41
42 }
43 </script>
44
45 <!--样式-->
46 <style >
47
48 h1{
49 color: pink;
50 }
51 </style>
HelloWorld.vue文件:
1 <template>
2 <div class="hello">
3 hello,world!
4 </div>
5 </template>
6
7 <script>
8 export default {
9 name: 'HelloWorld',
10 data () {
11 return {
12 }
13 }
14 }
15 </script>
16
17 <!-- Add "scoped" attribute to limit CSS to this component only -->
18 <style scoped>
19
20 </style>
Header.vue文件:
1 <template> 2 <header @click="changeTitle"> 3 <h1>{{title}}</h1> 4 </header> 5 </template> 6 7 <script> 8 export default { 9 name: 'app-header', 10 data () { 11 return { 12 title1:"Vue.js Demo" 13 } 14 }, 15 props:{ 16 title:{ 17 type:String 18 } 19 }, 20 methods:{ 21 changeTitle:function(){ 22 this.$emit("titleChanged","子向父组件传值"); 23 } 24 } 25 } 26 </script> 27 28 <style scoped> 29 header{ 30 background: pink; 31 padding: 10px; 32 } 33 h1{ 34 color: #222; 35 text-align: center; 36 } 37 </style>
Footer.vue文件:
1 <template> 2 <footer> 3 <p>{{copyright}}</p> 4 </footer> 5 </template> 6 7 8 <script> 9 export default { 10 data () { 11 return { 12 copyright:"Copyright 2018 Vue Demo" 13 } 14 } 15 } 16 </script> 17 18 <style scoped> 19 footer{ 20 background: #666; 21 padding: 6px; 22 } 23 footer p{ 24 color: pink; 25 text-align: center; 26 } 27 </style>
User.vue文件:
1 <template> 2 <div class="users"> 3 <ul> 4 <li v-for="user in users" 5 @click="user.show = !user.show"> 6 <h2 >{{user.name}}</h2> 7 <h3 v-show="user.show">{{user.Position}}</h3> 8 </li> 9 </ul> 10 </div> 11 </template> 12 13 <script> 14 export default { 15 name: 'users', 16 // props:['users'] 17 props:{ 18 users:{ 19 type:Array, 20 required:true 21 } 22 } 23 } 24 </script> 25 26 <style scoped> 27 .users{ 28 100%; 29 max- 1200px; 30 margin:40px auto; 31 padding: 0 20px; 32 box-sizing: border-box; 33 } 34 ul{ 35 display: flex; 36 flex-wrap: wrap; 37 list-style-type: none; 38 padding: 0; 39 } 40 li{ 41 flex-grow: 1; 42 flex-basis: 200px; 43 text-align: center; 44 padding: 30px; 45 border: 1px solid #666; 46 margin: 10px; 47 } 48 </style>
然后在App.vue文件中加入导航;
App.vue文件:
1 <!--模板--> 2 <template> 3 <div id="app"> 4 <ul> 5 7 <li> <router-link to="/">Home</router-link> </li> 8 <li> <router-link to="/helloworld">Hello</router-link> </li>
9 </ul> 10 <router-view></router-view> 11 </div> 12 </template> 13 <!--行为--> 14 <script> 15 16 export default { 17 name: 'App', 18 data(){ 19 return { 20 } 21 }, 22 methods:{ 23 } 24 } 25 </script> 26 <!--样式--> 27 <style > 28 29 </style>
这里如果使用 <a href=""></a> 标签,点击时候会跳转和刷新页面,而使用路由 <router-link to=""></router-link> 则不会,to跟a标签里的href是一样的.
文章摘自:https://www.cnblogs.com/jin-zhe/p/8317657.html,并添加部分内容。