指南
孙强 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\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/,
// 无效的身份证号码
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 | 文件名 |