浅入深出Vue:路由
路由的概念在计算机界中的历史大概可以追溯到OSI模型中的数据链路层与网络层中的定义。这里的定义大意是:在转发数据包时,根据数据包的目的地址进行寻址,从而将数据包发往指定的目的地。
在 Web开发中同样存在着路由的概念,在各式各样的前端 mvvm框架出来之前,普遍存在于后端。通俗的说法也就是 [module/]controller/action
的组合,将 url映射到指定的 action
中处理。现在在前端中同样存在着路由这一概念。
为什么需要路由
在以往的前端开发中,通常没有路由这一概念,这样就造成一个问题:
- 前端是离散的,不可独立的(静态页面除外,它不需要上下文)。
脱离了后端的前端无法较好的构建一个完整系统,当然也有一些比较优秀的方案:
- 单页应用,采用 ajax控制 dom节点以及动态修改页面内容
等等。
但不可否认的是,在没有路由这一概念的情况下,前端确实显得不够灵活,跳转页面时随处可见的路径硬编码。url 即物理路径。
为了完善前端开发,在后来的框架中,均引入了路由、控制器、视图等后端概念。借鉴成熟的东西来完善自身,这是非常便捷的一种方式。
因此在现在的前端开发中,路由也是必不可少的一环了。很多人被它的概念弄的晕头转向,让我们捋一捋,看看它的真面目。
路由是什么
前端中的路由更好理解。以 vue
举例,vue-router
会解析 url,将其映射到指定的 component进行渲染。因此,在这里我们给 vue
中的路由一个通俗的、狭义的定义:
- 一个 url,对应着一个具体的组件实例。
路由是对 url进行解析,看这个 url是否存在有与之匹配的组件去渲染。
路由如何使用
在vue
中分为三步:
1. 安装vue-router
组件。
可以查看 package.json
,看是否安装了 vue-router
。没有的话安装一下即可。
在 vue-cli 3.x
中,可以直接在左侧面板中的依赖里查看到,并且一键安装。
2. 使用vue-router
在 main.js
中全局引入一下:
import Router from 'vue-router'
Vue.use(Router)
3. 定义路由
在这一步,我们要定义路由。
即我们想让哪些 url解析到哪些组件上去,来看看官方的例子:
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
}
]
})
例子中的 routes
数组中有一个路由对象,这个路由对象定义了如下的路由:
url 对应根,即服务器web地址。
此路由的名称是
HelloWorld
,路由的名称可以用以路由间的跳转,但必须保证唯一。此路由对应的组件是
HelloWorld
组件,这个组件在第三行代码中引入了。
以上三点也是定义一个路由对象的基本要素,第二点非必须。
定义子路由
现在我们有 localhost/
的路由了,如果再加一个 localhost/login
的路由呢?
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld,
children: [
{
path: 'login',
name: 'Login',
component: Login
}
]
}
]
})
只需要在对应的路由对象下添加 children
数组即可,数组内的对象的 path
只需填相对路由即可。这里的例子可是不能运行成功噢,哪怕实现了 Login
组件也不能看到预期的效果。
还有一点最重要的需要注意:
- 在子路由/嵌套路由的情况下,想要层层渲染到子路由/嵌套路由,必须在其上层路由对象的模板中,添加
<router-view>
组件,让vue-router
能继续往下渲染。
代码:
<router-view :key="$route.fullPath"></router-view>
很多童鞋就是被卡在这里了,还有另一种写法:
<router-view></router-view>
多级路由也是这么层层定义出来的。
路由间的跳转
在引入 vue-router
之后,在组件中可以使用如下语句获取 vue-router
实例:
this.$router
// 通过路由跳转,下面的代码会跳转到 localhost/login
this.$router.push('/login')
// 通过命名跳转, 下面的代码同样会跳转到 localhost/login
this.$router.push({ name : 'Login' })
// 路由带参数跳转
this.$router.push({
path: '/login',
query: {
username: 'xxx',
}
})
// 命名路由带参数跳转
this.$router.push({
name: 'Login',
params: {
username: 'xxx',
}
})
上述在带参数跳转的例子中,需要着重注意的一点:
- 当使用
path
跳转时,参数只能使用query
,不能使用params
也就是说,下面的代码是不能正常传递参数的:
this.$router.push({
path: '/login',
params: {
username: 'xxxx',
}
})
在视图中可以使用如下代码进行跳转:
<router-link :to="{ path: '/login'}">login</router-link>
重点:
- 不管是
this.$router.push
的参数,还是router-link
的to
参数,它们都可以是一个路由对象
记住这一点,就可以随心所欲的玩转跳转了。
写在最后
路由这篇没有demo演示,因为路由这部分想要更好的结合实践来学习的话,最好利用实战来学习。
因此这里只讲述了路由的概念和基本用法,以及使用中常见的几个问题。
我们在入门篇会经常使用到它的,会有更多的机会去深入的了解它,深入篇也会对它进行一个更深入的了解:如何自动化生成路由。
浅入深出Vue:路由的更多相关文章
- 浅入深出Vue:前言
浅入深出Vue系列文章 之前大部分是在做后端,后来出于某些原因开始接触Vue.深感前端变化之大,各种工具.框架令人眼花缭乱.不过正是这些变化,让前端开发更灵活. 博主在刚开始时,参考官网的各个步骤以及 ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- 浅入深出Vue:工具准备之WebStorm安装配置
浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...
- 浅入深出Vue系列
浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...
- 浅入深出Vue:第一个页面
今天正式开始入门篇,也就是实战了~ 首先我们是要做一个博客网站,UI 框架采用江湖传闻中的 ElementUI,今天我们就来利用它确定我们博客网站的基本布局吧. 准备工作 新建一个vue项目(可以参考 ...
- 浅入深出Vue:文章列表
终于到我们小项目的最后一个功能了,那就是列表页展示! 新建组件 先来新建组件 List.vue: <template> <div></div> </templ ...
- 浅入深出Vue:代码整洁之封装
深入浅出vue系列文章已经更新过半了,在入门篇中我们实践了一个小小的项目. <代码整洁之道>一书中提到过一句话: 神在细节中 这句话来自20世纪中期注明现代建筑大师 路德维希·密斯·范·德 ...
- 浅入深出Vue:自动化路由
在软件开发的过程中,"自动化"这个词出现的频率是比较高的.自动化测试,自动化数据映射以及各式的代码生成器.这些词语的背后,也说明了在软件开发的过程中,对于那些重复.千篇一律的事情. ...
随机推荐
- flash导出正常清晰(无色差)GIF图片
前言: 这枚GIF算是半临摹作品.我使用的FLASH制作这个小动画,其实这类型的动画用AE做会更便捷. 进入主题前,先摆出个成品 教程结束,以上就是flash制作出来的小动画怎么导出正常清晰(无色差) ...
- HDU5187 zhx's contest(计数问题)
主题链接: http://acm.hdu.edu.cn/showproblem.php?pid=5187 题意: 从1~n,有多少种排列 使得 a1~ai 满足单调递增或者单调递减. ai~an 满足 ...
- Angular升级流程
执行命令 ng update @angular/cli --migrate-only --from=1.7.1 npm install --save-dev @angular/cli@latest 注 ...
- 通通玩blend美工(6)上——仿iPhone滚动选择器的ListBox(UI设计)
原文:通通玩blend美工(6)上--仿iPhone滚动选择器的ListBox(UI设计) 好久没更新博客了,由于项目比较紧,期间收到不少园友的短消息,感谢大家对我的支持~~. 相信各位都在自己的神机 ...
- WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条
原文:[全面解禁!真正的Expression Blend实战开发技巧]第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条 这一章讲解FluidMoveBehavior的另一个应用, ...
- NUGET源不存在,安装Nuget包提示“本地源不存在”
困扰了两天的问题,终于找到原因了.因此来这里记录一下~ 前两天写项目时,要从NUGET上安装个第三方库,但不管是从可视化的管理器还是管理器控制台安装,都提示“本地源‘*******’不存在”.然后到网 ...
- 深入理解Amazon Alexa Skill(三)
本节来讨论Alexa Skill中涉及到的授权问题. Alexa内功能的授权 Alexa会发给skill用户的token,然后skill代码使用这个token来访问Web API访问用户的Alexa内 ...
- CROSS JOIN
原文:CROSS JOIN 最近在讲到T-SQL查询的Join部分时,一下子没有想起来CROSS JOIN的用法,因为其实平常也确实基本不用到.特意找了一个例子,以供参考 CROSS JOIN又称为笛 ...
- libjingler-0.6.2在windows和ubuntu 10.04下的编译(Google Talk)
Libjingle版本:0.6.2 所需的资源: gtest-1.6.0.zip http://download.csdn.net/detail/cl_gamer/48 ...