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 相关文章推荐
鼠标划过实现延迟加载并隐藏层的js代码
Oct 11 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
Jan 22 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
Angular使用$http.jsonp发送跨站请求的方法
Mar 16 Javascript
js判断是否是手机页面
Mar 17 Javascript
webpack4 CSS Tree Shaking的使用
Sep 03 Javascript
node错误处理与日志记录的实现
Dec 24 Javascript
详解javascript 变量提升(Hoisting)
Mar 12 Javascript
js+springMVC 提交数组数据到后台的实例
Sep 21 Javascript
Node.js API详解之 module模块用法实例分析
May 13 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
Terran剧情介绍
2020/03/14 星际争霸
YII分模块加载路由的实现方法
2018/10/01 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jQuery事件对象总结
2016/10/17 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Django的分页器实例(paginator)
2017/12/01 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python 编码规范整理
2018/05/05 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
python递归全排列实现方法
2018/08/18 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
linux面试相关问题
2012/08/11 面试题
高中体育教学反思
2014/01/29 职场文书
房屋出租委托书格式
2014/09/23 职场文书
学习心理学的体会
2014/11/07 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers