Vue学习笔记(二)

学习vue-admin-template
https://github.com/PanJiaChen/vue-admin-template

上一篇中分析了vue-admin-template的入口逻辑,包括main.js, App.vue, router。这篇根据router来分析下其他的页面。
下面是一部分路由代码,也是这篇要分析的页面

{ path: '/login', component: () => import('@/views/login/index'), hidden: true },
{ path: '/404', component: () => import('@/views/404'), hidden: true },

login

<template>
  <div class="login-container">
    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
      <h3 class="title">vue-admin-template</h3>
      <el-form-item prop="username">
        <span class="svg-container">
          <svg-icon icon-class="user" />
        </span>
        <el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="username" />
      </el-form-item>
      <el-form-item prop="password">
        <span class="svg-container">
          <svg-icon icon-class="password" />
        </span>
        <el-input
          :type="pwdType"
          v-model="loginForm.password"
          name="password"
          auto-complete="on"
          placeholder="password"
          @keyup.enter.native="handleLogin" />
        <span class="show-pwd" @click="showPwd">
          <svg-icon icon-class="eye" />
        </span>
      </el-form-item>
      <el-form-item>
        <el-button :loading="loading" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
          Sign in
        </el-button>
      </el-form-item>
      <div class="tips">
        <span style="margin-right:20px;">username: admin</span>
        <span> password: admin</span>
      </div>
    </el-form>
  </div>
</template>

<script>
import { isvalidUsername } from '@/utils/validate'

export default {
  name: 'Login',
  data() {
    const validateUsername = (rule, value, callback) => {
      if (!isvalidUsername(value)) {
        callback(new Error('请输入正确的用户名'))
      } else {
        callback()
      }
    }
    const validatePass = (rule, value, callback) => {
      if (value.length < 5) {
        callback(new Error('密码不能小于5位'))
      } else {
        callback()
      }
    }
    return {
      loginForm: {
        username: 'admin',
        password: 'admin'
      },
      loginRules: {
        username: [{ required: true, trigger: 'blur', validator: validateUsername }],
        password: [{ required: true, trigger: 'blur', validator: validatePass }]
      },
      loading: false,
      pwdType: 'password',
      redirect: undefined
    }
  },
  watch: {
    $route: {
      handler: function(route) {
        this.redirect = route.query && route.query.redirect
        //自动跳转指定页面
      },
      immediate: true //立即执行,而不是等到有变化时才执行
    }
  },
  methods: {
    showPwd() {
      if (this.pwdType === 'password') {
        this.pwdType = ''
      } else {
        this.pwdType = 'password'
      }
    },
    handleLogin() {
      this.$refs.loginForm.validate(valid => {
      //会验证该form所有字段的返回值,如果有不通过的valid就是false
        if (valid) {
          this.loading = true
          this.$store.dispatch('Login', this.loginForm).then(() => {
            this.loading = false
            this.$router.push({ path: this.redirect || '/' })
          }).catch(() => {
            this.loading = false
          })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    }
  }
}
</script>

新术语解读:

  1. svg-icon icon-class=“user”

    vue的使用svg-icon时,可以将svg保证成组件,可以到处使用,非常方便。通过svg-sprite-loader插件,可以非常方便轻松管理svg。
    使用svg-sprite的好处

    1. 页面代码清爽
    2. 可使用ID随处重复调用
    3. 每个SVG图标都可以更改大小颜色

    详细可以参考https://segmentfault.com/a/1190000012213278
    svg管理这个牵扯到另外两个知识点:

    1. 是svg-sprite-loader插件使用,这个参考上面的链接,有固定模式
    2. 自动导入所有的svg模块,这个是一个非常方便并且高级的功能,还有一些别的功能。需要详细说明一下,代码如下:
const requireAll = requireContext => requireContext.keys().map(requireContext) //keys()也是一个函数,它返回一个数组,由所有可能被上下文模块处理的请求
const req = require.context('./svg', false, /\.svg$/)  //创建context,获得svg目录下所有可以被导入的模块
requireAll(req)  // 导入所有的svg模块
  1. 首先用require.context创建一个Context,
    你还可以使用 require.context() 方法来创建自己的(模块)上下文。
    你可以给这个方法传 3 个参数:

    1. 要搜索的文件夹目录,
    2. 是否还应该搜索它的子目录,
    3. 以及一个匹配文件的正则表达式。
  2. webpack 会在构建的时候解析代码中的 require.context() 。语法如下:

require.context(directory, useSubdirectories = false, regExp = /^\.\//);

然后导入该context下的所有svg
参考:

  1. require.context解读
  2. require.context其他高级用法
  3. https://webpack.docschina.org/guides/dependency-management/
  1. rule

    element-ui 提供的表单输入验证规则,用于自定义验证
    参考:element-ui中的表单验证

  2. native

    如果vue事件侦听函数绑定到一个封装好的组件上的原生事件,则需要.native修饰符,如果是普通组件,则不需要该修饰符
    参考:将原生事件绑定到组件

  3. watch route

    监听路由变化,验证通过后,自动跳转指定页面
    参考watch监听路由变化

小结

  1. 本小节分析了一下vue-admin-template的Login.Vue组件,主要是分析了一下html模板和js代码。重点学习了svg图标的管理导入,以及其它一些小知识点,例如watch监听路由变化,vue绑定组件原生事件,还有element-ui框架的验证规则使用。

404

<template>
  <div class="wscn-http404-container">
    <div class="wscn-http404">
      <div class="pic-404">
        <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404">
        <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404">
        <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404">
        <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404">
      </div>
      <div class="bullshit">
        <div class="bullshit__oops">OOPS!</div>
        <div class="bullshit__info">版权所有
          <a class="link-type" href="https://wallstreetcn.com" target="_blank">华尔街见闻</a>
        </div>
        <div class="bullshit__headline">{{ message }}</div>
        <div class="bullshit__info">请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告</div>
        <a href="" class="bullshit__return-home">返回首页</a>
      </div>
    </div>
  </div>
</template>

<script>

export default {
  name: 'Page404',
  computed: {
    message() {
      return '网管说这个页面你不能进......'
    }
  }
}
</script>

小结:
1. 404页面就很简单了

总结

本篇就是分析了vue-admin-template的两个页面,分别是登录页面和404页面。通过分析,学习到以下两个重要知识点:

  1. svg管理与自动导入
  2. watch路由

参考

  1. https://segmentfault.com/a/1190000012213278
  2. require.context解读
  3. require.context其他高级用法
  4. https://webpack.docschina.org/guides/dependency-management/
  5. element-ui中的表单验证
  6. 将原生事件绑定到组件
  7. watch监听路由变化
Logo

前往低代码交流专区

更多推荐