基於vue的驗證碼組件

最近在本身寫頁面,模仿思否論壇,而後寫登陸註冊UI的時候須要一個驗證碼組件. 去搜一下沒找到什麼合適的,並且大多都是基於後端的,因而本身手寫一個。

演示

圖片描述

分析驗證碼組件

分析驗證碼功能css

  1. 隨機出現的數字大小寫字母 (基礎功能)
  2. 不一樣的數字或者字母有不一樣的顏色 (功能優化)
  3. 不一樣的數字或者字母有不一樣的字體大寫 (功能優化)
  4. 不一樣的數字或者字母有不一樣的邊距 (功能優化)
  5. 不一樣的數字或者字母有不一樣的傾斜角度 (功能優化)
  6. 更多功能優化...

分析組件功能git

  1. 能夠設置生成驗證碼的長度 (基本功能)
  2. 能夠設置驗證碼組件的寬高 (基本功能)

編寫驗證碼組件

templategithub

最外層div綁定點擊事件,點擊後刷新驗證碼。
span是單個驗證碼的載體,樣式動態綁定後端

<template>
  <div class="ValidCode disabled-select" :style="`width:${width}; height:${height}`" @click="refreshCode">
    <span v-for="(item, index) in codeList" :key="index" :style="getStyle(item)">{{item.code}}</span>
  </div>
</template>

methodsdom

refreshCode 刷新驗證碼的方法
createdCode 生成驗證碼的方法
getStyle 爲每一個元素生成動態的樣式字體

methods: {
    refreshCode () {
      this.createdCode()
    },
    createdCode () {
      let len = this.length,
        codeList = [],
        chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789',
        charsLen = chars.length
      // 生成
      for (let i = 0; i < len; i++) {
        let rgb = [Math.round(Math.random() * 220), Math.round(Math.random() * 240), Math.round(Math.random() * 200)]
        codeList.push({
          code: chars.charAt(Math.floor(Math.random() * charsLen)), // 隨機碼
          color: `rgb(${rgb})`, // 隨機顏色
          fontSize: `1${[Math.floor(Math.random() * 10)]}px`, // 隨機字號
          padding: `${[Math.floor(Math.random() * 10)]}px`, // 隨機內邊距
          transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)` // 隨機旋轉角度
        })
      }
      // 指向
      this.codeList = codeList
      // 將當前數據派發出去
      this.$emit('update:value', codeList.map(item => item.code).join(''))
    },
    // 動態綁定樣式
    getStyle (data) {
      return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}; transform: ${data.transform}`
    }
  }

完整代碼

使用flex

<valid-code :value.sync="validCode"></valid-code>

組件優化

<template>
  <div class="ValidCode disabled-select" :style="`width:${width}; height:${height}`" @click="refreshCode">
    <span v-for="(item, index) in codeList" :key="index" :style="getStyle(item)">{{item.code}}</span>
  </div>
</template>

<script>
export default {
  name: 'validCode',
  props: {
    width: {
      type: String,
      default: '100px'
    },
    height: {
      type: String,
      default: '40px'
    },
    length: {
      type: Number,
      default: 4
    }
  },
  data () {
    return {
      codeList: []
    }
  },
  mounted () {
    this.createdCode()
  },
  methods: {
    refreshCode () {
      this.createdCode()
    },
    createdCode () {
      let len = this.length,
        codeList = [],
        chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789',
        charsLen = chars.length
      // 生成
      for (let i = 0; i < len; i++) {
        let rgb = [Math.round(Math.random() * 220), Math.round(Math.random() * 240), Math.round(Math.random() * 200)]
        codeList.push({
          code: chars.charAt(Math.floor(Math.random() * charsLen)),
          color: `rgb(${rgb})`,
          fontSize: `1${[Math.floor(Math.random() * 10)]}px`,
          padding: `${[Math.floor(Math.random() * 10)]}px`,
          transform: `rotate(${Math.floor(Math.random() * 90) - Math.floor(Math.random() * 90)}deg)`
        })
      }
      // 指向
      this.codeList = codeList
      // 將當前數據派發出去
      this.$emit('update:value', codeList.map(item => item.code).join(''))
    },
    getStyle (data) {
      return `color: ${data.color}; font-size: ${data.fontSize}; padding: ${data.padding}; transform: ${data.transform}`
    }
  }
}
</script>

<style scoped lang="scss">
  .ValidCode{
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    span{
      display: inline-block;
    }
  }
</style>

源碼地址
演示地址 模仿思否寫的網站,點註冊可看到驗證碼網站

相關文章
相關標籤/搜索