如何正确使用vue-router


一、vue-router是什么?

路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮 => home 内容about按钮 => about 内容
简易路由演示

二、路由的一些概念

路由中有三个基本的概念 route, routes, router,以下可大致阅读,了解概念即可

1, route,它指的是单条路由, 就像 Home按钮 => home内容, 这是一条路由, about按钮 => about 内容, 这是另一条路由。

2, routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}],其实说白了就是上面route的集合,组成了一个数组

3, router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。

客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。客户端路由有两种实现方式:基于hash 和基于html5 history api.

三、使用步骤

1.页面实现(html模版中)

在vue-router中, 我们看到它定义了两个标签< router-link> 和< router-view>来对应点击和显示部分。< router-link> 就是定义页面中点击的部分,< router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。所以 < router-link> 还有一个非常重要的属性 to,定义点击之后,< router-view>标签里显示那个组件的信息
在这里插入图片描述

<!-- 这边是精简代码,已省略bootstrap样式-->
<router-link  to="/about">About</router-link>
<router-link  to="/home">Home</router-link>

<router-view></router-view>

2.js配置路由

首先配置route,它是一个对象,由两个部分组成: path和component. path 指路径,component 指的是组件,由于我们有home和about两条路由,组成一个routes:

//定义路由数组
const routes = [
	// 路径:'/home' 指向组件Home
  {
    path: '/home',
    component: Home
  },
  // 路径:'/about' 指向组件About
  {
    path: '/about',
    component: About
  }
];

最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。由于我直接新建了一个router.js文件接收VueRouter,所以这里直接导出,由main.js接收

export default new VueRouter({
  routes
})

配置完成后,把导出的vueRouter注入到 vue 根实例中,就可以使用路由了

new Vue({
  render: h => h(App),
  router
}).$mount('#app');

执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: ‘/home’, component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 标签所在的地方。所有的这些实现才是基于hash 实现的。

四、脚手架-路由demo实践

  1. 首先创建一个vue-cli,并安装vue-router(不装还想用?可能吗),创建安装过程基本操作,这里忽略,先看下需要创建的目录结构
    路由目录结构

  2. 在component 目录下新建两个组件,home.vue 和 about.vue

<template>
	<h2>我是Home的内容</h2>
</template>

<script>
	export default {
		name:'Home'
	}
</script>
<template>
	<h2>我是About的内容</h2>
</template>

<script>
	export default {
		name:'About'
	}
</script>
  1. 在 App.vue中 定义<router-link > 和 </router-view> ,这里引入了bootstrap样式,重点看<router-link > 和 </router-view>标签就行
<template>
  <div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-8">
        <div class="page-header"><h2>Vue Router Demo</h2></div>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-2 col-xs-offset-2">
        <div class="list-group">


		  <!-- Vue中借助router-link标签实现路由的切换 -->
		  <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
          <router-link class="list-group-item" active-class="active" to="/home">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>
	export default {
		name:'App',
	}
</script>

  1. 接着就是重头戏了,在 src目录下再新建一个router目录,这样以后路由配置多配置起来不会那么手忙脚乱,再在router目录下新建index.js, 定义router, 就是定义 路径到 组件的 映射。
import Vue from "vue";
import VueRouter from "vue-router";
import About from "../components/About";
import Home from "../components/Home";
Vue.use(VueRouter); //这步很关键,不use别想用
const routes = [
  {
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  }
];
export default new VueRouter({
  routes
})

文件里的routes数组也可以单独拎出来新建一个route.js来导出,再在route/index.js导入,这里路由配置不多就不展开了

  1. 把路由注入到根实例中,启动路由。这里其实还有一种方法,就像vuex store 注入到根实例中一样,我们也可以把vueRouter 直接注入到根实例中。在main.js中引入路由,注入到根实例中。
import Vue from 'vue'
import App from './App.vue'
 
// 引入路由
import router from "./router.js"    // import router 的router 一定要小写, 不要写成Router, 否则报 can't match的报错
new Vue({
  el: '#app',
  router,  // 注入到根实例中
  render: h => h(App)
})

这是就大功告成了,不过运行后会发现首次进入页面,<router-view>没有任何内容,这是肯定的,因为我们只定义了’/home’路径和’/about’路径,根路径还没定义呢,可是试图写{ path: ‘/’, component: Home }时vue会报错,因为两条路径却指向同一个方向,这时候重定向就派上用场了,直接上代码:

const routes = [
  {
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  },
  //重定向,根路径直接跳到'/home'去
  {
    path: '/',
    redirect: '/home'
  }
];

现在页面正常了,首次进入显示home, 并且点击也可以看到内容的切换

五、动态路由

1.何为动态路由

动态路由说起来虚无缥缈,其实就是根据路径参数不同让组件显示不同信息。就比如写用户的信息页面时,页面的结构都一样,只是显示的用户的名称不一样,这个时候就可以使用动态路由

2.动态路由实现

在原先的app组件中多添加两个router-link标签, 最后在router中添加路由配置,来体验一下

 <!-- 添加两个动态路由-->
<router-link class="list-group-item" active-class="active" to="/user/1">User1</router-link>
<router-link class="list-group-item" active-class="active" to="/user/2">User2</router-link>

router/index.js 配置user动态路由

const routes = [
    {
        path:"/home",
        component: home
    },
    {
        path: "/about",
        component: about
    },
    {
        path: '/', 
        redirect: '/home' 
    },
    
    /*新增user路径,配置了动态的id*/
    {
        path: "/user/:id",
        component: user
    }
]

component目录下添加User组件,这里用计算属性computed来接收动态部分内容,其实,当整个vue-router 注入到根实例后,在组件的内部,可以通过this.$route 来获取到 router 实例。它有一个params 属性,就是来获得这个动态部分的。它是一个对象,属性名,就是路径中定义的动态部分 id, 属性值就是router-linkto 属性中的动态部分,如1和2。使用vuex时,组件中想要获取到state 中的状态,是用computed 属性,在这里也是一样,在组件中,定义一个computed 属性userId:

<template>
  <div>
    <h2>我是User的内容</h2>
    这是动态传过来的内容{{userId}}
  </div>
	
</template>

<script>
	export default {
	  name:'User',
      computed: {
	    userId(){
	      return this.$route.params.id
	    }
    }
	}
</script>

至此,完成,下面是演示
动态路由演示

六.嵌套路由

1.为什么要使用嵌套路由?

其实就是一个路由下面再嵌套一组路由,具体就是用children再包裹一层路由组

举个例子:当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。

2.弄个demo看看

在home组件再添加两组<router-link>和一个<router-view>

<template>
	<div>
		<h2>我是Home的内容</h2>
		<div class="row">
			<div class="col-xs-6">
				<div class="list-group">
					<!-- router-link 的to属性要注意,路由是先进入到home,然后才进入相应的子路由如 phone,所以书写时要把 home 带上 -->
					<router-link class="list-group-item" active-class="active" to="/home/phone">手机</router-link>
					<router-link class="list-group-item" active-class="active" to="/home/tablet">平板</router-link>
				</div>
				<router-view></router-view>
			</div>
	</div>
	</div>
</template>

最后,重点是修改下route/index.js

const routes = [
  {
    path: '/home',
    component: Home,
    children:[
      {
        path: 'phone',
        component: Phone
      },
      {
        path: 'tablet',
        component: Tablet
      }
    ]
  },
  {
    path: '/about',
    component: About
  },
  {
    path: '/user/:id',
    component: User
  },
  {
    path: '/',
    redirect: '/home'
  }
];

最后效果如下
demo4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值