Vue.js实战之利用vue-router实现跳转页面


Posted in Javascript onApril 01, 2017

前言

使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生。

官方文档: https://router.vuejs.org/zh-cn/essentials/getting-started.html

这次的实例主要实现下图的效果:

Vue.js实战之利用vue-router实现跳转页面

项目结构:

Vue.js实战之利用vue-router实现跳转页面

一、配置 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.js实战之利用vue-router实现跳转页面

其中 <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.js实战之利用vue-router实现跳转页面 

如此一来,就需要在一级路由中嵌套二级路由,修改 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.js实战之利用vue-router实现跳转页面

在编译之后, <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.js实战之利用vue-router实现跳转页面

Vue.js实战之利用vue-router实现跳转页面 

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

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

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

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

五、前车之鉴

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

Vue.js实战之利用vue-router实现跳转页面

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

Vue.js实战之利用vue-router实现跳转页面 

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js将控件隐藏的方法及display属性介绍
Jul 04 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
谈一谈bootstrap响应式布局
May 23 Javascript
JavaScript操作表单实例讲解(上)
Jun 20 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
JS实现浏览上传文件的代码
Aug 23 Javascript
详解vue-cli项目中怎么使用mock数据
May 29 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
JS实现拖动模糊框特效
Aug 25 Javascript
jQuery实现计算器功能
Oct 19 jQuery
ES6新特性之函数的扩展实例详解
Apr 01 #Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 #Javascript
ES6新特性之模块Module用法详解
Apr 01 #Javascript
Vue.js实战之组件之间的数据传递
Apr 01 #Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 #Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 #jQuery
前端自动化开发之Node.js的环境搭建教程
Apr 01 #Javascript
You might like
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
基于node.js实现爬虫的讲解
2019/02/18 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
Python global全局变量函数详解
2018/09/18 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
Python编写万花尺图案实例
2021/01/03 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
汽车驾驶求职信
2013/10/25 职场文书
西门豹教学反思
2014/02/04 职场文书
检查接待方案
2014/02/27 职场文书
环保建议书600字
2014/05/14 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
让生命充满爱观后感
2015/06/08 职场文书