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 相关文章推荐
Javascript 强制类型转换函数
May 17 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
layui之table checkbox初始化时选中对应选项的方法
Sep 02 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 jQuery
微信小程序纯文本实现@功能
Apr 08 Javascript
详解vue 组件
Jun 11 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
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
php curl基本操作详解
2013/07/23 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
Opacity.js
2007/01/22 Javascript
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
JSONP之我见
2015/03/24 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
校园安全标语
2014/06/07 职场文书
商场父亲节活动方案
2014/08/27 职场文书
大学开学感言
2015/08/01 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python