指南

2021/12/30 vue

# 介绍

此js函数方法,为ith-ui框架提供的一部分功能,它的实现,需要通过js调用,而不是组件的形式。

工具库中的所有方法,均挂载在this.$api对象下,调用方法如下:

  • 如果是在js中,需要通过this.$api.xxx形式调用,如生成全局随机的唯一id方法:
console.log(this.$api.guid());	// 生成全局随机的唯一id
  • 如果是在元素中,无需前缀this.$api,如:
<template>
	<view>
		唯一id:{{$api.guid()}}
	</view>
</template>

# 交互类

# confirm

confirm弹窗二次封装,依赖于ele-ui

参数 类型 备注
text String 提示文字
return Promise Promise
this.$api.confirm('是否确认删除数据项?').then((result) => {
	console.log(’点击了确认')
}).catch(() => {
	console.log(’点击了取消')
})

# toast

toast提示二次封装,依赖于ele-ui

参数 类型 备注
text String 提示文字
type String 提示类型,支持success/warning/info/error,默认为success
timer String 延迟时间,默认5000ms
this.$api.toast('操作成功', 'warning')

# throttle & debounce节流防抖

# 何谓节流和防抖?

  • 节流 节流的意思是,规定时间内,只触发一次。比如我们设定500ms,在这个时间内,无论点击按钮多少次,它都只会触发一次。具体场景可以是抢购时候,由于有无数人 快速点击按钮,如果每次点击都发送请求,就会给服务器造成巨大的压力,但是我们进行节流后,就会大大减少请求的次数。
  • 防抖 防抖的意思是,在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效。具体场景可以搜索框输入关键字过程中实时 请求服务器匹配搜索结果,如果不进行处理,那么就是输入框内容一直变化,导致一直发送请求。如果进行防抖处理,结果就是当我们输入内容完成后,一定时间(比如500ms)没有再 输入内容,这时再触发请求。

结合以上两种情况,回到我们最实际的场景,比如防止表单提交按钮被多次触发,我们应该选择使用节流而不是防抖方案。

# 节流

# throttle(func, wait = 500, immediate = true)

规定时间内,只触发一次,可以通过设置immediate来决定触发的时机在这个时间的开始,还是结束的时候执行。

参数 类型 备注
func Function 触发回调执行的函数
wait Number 时间间隔,单位ms
<template>
	<div>
		<el-button @click="$api.throttle(submitForm, 500)">保存</el-button>
	</div>
</template>

<script>
	export default{
		method() {
			submitForm(){
				console.log('500ms内只会执行一次')
			}
		}
	}
</script>

# convert金额大小写转换

参数 类型 备注
money String 金额数字
return String 金额大写
<template>
	<div>
        <label>{{$api.convert('99.00')}}元</label>
        <label>{{money}}元</label>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				money: this.$api.convert('99.00')
			}
		}
	}
</script>

# 防抖

# debounce(func, wait = 500, immediate = false)

在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效

参数 类型 备注
func Function 触发回调执行的函数
wait Number 时间间隔,单位ms
immediate Boolean 在开始还是结束处触发,如非特殊情况,一般默认为false即可
<template>
	<div>
		<el-button @click="$api.debounce(submitForm, 500)">保存</el-button>
	</div>
</template>

<script>
	export default{
		method() {
			submitForm(){
				console.log('连续点击时,当500ms内没有点击时才会触发')
			}
		}
	}
</script>

# loading

在主流组件中(譬如ele-ui),自带的v-loading可以解决大部分的防止连点的场景

<template>
	<div>
		<el-button :loading="submitLoading" @click="submitForm">保存</el-button>
	</div>
</template>

<script>
	export default{
		data(){
			return {
				submitLoading:false
			}
		},
		method() {
			submitForm(){
				this.submitLoading = true
				setTimeout(()=>{
					console.log('1000ms后会将button解锁为激活状态')
					this.submitLoading = false
				}, 1000)
			}
		}
	}
</script>

# 正则验证

关于正则验证,ith-ui提供了三个工具类,用于满足不同的场景

# reg表达式统一管理

export default {
  // 无效的整数
  integer: /^[\-\+]?\d+$/,
  // 无效的数值,只能填写整数或两位小数
  onlyDecimal: /^[1-9][0-9]*(\.[0-9]{1,2})?$/,
  // 只能填写英文字母
  onlyLetterSp: /^[a-zA-Z\ \']+$/,
  // 只能填写数字、英文字母
  letterAndNumLimit: /^[0-9a-zA-Z]+$/,
  // 只能填写中文汉字
  onlyChinese: /^[\u4E00-\u9FA5]+$/,

  // 无效的电话号码,示例:010-6754783
  phone: /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/,
  // 无效的手机号码
  mobilePhone: /^1[3456789]\d{9}$/,
  // 无效的邮箱地址
  email: /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g,
  // 无效银行卡号,整数16位或18-21位
  bankNum: /^\d{16}$|^\d{18,21}$/,
  // 无效的网址
  url: /((http|ftp|https):\/\/)?[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:\/~\+#]*[\w\-\@?^=%&amp;\/~\+#])?/,
  // 无效的身份证号码
  chinaIdLoose: /^(\d{18}|\d{15}|\d{17}[xX])$/,
  // 无效的邮政编码
  chinaZip: /^\d{6}$/,
  // 无效的 QQ 号码
  qq: /^[1-9]\d{4,11}$/,

  // 无效的密码,6-20位数字和字母组合
  passWord: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
  // 无效的验证码,6位数字
  code: /^([0-9]){6}$/,
  // 无效的百分比
  percentage: /^100$|^100\.0$|^100\.00$|^100\.000$|^(\d|[1-9]\d)(\.\d{1,3})*$/,
  // 无效的金额,整数10位,小数2位,示例:247.11
  money: /^([1-9][\d]{0,9}|0)(\.[\d]{1,2})?$/,

}

调用方式:

this.$api.reg.passWord

需要拓展时自行在@util/funtion/reg.js中进行添加即可

# test公共验证方法

参数 类型 备注
reg String 正则表达式
value String 验证内容

建议搭配reg进行使用

if (!this.$api.test(this.$api.reg.mobilePhone, this.formData.userName)) {
	this.$api.toast('请输入正确的手机号!', 'warning')
	return
}

# rules表单专用

为了配合el-form,专门做了一个工具js

参数 类型 备注
name String 对应reg中的正则表达式的name
msg String 自定义报错信息,可不填

返回值为一个对象,即el-form的rules验证对象

{
	pattern: reg[name],
	message: msg || modules[name]
}

调用示例

<template>
	<div>
		<el-form ref="formData" :rules="rules" :model="formData">
            <el-form-item prop="userName">
                <el-input v-model="formData.userName" placeholder="手机号码" />
            </el-form-item>
            <el-form-item>
                <el-button :loading="loading" @click="submitForm()">提交</el-button>
            </el-form-item>
        </el-form>
	</div>
</template>

<script>
	export default{
		data(){
			return {
                formData:{
                    userName:''
                },
				rules:{
                    userName: [
                      { required: true, message: '请输入手机号', trigger: 'blur' },
                      this.$api.rules('mobilePhone')
                    ],
                }
			}
		},
		method() {
			submitForm(){
				this.$refs.formData.validate((valid) => {
                    if (valid) {
                        console.log('验证通过')
                    }
                })
			}
		}
	}
</script>

# 其他

# guid 全局唯一标识符

本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85。全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier)。一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题。v-for的时候,推荐使用后端返回的id而不是循环的index

参数 类型 备注
len Number uuid的长度,默认为32位
firstTH Boolean 将返回的首字母置为th,默认为true
radix Nubmer 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制,默认为62
<template>
	<div>
		<div :id="$api.guid()" />
        <label>{{pageId}}</label>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				pageId: this.$api.guid()
			}
		}
	}
</script>

# convert金额大小写转换

参数 类型 备注
money String 金额数字
return String 金额大写
<template>
	<div>
        <label>{{$api.convert('99.00')}}元</label>
        <label>{{money}}元</label>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				money: this.$api.convert('99.00')
			}
		}
	}
</script>

# download下载

# downloadFileByTagA通过a标签下载url

参数 类型 备注
url String 下载地址
fileName String 文件名

# downloadFileByTagBlob通过a标签下载文件file

参数 类型 备注
file file 文件对象
fileName String 文件名