前端实用工具方法 —— 持续更新中...

发布于:2025-08-06 ⋅ 阅读:(18) ⋅ 点赞:(0)

【点赞收藏加关注,前端技术不迷路~】

一、校验工具及配置类

Vue.prototype.VTools = { ... }
1.基础校验

整数百分数值手机号手机号脱敏登录密码身份证号(含合法校验)身份证号车牌号邮箱地址

/**
 * 输入校验:整数
 */
checkInit: function (rule, value, callback) {
    var ruleText = /^[1-9]\d*$|^[0]$/,
        massageText=(rule.messageText?rule.messageText:'整数');
    value=value?value.trim():value;
    if (value === '') {
        rule.beNull?callback():callback(new Error('请输入'+massageText));
    } else if (!ruleText.test(value)) {
        callback(new Error(massageText+'格式错误'));
    } else {
        callback();
    }
},

/**
 * 输入校验:百分数值
 */
checkRate: function (rule, value, callback) {
    var ruleText = /^[1-9]\d*^|$[0]$/,
        massageText=(rule.messageText?rule.messageText:'整数');
    value=value?value.trim():value;
    if (value === '') {
        rule.beNull?callback():callback(new Error('请输入'+massageText));
    } else if (!ruleText.test(value)) {
        callback(new Error(massageText+'格式错误'));
    } else {
        callback();
    }
},

/**
 * 输入校验:手机号
 */
checkMobile: function (rule, value, callback) {
    var ruleText = /^1[3|4|5|6|7|8|9]\d{9}$/,
        massageText=(rule.messageText?rule.messageText:'手机号');
    if (value === '' || value==undefined) {
        rule.beNull?callback():callback(new Error('请输入'+massageText));
    } else if (!ruleText.test(value)) {
        callback(new Error(massageText+'格式错误'));
    } else {
        callback();
    }
},

/**
 * 输入校验:手机号脱敏
 */
checkMobileSafe: function (rule, value, callback) {
    var ruleText = /^1[3|4|5|6|7|8|9]\d(\d{4}|\*{4})\d{4}$/,
        massageText=(rule.messageText?rule.messageText:'手机号');
    if (value === '' || value==undefined) {
        rule.beNull?callback():callback(new Error(rule.inlineMessage?'必填':('请输入'+massageText)));
    } else if (!ruleText.test(value)) {
        callback(new Error(rule.inlineMessage?'格式错误':(massageText+'格式错误')));
    } else {
        callback();
    }
},

/**
 * 输入校验:登录密码检验大小写字母+数字
 */
checkPasswordHigh: function (rule, value, callback) {
    var ruleText = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{6,16}$/,
        massageText=(rule.messageText?rule.messageText:'密码');
    value=value?value.trim():value;
    if (value === '') {
        callback(new Error('请输入'+massageText));
    } else if (!ruleText.test(value)) {
        callback(new Error('格式错误:6-16位必须包含大小写字母、数字'));
    } else {
        callback();
    }

},

/**
 * 输入校验:身份证号(含合法校验)
 */
checkIdNo:function(rule, value, name, callback){
    var n = name?name:'';
    var k= value;
    var pa = {};
    var ereg = '';
    k = k.toUpperCase();
    var m = [true,
        "您输入的" + n + "身份证号码位数不对!",
        "您输入的" + n + "身份证号码错误",
        "您输入的" + n + "身份证号码错误",
        "您输入的" + n + "身份证号码错误",
        "您输入的" + n + "身份证号码错误"];
    var c = {
        11: "\u5317\u4eac",
        12: "\u5929\u6d25",
        13: "\u6cb3\u5317",
        14: "\u5c71\u897f",
        15: "\u5185\u8499\u53e4",
        21: "\u8fbd\u5b81",
        22: "\u5409\u6797",
        23: "\u9ed1\u9f99\u6c5f",
        31: "\u4e0a\u6d77",
        32: "\u6c5f\u82cf",
        33: "\u6d59\u6c5f",
        34: "\u5b89\u5fbd",
        35: "\u798f\u5efa",
        36: "\u6c5f\u897f",
        37: "\u5c71\u4e1c",
        41: "\u6cb3\u5357",
        42: "\u6e56\u5317",
        43: "\u6e56\u5357",
        44: "\u5e7f\u4e1c",
        45: "\u5e7f\u897f",
        46: "\u6d77\u5357",
        50: "\u91cd\u5e86",
        51: "\u56db\u5ddd",
        52: "\u8d35\u5dde",
        53: "\u4e91\u5357",
        54: "\u897f\u85cf",
        61: "\u9655\u897f",
        62: "\u7518\u8083",
        63: "\u9752\u6d77",
        64: "\u5b81\u590f",
        65: "\u65b0\u7586",
        71: "\u53f0\u6e7e",
        81: "\u9999\u6e2f",
        82: "\u6fb3\u95e8",
        91: "\u56fd\u5916"
    };
    var b, l;
    var e, j;
    var a = new Array();
    a = k.split("");
    if (k == "") {
        return true;
    }
    if (c[parseInt(k.substr(0, 2))] == null) {
        return m[4];
    }
    switch (k.length) {
        case 15:
            if ((parseInt(k.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(k.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(k.substr(6, 2)) + 1900) % 4 == 0)) {
                ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;
            } else {
                ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;
            }
            if (ereg.test(k)) {
                var o = k.substr(6, 2);
                var f = k.substr(8, 2);
                var n = k.substr(10, 2);
                if (pa && pa.oServerDate) {
                    var g = pa.oServerDate;
                } else {
                    var h = new Date();
                    var g = new Date(h.getFullYear(), h.getMonth(), h.getDate());
                }
                var d = new Date(o, parseInt(f, 10) - 1, n);
                if ((Date.parse(d) - Date.parse(g)) >= 0) {
                    return m[5];
                }
                return m[0];
            } else {
                return m[2];
            }
            break;
        case 18:
            if (parseInt(k.substr(6, 4)) % 4 == 0 || (parseInt(k.substr(6, 4)) % 100 == 0 && parseInt(k.substr(6, 4)) % 4 == 0)) {
                ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
            } else {
                ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
            }
            if (ereg.test(k)) {
                e = (parseInt(a[0]) + parseInt(a[10])) * 7 + (parseInt(a[1]) + parseInt(a[11])) * 9 + (parseInt(a[2]) + parseInt(a[12])) * 10 + (parseInt(a[3]) + parseInt(a[13])) * 5 + (parseInt(a[4]) + parseInt(a[14])) * 8 + (parseInt(a[5]) + parseInt(a[15])) * 4 + (parseInt(a[6]) + parseInt(a[16])) * 2 + parseInt(a[7]) * 1 + parseInt(a[8]) * 6 + parseInt(a[9]) * 3;
                b = e % 11;
                j = "F";
                l = "10X98765432";
                j = l.substr(b, 1);
                if (j == a[17]) {
                    var o = k.substr(6, 4);
                    var f = k.substr(10, 2);
                    var n = k.substr(12, 2);
                    if (pa && pa.oServerDate) {
                        var g = pa.oServerDate;
                    } else {
                        var h = new Date();
                        var g = new Date(h.getFullYear(), h.getMonth(), h.getDate());
                    }
                    var d = new Date(o, parseInt(f, 10) - 1, n);
                    if ((Date.parse(d) - Date.parse(g)) >= 0) {
                        return m[5];
                    }
                    return m[0];
                } else {
                    return m[3];
                }
            } else {
                return m[2];
            }
            break;
        default:
            return m[1];
            break;
    }
    return true;
},

/**
 *身份证号
    */
certiNo: function (rule, value, callback) {
    let ruleText = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/,
        massageText=(rule.messageText?rule.messageText:'证件号码');
    if (value === '' || value==undefined) {
        rule.beNull?callback():callback(new Error('请输入'+massageText));
    } else if (!ruleText.test(value)) {
        callback(new Error(massageText+'格式不正确'));
    } else {
        callback();
    }
},

/**
 * 输入校验:校验车牌号
 */
checkCarMark: function (rule, value, callback) {
    let ruleText = /(^[\u4e00-\u9fa5][a-zA-Z][a-zA-Z0-9]{4}[a-zA-Z0-9\u4e00-\u9fa5]$)|(^[\u4e00-\u9fa5][a-zA-Z][DFA][a-zA-Z0-9]{5}$)|(^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}\*$)/,
        massageText=(rule.messageText?rule.messageText:'车牌号');
    if (value === '' || value==undefined) {
        rule.beNull?callback():callback(new Error(rule.inlineMessage?'必填':('请输入'+massageText)));
    } else if (value.length!=7 && value.length!=8 && value.length!=3) {
        callback(new Error(rule.inlineMessage?'格式错误':'请参照“京ABC123”或“京AD12345”格式填写车牌号'));
    } else if (!ruleText.test(value)) {
        callback(new Error(rule.inlineMessage?'格式错误':(value.length==8?'请参照“粤A[A/D/F]BC123”格式填写车牌号':'请参照“京ABC123”或“京AD12345”格式填写车牌号')));
    } else {
        callback();
    }
},

/**
 * 输入校验:邮箱地址
 */
email: function (rule, value, callback) {
    let ruleText = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/,
        massageText=(rule.messageText?rule.messageText:'邮箱地址');
    if (value === '' || value==undefined) {
        rule.beNull?callback():callback(new Error(rule.inlineMessage?'必填':('请输入'+massageText)));
    } else if (!ruleText.test(value)) {
        callback(new Error(rule.inlineMessage?'格式错误':(massageText+'格式不正确')));
    } else {
        callback();
    }
},
2.日期类配置

点击同一日期禁用日期(今日之前)禁用日期(明日之前)

/**
 * 日期选择组件,点击同一日期如:2025-08-05,自动转成[2025-08-05, 2025-08-06]
 * 使用:<el-date-picker :change="VTools.datePickerChange"/>
 */
datePickerChange (dateData) {
    dateData && dateData[0] === dateData[1] && (dateData[1] = new Date(new Date(dateData[1]).setDate(new Date(dateData[1]).getDate() + 1)).Format("yyyy-MM-dd"));
},

/**
 * 日期选择组件,只能选择今天之前的日期
 * 使用:<el-date-picker :picker-options="VTools.dateBeforeToday"/>
 */
dateBeforeToday: {
    disabledDate(time){
        return time.getTime() > Date.now() - 8.64e6
    }
},

/**
 * 日期选择组件,只能选择明天之前的日期
 * 使用:<el-date-picker :picker-options="VTools.dateBeforeTommorrow"/>
 */
dateBeforeTommorrow: {
    disabledDate(time) {
        return time.getTime() > Date.now();
    },
},
3.表格类配置

金额格式化

/**
 * 表格金额格式化
 * 使用:<el-table-column :formatter="VTools.toFix2"/>
 */
toFix2 (row,column,value) {
    return value?Number(value).toFixed(2):0.00;
},

二、全局工具

1.日期格式
/**
 * 日期格式化工具
 * format:将date格式日期按照pattern模板转成对应string格式日期
 * parse:将string格式日期按照pattern模板转成对应date格式日期
 */
formatDate:{
    format: function (date, pattern) {
        pattern = pattern || DEFAULT_PATTERN;
        return pattern.replace(SIGN_REGEXP, function ($0) {
            switch ($0.charAt(0)) {
                case 'y': return padding(date.getFullYear(), $0.length);
                case 'M': return padding(date.getMonth() + 1, $0.length);
                case 'd': return padding(date.getDate(), $0.length);
                case 'w': return date.getDay() + 1;
                case 'h': return padding(date.getHours(), $0.length);
                case 'm': return padding(date.getMinutes(), $0.length);
                case 's': return padding(date.getSeconds(), $0.length);
            }
        });
    },
    parse: function (dateString, pattern) {
        var matchs1 = pattern.match(SIGN_REGEXP);
        var matchs2 = dateString.match(/(\d)+/g);
        if (matchs1.length == matchs2.length) {
            var _date = new Date(1970, 0, 1);
            for (var i = 0; i < matchs1.length; i++) {
                var _int = parseInt(matchs2[i]);
                var sign = matchs1[i];
                switch (sign.charAt(0)) {
                    case 'y': _date.setFullYear(_int); break;
                    case 'M': _date.setMonth(_int - 1); break;
                    case 'd': _date.setDate(_int); break;
                    case 'h': _date.setHours(_int); break;
                    case 'm': _date.setMinutes(_int); break;
                    case 's': _date.setSeconds(_int); break;
                }
            }
            return _date;
        }
        return null;
    }
},
2.对象空值操作

去空值属性去属性值无效空格

/**
 * 对象去除空值属性
 */
removeEmpty:function(data){
    var result={};
    for(var key in data){
        if(data[key]!=''){
            result[key]=data[key]
        }
    }
    return result;
},

/**
 * 对象属性值去除无效空格
 */
trimData:(data)=>{
    let newData = {};
    if (typeof data == "object" && data!=null){
        if(data.length !=undefined){
            newData = [];
        }
        for(let key in data){
            if(typeof data[key] == 'string'){
                newData[key] = data[key].replace(/(^\s*)|(\s*$)/g, "")
            }else if(typeof data[key] == 'object'){
                newData[key] = Vue.prototype.GTools.trimData(data[key]);
            }else{
                newData[key] = data[key];
            }
        }
    }else{
        newData = data;
    }
    return newData;
},
3.金额格式化

价格格式化金额通用格式化

/**
 * 价格格式化->万元
 */
priceFormat:function(price){
    if(!price) return;
    var priceStr=price.toString();
    if(priceStr.lastIndexOf(".")!=-1){
        priceStr=priceStr.substr(0,priceStr.lastIndexOf("."));
    }
    var priceF;
    if(priceStr.length>4){
        priceF=priceStr.substring(0,(priceStr.length-4));
        priceF+=(priceStr.slice(-4,-3)!=='0')?"."+priceStr.slice(-4,-3):'';
        priceF+="万";
    }else{
        priceF=priceStr+"元";
    }
    return priceF;
},

/**
 * 金额格式化方法
 * 参数说明:(金额,是否含有两位小数,是否文本输出,是否更改单位)
 */
formatAmount:function(amount,noFloat,isLabel,changeUnit){
    let label='';
    let amountStr='';
    typeof(amount) !='number' && (amount=parseFloat(amount));
    if(changeUnit && amount>=999999999){
        amount=(parseFloat(amount)/100000000<1?(parseFloat(amount)/100000000).toFixed(2):(parseFloat(amount)/100000000).toFixed(noFloat?0:2) );
        label='亿';
    }else if(changeUnit && amount>=99999){
        amount=(parseFloat(amount)/10000<1?(parseFloat(amount)/10000).toFixed(2):(parseFloat(amount)/10000).toFixed(noFloat?0:2) );
        label='万';
    }else if(amount>0){
        amount=(parseFloat(amount)<1?parseFloat(amount).toFixed(2):parseFloat(amount).toFixed(noFloat?0:2));
    }
    if(isLabel){
        return label;
    }else {
        amount+=''
        let amountArr1=amount.split('.')[0];
        let amountArr2 ='';
        if( !noFloat && amount.indexOf('.')>=0) {
            amountArr2 = amount.split('.')[1];
        }
        while(amountArr1.length>3){
            let tempStr=amountArr1.substring(0,amountArr1.length%3==0?3:amountArr1.length%3);
            if(amountStr!=''){
                amountStr+=',';
            }
            amountStr+=tempStr;
            amountArr1=amountArr1.replace(tempStr,'');
        }
        if(amountStr!=''){
            amountStr+=',';
        }
        amountStr+=amountArr1;
        if(amountArr2){
            amountStr+='.'+amountArr2;
        }

        return amountStr;
    }
},
4.语音播报
/**
 * 语音播报方法
 */
AudioPlayBystr(str_tip,onstartBack,onendBack,onpauseBack,onresumeBack,onerror){
    var msg =new SpeechSynthesisUtterance();
    msg.rate = 0.8; //播放语速
    msg.pitch = 1; //音调高低
    msg.text = str_tip;
    msg.volume = 10 ;//播放音量
    msg.lang="zh-CN";//语言类型
    speechSynthesis.speak(msg);//播放
    msg.onstart=function() {//开始播放
        onstartBack && onstartBack();
    };
    msg.onend=function() {//播放完成
        onendBack && onendBack();
    };
    msg.onpause=function() {//播放暂停
        onpauseBack && onpauseBack();
    };
    msg.onresume=function() {//播放重新开始
        onresumeBack && onresumeBack();
    };
    msg.onerror=function(error){//播放出现错误
        onerror && onerror(error);
    };
},

三、内置对象原型方法扩展

1.Date

指定格式化日期格式化时间格式化

/**
 * Date对象指定格式化:yyyy-MM-dd hh:mm:ss
 */
Date.prototype.Format = function (fmt) {
    let o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (let k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};

/**
 * Date对象格式化:年-月-日
 */
Date.prototype.toLocalJSON = function () {
    var day = this.getDate(),
        month = this.getMonth() + 1,
        year = this.getFullYear();
    if (day < 10) {
        day = "0" + day;
    }
    if (month < 10) {
        month = "0" + month;
    }
    return year + "-" + month + "-" + day;
};

/**
 * Date对象格式化:年-月-日 时:分:秒
 */
Date.prototype.toLocalJSONAll = function () {
    var day = this.getDate(),
        month = this.getMonth() + 1,
        year = this.getFullYear(),
        hour=this.getHours(),
        minute=this.getMinutes(),
        second=this.getSeconds();
    if (day < 10) {
        day = "0" + day;
    }
    if (month < 10) {
        month = "0" + month;
    }
    if (hour < 10) {
        hour = "0" + hour;
    }
    if (minute < 10) {
        minute = "0" + minute;
    }
    if (second < 10) {
        second = "0" + second;
    }
    return year + "-" + month + "-" + day + ' ' + hour + ':' + minute + ':' + second;
};

/**
 * Date对象格式化:时:分:秒
 */
Date.prototype.toLocalJSONTime = function () {
    var hour=this.getHours(),
        minute=this.getMinutes(),
        second=this.getSeconds();
    if (hour < 10) {
        hour = "0" + hour;
    }
    if (minute < 10) {
        minute = "0" + minute;
    }
    if (second < 10) {
        second = "0" + second;
    }
    return hour + ':' + minute + ':' + second;
};
2.Vue

notify提示有效数据长度自适应autoTable

/**
 * notify提示二次封装
 */
Vue.prototype._GMessage = ({message,type,duration}) => {
    //如果需要提示不抵冲则注释掉下方closeAll,现先保持与message一样新的抵冲掉旧的
    // Vue.prototype.$notify.closeAll();
    Vue.prototype.$notify({
        message: message || '',
        type: type || 'info',
        title: type == 'success'? '成功': type == 'error'? '失败' : '提示',
        position: 'top-right',
        duration: duration || 5500,
        customClass: 'tcNotify'
    });
};

/**
 * 目标对象有效数据长度
 */
Vue.prototype._DataSize=(data)=>{
    let result=0;
    switch(typeof data){
        case 'string':
            result = data.length;
            break;
        case 'object':
            result = data?Object.keys(data).length:0;
            break;
        case 'number':
        case 'boolean':
            result = 1;
            break;
        case 'undefined':
        default :
            result = 0;
            break;
    }
    return result;
};

/**
 * autoTable计算
 * target说明:
 *      prop: 数据key
 *      1abe1: 表头
 *      className: 列的 className
 *      too1tip: 是否鼠标具浮展示
 *      fixed: 是否浮动固定列
 *      tips: 提示信息
 *      align: 列对齐
 *      formatter: 数据格式化方法
 *      search: 是否过滤
 *      slot: 插槽
 *      forcesize: 固定宽度,通常与tooltip搭配使用
 *      sizeLimit: 最长宽度,通常与forceSize搭配使用
 *      meta: 业务自定义透传对象,key不能与上面重复
 * 使用说明:
 *      表头初始化:建议放在created中直接使用:
 *      this.listColumns = this._handleAutoColumns(this.sourceColumns, []);
 *          this.columns: el-table内 用template遍历el-table-column
 *          this.sourceColumns: 为表头配置信息
 *  <template v-for="columnObj in listColumns">
        <el-table-column v-if="columnObj.fixed" :fixed="columnObj.fixed" :prop="columnObj.key" :label="columnObj.label" :width="columnObj.width?columnObj.width:100" :class-name="columnObj.className" :show-overflow-tooltip="columnObj.tooltip">
        </el-table-column>
        <el-table-column v-else-if="columnObj.key=='statusFormat'" :label="columnObj.label" :min-width="columnObj.width?columnObj.width:100" :class-name="columnObj.className" :show-overflow-tooltip="columnObj.tooltip">
            <template slot-scope="scope" v-if="!scope.row.isEmpty">
                <i class="fa fa-circle" :class="scope.row.status=='1'?'colorGreen':'colorRed'">{{scope.row.status=='1'?'有效':'无效'}}</i>
            </template>
        </el-table-column>
        <el-table-column v-else-if="columnObj.key=='operateFormat'" fixed="right" :label="columnObj.label" :min-width="columnObj.width?columnObj.width:100" :class-name="columnObj.className" :show-overflow-tooltip="columnObj.tooltip">
            <template slot-scope="scope" v-if="!scope.row.isEmpty">
                <el-button size="mini" @click="handleEdit(scope.$index, scope.row)" style="margin-left:0;">查看/修改</el-button>
                <!--<el-button v-if="userInfo.userInfo.isOrgAdmin=='1'" size="mini" @click="handleReset(scope.$index, scope.row)">重置密码</el-button>-->
                <el-button type="danger" size="mini" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
            </template>
        </el-table-column>
        <el-table-column v-else :prop="columnObj.key" :label="columnObj.label" :min-width="columnObj.width?columnObj.width:100" :class-name="columnObj.className" :show-overflow-tooltip="columnObj.tooltip">
        </el-table-column>
    </template>
 * 
 *      表头根据数据动态调整:建议放在http请求回调中使用:
 *      this.listColumns = this._handleAutoColumns(this.sourceColumns, target);
 */
Vue.prototype._handleAutoColumns = (target, source) => {
    return autoColumns(target,source);
}
function autoColumns(targetList, sourceData) {
    const unitwidth = 14;
    const exWidth = 22;
    const result = [];
    const specailExwidth = {};
    targetList && targetList.forEach((temp) => {
        const data = {
            ...(temp.meta || {}),
            prop: temp.prop,
            label: temp.label,
            className: temp.className ? temp.className : '',
            tooltip: temp.tooltip ? temp.tooltip : false,
            fixed: temp.fixed ? temp.fixed : false,
            tips: temp.tips ? temp.tips : '',
            align: temp.align ? temp.align : '',
            formatter: temp.formatter ? temp.formatter : null,
            search: temp.search || null,
            slot: temp.slot || '',
            forcesize: temp.forcesize,
            sortable: temp.sortable || false
        }
        if (temp.children && temp.children.length > 0) {
            const subList = autoColumns(temp.children, sourceData);
            data['children'] = subList;
            result.push(data)
        } else {
            let maxsize = temp.defaultsize ? temp.defaultsize : 0;
            if (!temp.forcesize || temp.sizeLimit) {
                sourceData && sourceData.forEach((item) => {
                    const str = item[temp.prop] + '' ? item[temp.prop] + '' : '';
                    const substr = str ? str.replace(/[a-zA-Z\d\*\,\.\;\:\"\'\-\_\s]/g, '') : '';
                    const tempsize = Math.ceil(subStr.length * 0.55 + (str.length - subStr.length));
                    maxSize = Math.max(maxSize,tempSize);
                });
                temp.label && (maxsize = Math.max(maxSize, temp.label.length));
            }
            if (temp.sizeLimit) {
                maxSize = Math.min(maxSize, temp.sizeLimit);
            }
            if (temp.fixed) {
                data['fixed'] = temp.fixed;
            }

            data['width'] = Math.ceil(maxSize * unitwidth) + exwidth;
            specailExWidth[temp.prop] && (data['width'] += specailExWidth[temp.prop]);
            result.push(data);
        }
    });
    return result;
}

关于自适应autoTable的el-table的优化方案,【autoTable + 配置式开发 + 配置式模板】将在后续进行进一步讲解,敬请期待!

实用的全局方法是结合实际使用环境逐步迭代的,并且是需要结合实际环境进行针对性的具体实现调整。本帖子持续更新中...


网站公告

今日签到

点亮在社区的每一天
去签到