vue学习笔记(3)——router

github
vue学习笔记(1)主要介绍vue项目的创建
vue学习笔记(2)主要介绍项目的基本设置,如axios设置和项目颜色控制
今天讲解vue一个很重要的组件router,熟悉后台开发的人肯定对router有一定的了解,在我们用jinjia2渲染模板的时候,通常都会定义各种各样的router,router相当于整个项目的导航,每个页面对应的内容,都通过router来控制。
在创建好了的vue项目中有一个src/router.js文件(得在用脚手架创建项目的时候勾选router组件)并且在src/main.js已经将router绑定到vue实例上。

一、main.js注册router
import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

通过将router当做实例化Vue的参数,将router绑定

二、router定义

我们来看一下src下面的router.js文件,来看一下router是怎样定义的。

import Vue from 'vue'
import Router from 'vue-router'
#定义公用方法引入组件
Vue.use(Router)
const resolve = path => () => import(`@/views/${path}`)

#将router定义成常量,后续能够给router添加相应的守卫方法
const router = new Router({
  mode: 'history' #默认router模式是hash模式,url上会有个#符号,如果使用history,url上则不会出现#
  base: process.env.BASE_URL, #可以在配置文件中设置,打包可以生成不同的路由前缀。
                              #方便测试环境和正式环境的文件打包
  routers: [{
    path: '/'
    name: 'login',
    meta: {title: '登录'}, # router携带的自定义信息要放在meta中
    component: resolve('Login')
  }]
})

router.afterEach(to => {
  if (to.meta && to.meta.title) {
    document.title = to.meta.title
  }
})
export default router

这样一个简单的router就创建完了。但是还有很多复杂的页面,如有些页面结构一致,只有一部分内容需要更换,如那种左侧或顶部菜单栏功能。这种的话,只有内容区的内容需要更换,其他部分内容都是不变的。
在该项目中我引入了element-ui库

  • 安装element-ui库
npm install element-ui
  • 引入element-ui库
    在main.js中添加如下代码
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'#引入element样式文件

Vue.use(ElementUI)

那怎么构建一个只有内容变化,但其他内容不变的页面呢?
首先创建Home.vue

<template>
  <div class="main-container">
    <el-container>
      <el-header height="50px">这是顶部导航栏</el-header>
      <el-container mode="horizontal">
        <el-aside width="250px">
          这是左边栏
        </el-aside>
        <el-main>
          #这是内容区
          <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

然后一个简单的布局就这样构建完成了,顶部导航和左边栏需要对应的内容填充。
你会发现左边栏和内容区的内容是根据内容进行变化的,这个时候在styles创建element.styles.scss文件
并且在App.vue中引入

<style lang="scss">
    @import "@/styles/element.reset.scss";
</style>
#app {
  .el-container {
    height: 100vh;
  }
}

这样就解决了上述问题了。
而内容区则可以在路由中进行定义。
假设有两个页面,一个是用户界面User,另一个是组界面Group
那么router就可以进行改装了。

const router = new Router({
  mode: 'history' #默认router模式是hash模式,url上会有个#符号,如果使用history,url上则不会出现#
  routers: [{
    path: '/'
    name: 'login',
    meta: {title: '登录'}, # router携带的自定义信息要放在meta中
    component: resolve('Login')
  }, {
    path: '/main',
    component: resolve('Home'),
    children: [{
      path: 'user',
      name: 'UserIndex',
      component: resolve('User')
    },{
      path: 'group',
      name: 'GroupIndex',
      component: resolve('Group')
    }]
  }]
})

那么对应的路由/main/user和/main/group的内容就由组件User和Group进行控制了。
这里其实用到了router-view,在router解析的时候会将children里的component填充到router-view的位置上,当然这里也可以使用多个router-view,然后添加不同的名字,那么children里就需要使用components来进行一一对应,根据不同的名字,会将不同的内容添加到不同的位置。例如:

<template>
  <div class="main-container">
    <el-container>
      <el-header height="50px"><router-view name='header'></router-view></el-header>
      <el-container mode="horizontal">
        <el-aside width="250px">
          <router-view name='leftside'></router-view>
        </el-aside>
        <el-main>
          #这是内容区
          <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

注意router-view只有一个可以是默认的,也就是不需要带name参数。那么对应的router应该怎样编写呢?

children: [{
  path: 'user',
  name: 'UserIndex',
  component: {
    default: resolve('User'),
    header: resolve('header'),
    leftside: resolve('leftside')
  }
}

当然如果在路由中进行定义,那么其router-view位置则不进行填充。

router的相关问题进行就到这了,后续会陆续进行补充。谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • vue-cli搭建项目 确保安装了node与npm 再目标文件夹下打开终端 执行cnpm i vue-cli -g...
    Akiko_秋子阅读 3,188评论 1 22
  • 为了学习英语,我也真是拼了,早上起床,广播听的是VOA慢速英语新闻,歌曲听的也全是英语歌,中文歌全被我删了,奈何酷...
    一直走别回头M阅读 223评论 0 0
  • 在穷,不要借钱去消费!在难,不要说话不算数!欠钱,一定拼命挣钱来还,还不上,要打电话让人知道你没忘,堂堂正正做人,...
    有田笔记阅读 225评论 0 0