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

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

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

 

有不少朋友找我要 demo,可是博客中的这个案例被我删掉了,我只好随手写了一个超简单的 demo,但愿能有所帮助web

连接: https://pan.baidu.com/s/1pMfi5tD  密码: pjwxvue-router

 

此次的实例主要实现下图的效果:vue-cli

 

项目结构:npm

 

 

1、配置 Router编程

 用 vue-cli 建立的初始模板里面,并无 vue-router,须要经过 npm 安装app

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

 

 

2、嵌套路由

在这个实例中,为了加深项目层级,App.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>

 

如此一来,就须要在一级路由中嵌套二级路由,修改 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 不须要添加 " / "

 

 

3、使用 <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: '/home/:id', component: Home }

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

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

 

 

4、编程式导航

实际状况下,有不少按钮在执行跳转以前,还会执行一系列方法,这时可使用 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 }})
复制代码

 

 

5、前车可鉴

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

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

 

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

原文出处:http://www.cnblogs.com/wisewrong/p/6277262.html

相关文章
相关标签/搜索