第一个 Element UI 登录页

1 概述

  继上篇的 vue-cli 项目,我们接下来都采用 ElementUI 组件库来搭建我们的 vue 项目。

2 安装插件、依赖并运行

  因为上篇已经初始化了项目,这里直接进行依赖的安装。

  使用 NPM 安装相关组件依赖时可能会遇到权限问题,此时使用 PowerShell 管理员模式运行即可;‘Win + x’ -> 鼠标右击 -> Windows PowerShell (管理员)

elementui首页展示欢迎使用某某某系统_App

我们需要安装 vue-router、element-ui、sass-loader 和 node-sass 四个插件

# 进入工程目录
cd myvue
# 安装 vue-router
npm install vue-router --save-dev
# 安装 element-ui
npm i element-ui -S
# 安装 SASS 加载器
npm install sass-loader node-sass --save-dev

vue-router 用来页面跳转或者说是组件跳转;elemenet-ui 即 ui 样式库;sass-loader 是 webpack 的一个loader;node-sass 把 sass编译成css。

elementui首页展示欢迎使用某某某系统_Bootstrap_02


  安装依赖,并启动项目

# 安装依赖
npm install
# 启动项目
npm run dev

elementui首页展示欢迎使用某某某系统_Vue_03


elementui首页展示欢迎使用某某某系统_Vue_04


  运行效果,浏览器输入 localhost:8080,效果如下:

elementui首页展示欢迎使用某某某系统_vue_05

3 Element UI 对比 Bootstrap

  学习 ElementUI 前,我们先了解一下,为什么要使用它。拿它和我们之前学过的 Bootstrap 做对比,如下图:

elementui首页展示欢迎使用某某某系统_Element UI 登录页_06

  • 我们一开始学的是 JavaScript,JavaScript 进行 Dom 的操作,然而这样会写很多原生代码,为简化代码,因此使用 jQuery(JS 标签库);然而,我们做组件太丑了,作为一名后台开发人员,我们不可能把精力放在美化组件上,因此引用 Bootstrap 等框架来美化组件。但是呢?布局又是一个问题,为了快速布局,所以用了基于 Bootstrap 的模板,如 Metrnic AdminLTE 等。
  • 根据上面描述和图片做对比,Vue 是基于 JavaScript 的 ES6 语法,为了使组件好看,使用 ElementUI 来美化组件,使用 Vue Element Admin 模板(后台模板)快速布局。

4 src 目录结构

  在源码目录中创建如下结构:

elementui首页展示欢迎使用某某某系统_Bootstrap_07

  • api:用于存放 url 地址
  • assets:用于存放资源文件
  • components:用于存放 Vue 功能组件
  • router:用于存放 vue-router 配置
  • utils:用于存放通用工具
  • views:用于存放 Vue 视图组件
  • vuex:用于存放状态

5 创建登陆页视图

   在 views 目录下创建一个名为 Login.vue 和 Main.vue 的视图组件,其中 el-* 的元素为 ElementUI 组件

  Login.vue

<template>
  <div>
    <el-form ref="loginForm" :model="form" label-width="50px" class="login-box">
      <h2 class="login-title">欢迎登陆</h2>
      <el-form-item label="账号">
        <el-input v-model="form.username" type="text"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="form.password" type="text"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">登陆</el-button>
        <el-button>取消</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
    export default {
        name: "login",
        data(){
          return{
            form:{
              username:'',
              password:''
            }
          }
        },
        methods:{
          onSubmit(){
            console.log('登陆')
          }
        }
    }
</script>

<style lang="scss" scoped>
  .login-box{
    border: 1px solid #DCDFE6;
    width: 350px;
    margin: 150px auto;
    padding: 20px 30px;
    border-radius: 10px;
    box-shadow:0 0 25px #DCDFE6;
  }

  .login-title{
    margin: 30px auto;
    text-align: center;
  }
</style>

  Main.vue

<template>
  <div>
	首页
  </div>
</template>

<script>
    export default {
        name: "main",
    }
</script>

  创建路由,在 router 文件夹下创建 indxe.js 路由文件

import Vue from 'vue'
import Router from 'vue-router'
import Login from '../views/login'

Vue.use(Router);

export default new Router({
  routes:[
    {
      path:'/login',
      name:'Login',
      component:Login
    }
  ]
})

  配置路由,修改 App.vue

<template>
  <div id="app">
    //将路由到的组件显示在这
    <router-view/>
  </div>
</template>

<script>

export default {
  name: 'App'
}
</script>

修改 main.js 入口代码

import Vue from 'vue'
import App from './App'

// 导入 vue-router 插件,使配置路由生效
import VueRouter from 'vue-router'
// 导入自己配置的路由
import router from './router'

// 导入 ElementUI
import ElementUI from 'element-ui';
// 导入 ElementUI 样式,使组件样式生效
import 'element-ui/lib/theme-chalk/index.css'

// 是否在浏览器控制台输出生产配置
Vue.config.productionTip = false

Vue.use(VueRouter)
Vue.use(ElementUI)

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

效果
  先启动项目,浏览器访问 http://localhost:8080/#/login

elementui首页展示欢迎使用某某某系统_Bootstrap_08

6 分析流程

  首先是将需要的组件创建出来,如 login.vue,通过暴露接口供给路由调用,然后创建组件的路由,然后将创建好的路由引入到 main.js 入口中,最后就是将路由到的组件显示到 App.vue 中,如下图:

elementui首页展示欢迎使用某某某系统_vue_09

7 完善

  以上只是登陆页面的显示,然而我们要实现简单登陆校验并点击登陆之后路由到主页。具体说明查看 ElementUI 的教程,完整代码如下:

login.vue

  Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。校验规则参见 async-validator

<template>
  <div>
    <el-form ref="loginForm" :model="form" :rules="rules" label-width="60px" class="login-box">
      <h2 class="login-title">欢迎登陆</h2>
      <el-form-item label="账号" prop="username">
        <el-input v-model="form.username" type="text"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input v-model="form.password" type="text"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit('loginForm')">登陆</el-button>
        <el-button>取消</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
    export default {
        name: "login",
        data(){
          return{
            form:{
              username:'',
              password:''
            },
             // 数据规则
            rules:{
              username:[
                { required: true, message: '账号不能为空!', trigger: 'blur' }
              ],
              password:[
                { required: true, message: '密码不能为空!', trigger: 'blur' }
              ]
            },
          }
        },
        methods:{
          onSubmit(formName) {
           // 校验数据规则
            this.$refs[formName].validate((valid) => {
             // 通过即路由到主页
              if (valid) {
                this.$router.push('/')
              } else {
                    this.$alert('这是一段内容', '标题名称', {
                    confirmButtonText: '确定'
                  });
                  return false;
                }
            });
          }
        }
    }
</script>

<style lang="scss" scoped>
  .login-box{
    border: 1px solid #DCDFE6;
    width: 350px;
    margin: 150px auto;
    padding: 20px 30px;
    border-radius: 10px;
    box-shadow:0 0 25px #DCDFE6;
  }

  .login-title{
    margin: 30px auto;
    text-align: center;
  }
</style>

index.js

import Vue from 'vue'
import Router from 'vue-router'
// 引入组件
import Login from '../views/login'
import Main from '../views/main'

Vue.use(Router);

export default new Router({
  routes:[
    {
      path:'/login',
      name:'Login',
      component:Login
    },
    {
      path:'/',
      name:'Main',
      component:Main
    }

  ]
})

App.vue

<template>
  <div id="app">
    <!-- 显示路由到的组件-->
    <router-view/>
  </div>
</template>

<script>

export default {
  name: 'App'
}
</script>

main.js

import Vue from 'vue'
import App from './App'

// 导入 vue-router 插件,使配置路由生效
import VueRouter from 'vue-router'
// 导入自己配置的路由
import router from './router'

// 导入 ElementUI
import ElementUI from 'element-ui';
// 导入 ElementUI 样式,使组件样式生效
import 'element-ui/lib/theme-chalk/index.css'

// 是否在浏览器控制台输出生产配置
Vue.config.productionTip = false

Vue.use(VueRouter)
Vue.use(ElementUI)

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

效果

elementui首页展示欢迎使用某某某系统_Element UI 登录页_10

8 附

  在启动项目过程中出现如下错误

Modele build failed: TypeError: this.getResolve is not a function at Object.loader...

  而在 安装插件 时已全部安装完成。这是因为当前 sass 的版本太高,webpack 编译时出现了错误,这个时候只需要换成低版本的就行,下面说一下修改方法,很简单,如下,找到 package.json 文件,里面的 “sass-loader” 的版本更换掉,然后重启项目即可。

本地的"sass-loader": “^8.0.0”,更换成了 “sass-loader”: “^7.3.1”