Vue 爬坑之路(三)—— 使用 vue-router 跳转页面

2017-01-17 23:51:17

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

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

 

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

 

项目结构:

 

 

一、配置 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'='/home''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 只是作为一个存放组件的容器:

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

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

 

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

 

如此一来,就需要在一级路由中嵌套二级路由,修改 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> 来实现导航的功能:

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

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

 

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

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

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

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

 

 

四、编程式导航

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

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

复制代码

// 字符串this.$router.push('/home/first')// 对象this.$router.push({ path: '/home/first' })// 命名的路由this.$router.push({ name: 'home', params: { userId: wise }})

复制代码

 

 

五、前车之鉴

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

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

 

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


  • 2020-03-18 21:30:57

    基于OpenLayers实现地理围栏 谷歌百度高德地图都可以

    前言.因为项目有点特殊,需要接入谷歌地图实现地理围栏,因为谷歌地图的地理围栏接口相关接口并不完善,于是就换了一个思路,利用OpenLayers来实现地理围栏 openlayers 中文地址 http://weilin.me/ol3-primer/ch02/index.html 作者:zcty0701 链接:https://www.jianshu.com/p/60e88ee1e843 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 2020-03-19 17:12:40

    百度地图放大覆盖物消失

    产生问题的原因是因为我们用的普通的点数组生成的多边形,我们应该用百度的点数组生成就没问题了。

  • 2020-03-19 19:15:47

    vue中methods watch和compute的区别和联系

    首先要说,methods,watch和computed都是以函数为基础的,但各自却都不同 而从作用机制和性质上看,methods和watch/computed不太一样,所以我接下来的介绍主要有两个对比: 1.methods和(watch/computed)的对比

  • 2020-03-19 19:50:31

    用vue做的跟随鼠标移动的div

    随鼠标移动的动画效果,之前一直使用angular和react,没怎么接触过vue,先做一个vue的简单例子,然后再整合。

  • 2020-03-20 13:35:55

    随便想到,群聊天的数据库简单设计

    拆分成两个表,一个是消息的流水表,一个是每个人的配置表。 记录每个群下面的这个用户的最后读取的消息last_msg_id,然后在计算消息未读数据。 这样优化之后数据将减少好多,数量是 m+n条数据。不在是成倍增长了。

  • 2020-03-20 13:39:50

    类似与微信朋友圈功能数据库如何实现

    每次发圈子的时候,给关注我的每个uuid,发一个内容id。 大概表的设计就是 uuid,idlist 这样的,idlist是按照时间顺序的。 然后定期删除idlist过多的老圈子。

  • 2020-03-21 00:11:38

    Android卡片布局(圆角阴影)的几种实现及分析

    在开发中,为了界面美观,圆角view和阴影效果是开发中经常遇到的UI场景,比如银行卡效果,卡片式itemView布局,Banner图等,开发中我们通过各种方式实现了这种效果,但是哪种方案最好呢,接下来本文将比较几种常见的圆角阴影布局实现,并从内存占用角度分析它们的优缺点.