Vue实现路由跳转和嵌套


Posted in Javascript onJune 20, 2017

一、配置 Router

 用 vue-cli 创建的初始模板里面,并没有 vue-router,需要通过 npm 安装

cnpm i vue-router -D

安装完成后,在 src 文件夹下,创建一个 routers.js 文件,和 main.js 平级

然后在 router.js 中引入所需的组件,创建 routers 对象

import Home from './components/home.vue'

const routers = [
 {
 path: '/home',
 name: 'home',
 component: Home
 },
 {
 path: '/',
 component: Home
 },
]
export default routers

在创建的 routers 对象中, path 配置了路由的路径,component 配置了映射的组件

需要注意的是,export default routers 必须写在文件底部,而且后面还需要接一空行,否则无法通过 ESlint 语法验证

然后 main.js 也需要修改:

import Vue from 'vue'
import VueRouter from 'vue-router'
import routers from './routers'
import App from './App'

Vue.use(VueRouter)

const router = new VueRouter({
 mode: 'history',
 routes: routers
})

new Vue({
 el: '#app',
 router,
 render: h => h(App)
})

在创建的 router 对象中,如果不配置 mode,就会使用默认的 hash 模式,该模式下会将路径格式化为 #! 开头。

添加 mode: 'history' 之后将使用 HTML5 history 模式,该模式下没有 # 前缀,而且可以使用 pushState 和 replaceState 来管理记录。

关于 html5 history 模式的更多内容,可以参考官方文档:https://router.vuejs.org/zh-cn/essentials/history-mode.html

二、嵌套路由

在这个实例中,为了加深项目层级,App.vue 只是作为一个存放组件的容器:

Vue实现路由跳转和嵌套

其中 <router-view> 是用来渲染通过路由映射过来的组件,当路径更改时,<router-view> 中的内容也会发生更改

上面已经配置了两个路由,当打开 http://localhost:8080 或者 http://localhost:8080/home 的时候,就会在 <router-view> 中渲染 home.vue 组件 

home.vue 是真正的父组件,first.vue、login.vue 等子组件都会渲染到 home.vue 中的 <router-view>

Vue实现路由跳转和嵌套

如此一来,就需要在一级路由中嵌套二级路由,修改 routers.js

import Home from './components/home.vue'
import First from './components/children/first.vue'
import Login from './components/children/login.vue'

const routers = [
 {
 path: '/',
 component: Home,
 children: [ 

 { 


path: '/', 
 
  component: Login 

 }

]
 },
 {
 path: '/home',
 name: 'home',
 component: Home,
 children: [
  {
  path: '/',
  name: 'login',
  component: Login
  },
  {
  path: 'first',
  name: 'first',
  component: First
  } 
 ]
 }
]

export default routers

在配置的路由后面,添加 children,并在 children 中添加二级路由,就能实现路由嵌套

配置 path 的时候,以 " / " 开头的嵌套路径会被当作根路径,所以子路由的 path 不需要添加 " / "

三、使用 <router-link> 映射路由

home.vue 中引入了 header.vue 组件,其中含有导航菜单

当点击导航菜单的时候,会切换 home.vue 中 <router-view> 中的内容

这种只需要跳转页面,不需要添加验证方法的情况,可以使用 <router-link> 来实现导航的功能:

Vue实现路由跳转和嵌套

在编译之后,<router-link> 会被渲染为 <a> 标签, to 会被渲染为 href,当 <router-link> 被点击的时候,url 会发生相应的改变

如果使用 v-bind 指令,还可以在 to 后面接变量,配合 v-for 指令可以渲染导航菜单

 如果对于所有 ID 各不相同的用户,都要使用 home 组件来渲染,可以在 routers.js 中添加动态参数:

{ 
 path: '/home/:id',
 component: Home
}

这样 "/home/user01"、"/home/user02"、"/home/user03" 等路由,都会映射到 Home 组件

然后还可以使用 $route.params.id 来获取到对应的 id

四、编程式导航

实际情况下,有很多按钮在执行跳转之前,还会执行一系列方法,这时可以使用 this.$router.push(location) 来修改 url,完成跳转

Vue实现路由跳转和嵌套

Vue实现路由跳转和嵌套

push 后面可以是对象,也可以是字符串:

// 字符串
this.$router.push('/home/first')

// 对象
this.$router.push({ path: '/home/first' })

// 命名的路由
this.$router.push({ name: 'home', params: { userId: wise }})

五、前车之鉴

在学习的过程中,遇到一个困扰许久的问题,大概是从 first 组件跳转回 login 之后,无法再跳转回去。但是 url 已经被修改,刷新页面也能正常显示。

Vue实现路由跳转和嵌套

这是因为我在 first.vue 组件中的 data 里面没有写 return

 Vue实现路由跳转和嵌套 Vue实现路由跳转和嵌套

在 vue 组件中,data 必须写为函数,且需要用 return 来返回参数。但是当 data 为空时,即使不写 return 也不会报错,所以导致了上面的问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
input 输入框内的输入事件详细分析
Mar 17 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
Dec 04 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
Sep 15 Javascript
javascript自动恢复文本框点击清除后的默认文本
Jan 12 Javascript
JavaScript 函数模式详解及示例
Sep 07 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
axios向后台传递数组作为参数的方法
Aug 11 Javascript
Vue源码探究之状态初始化
Nov 14 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
Apr 22 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
Jun 20 #Javascript
JS中的三个循环小结
Jun 20 #Javascript
详解Vue 方法与事件处理器
Jun 20 #Javascript
Vue Ajax跨域请求实例详解
Jun 20 #Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 #Javascript
详解Angular的8个主要构造块
Jun 20 #Javascript
vue之数据交互实例代码
Jun 20 #Javascript
You might like
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
动态载入/删除/更新外部 JavaScript/Css 文件的代码
2010/07/03 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Python break语句详解
2014/03/11 Python
python中pygame模块用法实例
2014/10/09 Python
用C++封装MySQL的API的教程
2015/05/06 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
python基于SMTP协议发送邮件
2019/05/31 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
python exit出错原因整理
2020/08/31 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
矫正人员思想汇报
2014/01/08 职场文书
大学生村官演讲稿
2014/04/25 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
检讨书范文300字
2015/01/28 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
入党转正申请报告
2015/05/15 职场文书
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技