前端路由

根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作

优点

  • 用户体验好,不需要每次都从服务器全部获取,快速展现给用户

缺点

  • 使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存
  • 单页面无法记住之前滚动的位置,无法在前进,后退的时候记住滚动的位置

一、路由(以user为例)

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'     //引入vue
import Router from 'vue-router' //引入vue-router
import userList from '@/components/userList' //引入根目录下的user.vue组件 Vue.use(Router) //vue全局使用Router export default new Router({
routes: [ //配置路由,这里是个数组
{
path: '/userList', //链接路径
name: 'userList', //路由名称
component: userList //对应的组件模板
}
]
})

userList-->用户列表页代码(userList.vue)

<template>
<div>展示用户列表页</div>
</template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

打开网址:http://localhost:8080/#/userList  显示如上模板解析页。

注意:其中 # 为哈希,mode:hash 若要用原始类型的网址,则mode:history。

二、动态路由匹配

模式 匹配路径 获取动态路由参数
/user/:username /user/nina $route.params.username
/user?:username /user?username=nina $route.query.username

还是以userList为例

创建一个 userList 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。所以,我们需要在 vue-router 的路由路径中使用『动态路径参数』来达到这个效果。

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList' Vue.use(Router) export default new Router({
routes: [ {
path: '/userList/:userId', //动态设置路由参数
name: 'userList',
component: userList
}
]
})

user-->用户列表页代码(userList.vue)

<template>

  <div>
<div>展示用户列表页</div>
<div>用户ID</div>
<span>{{$route.params.userId}}</span> //获取用户userId
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

打开网址:http://localhost:8080/#/userList/0006 可以看到用userList组件渲染出来的userId显示在页面上。

三、嵌套路由

选项卡,在选项卡中,顶部有数个导航栏,中间显示的是主体内容,这个时候,整个页面是一个路由,然后点击选项卡切换不同的路由来展示不同的内容,这个时候就是路由中嵌套路由。
用户信息列表页,在用户信息列表中,会有用户的基本信息页,用户的密码修改页等也需要路由的嵌套

以userList列表页为例

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import userInfo from '@/components/userInfo'
import changePaw from '@/components/changePaw' Vue.use(Router) export default new Router({
routes: [ {
path: '/userList',
name: 'userList',
component: userList,
children:[
{
path:'userInfo',
name:'userInfo',
component:userInfo
},
{
path:'changePaw',
name:'changePaw',
component:changePaw
}
]
}
]
})

useruserList-->用户列表页代码(userList.vue)

<template>

  <div>
<div>展示用户列表页</div>
<router-link to="/userList/userInfo">用户基本信息页</router-link> //to后必须用绝对地址
<router-link to="/userList/changePaw">修改密码页</router-link>
<div>
<router-view></router-view>
</div> </div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

两个子页面-->用户基本信息页(userInfo.vue)

<template>

  <div>
<div>用户基本信息页</div> </div> </template> <script>
export default {
name: 'userInfo',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

两个子页面-->用户修改密码页(changePaw.vue)

<template>

  <div>
<div>用户修改密码页</div> </div> </template> <script>
export default {
name: 'changePaw',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

打开网址:http://localhost:8080/#/userList 可以看到用userList组件渲染出来页面上,有两个导航(用户基本信息页、用户修改密码页)可以来回切换

四、编程式路由

通过js来实现页面的跳转

  • $router.push("name")
  • $router.push({path:"name"})
  • $router.push({path:"name?a=123"})或者$router.push({path:"name",query:{a:123}})
  • $router.go(1)

(1)先用常用的<router-link>为例

以userList列表页为例,添加跳转到产品中心的链接。

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter',
name:'productCenter',
component:productCenter
}
]
})

useruserList-->用户列表页代码(userList.vue)

<template>

  <div>
<div>展示用户列表页</div>
<router-link to="/productCenter">产品中心页</router-link>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

产品中心页(productCenter.vue)

<template>

  <div>
<div>产品列表页</div> </div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

打开网址:http://localhost:8080/#/userList 可以看到用userList组件渲染出来页面上,有个跳转导航(产品中心页),点击可以跳转到产品中心页。

(2)$router.push("name")   ==》其中如例一中,只改变userList.vue中的跳转方式

<template>

  <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button> //添加跳转事件
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push('/productCenter') //应用js跳转事件进行跳转
}
}
}
</script> <style scoped> </style>

(2)$router.push({path:"name"}) ==》其中如例一中,只改变userList.vue中的跳转方式

<template>

  <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push({path:'/productCenter'})
}
}
}
</script> <style scoped> </style>

(3)$router.push({path:"name?a=123"})或者$router.push({path:"name",query:{a:123}})

==》其中如例一中,只改变userList.vue中的跳转方式,并在产品中心页(productCenter.vue)接收参数用query接收

userList.vue

<template>

  <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push({path:'/productCenter?userId=0001'})
}
}
}
</script> <style scoped> </style>

productCenter.vue-->接收传过来的参数

<template>

  <div>
<div>产品列表页</div>
<div>接收参数
<span>{{$route.query.userId}}</span> //接收页面切换过来的参数
</div>
</div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
注意组件与组件之前路由切换的时候传递用params
页面之间的切换(比如?拼接的方式)传递用jquery

五、命名路由和命名视图

  • 给路由定义不同的名字,根据路由的名字进行匹配
  • 给不同的router-view定义名字,通过名字进行对应组件的渲染

(1)命名路由

以userList列表页为例,添加跳转到产品中心的链接。

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter',
name:'productCenter', //定义路由的名字
component:productCenter
}
]
})

useruserList-->用户列表页代码(userList.vue)

<template>

  <div>
<div>展示用户列表页</div>
<router-link v-bind:to="{name:'productCenter'}">产品中心页</router-link> //跳转到与路由名字相同的路由地址
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

产品中心页(productCenter.vue)

<template>

  <div>
<div>产品列表页</div> </div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

(2)跳转到产品中心的路由为动态路由

userList-->用户列表页的路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter/:userId', //为动态路由
name:'productCenter',
component:productCenter
}
]
})

useruserList-->用户列表页代码(userList.vue)

<template>

  <div>
<div>展示用户列表页</div>
<router-link v-bind:to="{name:'productCenter',params:{userId:0001}}">产品中心页</router-link> //跳转到与路由名字相同的路由地址,params是路由的参数,不是页面跳转参数
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>

(2)命名视图

路由所加载的代码(router-->index.js)

import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import userInfo from '@/components/userInfo'
import changePaw from '@/components/changePaw' Vue.use(Router) export default new Router({
routes: [
{
path: '/',
name: 'userList',
components: {
default:userList,
userInfo:userInfo,
changePaw:changePaw
}
}
]
})

App.vue-->再浏览器输入根网址后,页面会展示出路由所加载的所有页面信息。

<template>
<div id="app">
<span>ddddddddddddddddddd</span>
<router-view class="main"></router-view>
<router-view class="left" name="userInfo"></router-view>
<router-view class="right" name="changePaw"></router-view>
</div>
</template> <script>
export default {
name: 'App'
}
</script> <style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

路由中的meta

meta字段(元数据)
直接在路由配置的时候,给每个路由添加一个自定义的meta对象,在meta对象中可以设置一些状态,来进行一些操作。用它来做登录校验再合适不过了

{
path: '/actile',
name: 'Actile',
component: Actile,
meta: {
login_require: false
},
},
{
path: '/goodslist',
name: 'goodslist',
component: Goodslist,
meta: {
login_require: true
},
children:[
{
path: 'online',
component: GoodslistOnline
}
]
}

这里我们只需要判断item下面的meta对象中的login_require是不是true,就可以做一些限制了

router.beforeEach((to, from, next) => {
if (to.matched.some(function (item) {
return item.meta.login_require
})) {
next('/login')
} else
next()
})

VUE三 vue-router(路由)详解的更多相关文章

  1. Vue 路由详解

    Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...

  2. vue技术栈进阶(02.路由详解—基础)

    路由详解(一)--基础: 1)router-link和router-view组件 2)路由配置 3)JS操作路由

  3. vue和react全面对比(详解)

    vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...

  4. Ocelot简易教程(三)之主要特性及路由详解

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...

  5. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...

  6. npm安装vue详细教程(图片详解)

    npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...

  7. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  8. vue视图不更新情况详解

    vue视图不更新情况详解:https://www.jb51.net/article/161371.htm

  9. [转载]Ocelot简易教程(三)之主要特性及路由详解

    上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...

  10. iOS路由详解

    本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...

随机推荐

  1. Uber退出东南亚留下烂摊子,给“中国式并购”带来哪些启示

    当下,从全球范围内来看很多互联网企业都采用了"复制+粘贴"的疯狂推进模式.它们往往在某一个国家或地区取得领先优势后,就快速将相同模式在全球推进去占领当地市场.无论结果是一家独大占据 ...

  2. Spring定义Bean的两种方式:和@Bean

    前言:    Spring中最重要的概念IOC和AOP,实际围绕的就是Bean的生成与使用. 什么叫做Bean呢?我们可以理解成对象,每一个你想交给Spring去托管的对象都可以称之为Bean. 今天 ...

  3. python面向对象类的约束和设计的统一化规范

    .封装 定义:将一些东西内容封存到一个地方,你还可以再取出, 类设置静态属性,设置一些方法 对象可以在其对象空间中封装一些属性 2.多态 定义:一个事物的多种形态 就想a可以是一个字符串,可以是一个列 ...

  4. 关于va_list实例

    printf函数: #include <stdio.h> #include <stdarg.h> int myself_printf(char *format, ...) { ...

  5. deeplearning.ai 卷积神经网络 Week 3 目标检测

    本周的主题是对象检测(object detection):不但需要检测出物体(image classification),还要能定位出在图片的具体位置(classification with loca ...

  6. GCC与静态库、动态库

    GCC 常用指令 1 man gcc gcc工作流程例如: gcc hello.c 1234567891011121314 //***第一步***gcc -E hello.c >hello.i ...

  7. 使用jQuery在屏幕上居中一个DIV

    文章目录 我如何去使用jQuery在屏幕的中心设置<div>? 我喜欢给jQuery添加函数,所以这个函数将有助于: jQuery.fn.center = function () { th ...

  8. UFT安装

    1.下载解压双击setup.exe 2.点击安装 3.点击下一步 4.检测是否需要安装插件之后一路向下 5.安装之后图标 下载: 链接:https://pan.baidu.com/s/1sa0h037 ...

  9. revit安装未完成,某些产品无法安装的解决方法

    revit提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装revit失败提示revit安装未完成,某些产品无法安装,也有时候想重新安装revit的时候会出现本 ...

  10. Nginx笔记总结十七:nginx生成缩略图配置(http_image_filter_module)

    编译: ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module-- ...