通用JavaScript方法封装
在现代Web开发中,许多应用程序都需要处理常见的操作,如日期格式化、表单重置、数据字典回显、树形结构数据构建等。为了提高开发效率并减少重复代码,我们可以将这些常用的操作封装成通用函数,以便在多个项目中复用。以下是一些常用的JavaScript方法封装,它们可以大大简化前端开发中的任务。
1. 日期格式化 parseTime
日期和时间的格式化是Web开发中经常遇到的需求,parseTime
方法能够将时间对象或时间戳格式化为指定格式的字符串。
javascript
复制代码
export function parseTime(time, pattern) {if (arguments.length === 0 || !time) {return null;}const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';let date;if (typeof time === 'object') {date = time;} else {if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {time = parseInt(time);} else if (typeof time === 'string') {time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/.[\d]{3}/gm), '');}if ((typeof time === 'number') && (time.toString().length === 10)) {time = time * 1000;}date = new Date(time);}const formatObj = {y: date.getFullYear(),m: date.getMonth() + 1,d: date.getDate(),h: date.getHours(),i: date.getMinutes(),s: date.getSeconds(),a: date.getDay()};const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {let value = formatObj[key];if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value]; }if (result.length > 0 && value < 10) {value = '0' + value;}return value || 0;});return time_str;
}
2. 表单重置 resetForm
在开发中,表单重置是一个常见需求。resetForm
方法可以快速清空表单中的所有数据,重置表单字段。
javascript
复制代码
export function resetForm(refName) {if (this.$refs[refName]) {this.$refs[refName].resetFields();}
}
3. 添加日期范围 addDateRange
在某些情况下,我们需要将用户选择的日期范围添加到请求参数中。addDateRange
方法能够将日期范围自动添加到请求参数中。
javascript
复制代码
export function addDateRange(params, dateRange, propName) {let search = params;search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};dateRange = Array.isArray(dateRange) ? dateRange : [];if (typeof (propName) === 'undefined') {search.params['beginTime'] = dateRange[0];search.params['endTime'] = dateRange[1];} else {search.params['begin' + propName] = dateRange[0];search.params['end' + propName] = dateRange[1];}return search;
}
4. 数据字典回显 selectDictLabel
和 selectDictLabels
在前端开发中,我们经常需要将后端返回的数值字典转化为用户友好的标签。selectDictLabel
和 selectDictLabels
方法可以帮助你实现这一点。
javascript
复制代码
export function selectDictLabel(datas, value) {if (value === undefined) {return "";}var actions = [];Object.keys(datas).some((key) => {if (datas[key].value == ('' + value)) {actions.push(datas[key].label);return true;}})if (actions.length === 0) {actions.push(value);}return actions.join('');
}export function selectDictLabels(datas, value, separator) {if (value === undefined || value.length === 0) {return "";}if (Array.isArray(value)) {value = value.join(",");}var actions = [];var currentSeparator = undefined === separator ? "," : separator;var temp = value.split(currentSeparator);Object.keys(value.split(currentSeparator)).some((val) => {var match = false;Object.keys(datas).some((key) => {if (datas[key].value == ('' + temp[val])) {actions.push(datas[key].label + currentSeparator);match = true;}})if (!match) {actions.push(temp[val] + currentSeparator);}})return actions.join('').substring(0, actions.join('').length - 1);
}
5. 字符串格式化 sprintf
字符串格式化是另一种常见需求,sprintf
方法可以将占位符 %s
替换为实际的参数。
javascript
复制代码
export function sprintf(str) {var args = arguments, flag = true, i = 1;str = str.replace(/%s/g, function () {var arg = args[i++];if (typeof arg === 'undefined') {flag = false;return '';}return arg;});return flag ? str : '';
}
6. 转换字符串为空 parseStrEmpty
在处理数据时,我们经常需要将 undefined
或 null
转换为空字符串。parseStrEmpty
方法可以帮助我们实现这一点。
javascript
复制代码
export function parseStrEmpty(str) {if (!str || str == "undefined" || str == "null") {return "";}return str;
}
7. 数据合并 mergeRecursive
mergeRecursive
方法可以将两个对象进行递归合并,合并过程中如果遇到对象类型的值会递归合并,非对象类型的值会覆盖源对象中的值。
javascript
复制代码
export function mergeRecursive(source, target) {for (var p in target) {try {if (target[p].constructor == Object) {source[p] = mergeRecursive(source[p], target[p]);} else {source[p] = target[p];}} catch (e) {source[p] = target[p];}}return source;
};
8. 构造树形结构数据 handleTree
构造树形结构数据在许多场景中都非常有用,特别是在处理菜单或组织结构数据时。handleTree
方法可以将扁平的数据转化为树形结构。
javascript
复制代码
export function handleTree(data, id, parentId, children) {let config = {id: id || 'id',parentId: parentId || 'parentId',childrenList: children || 'children'};var childrenListMap = {};var nodeIds = {};var tree = [];for (let d of data) {let parentId = d[config.parentId];if (childrenListMap[parentId] == null) {childrenListMap[parentId] = [];}nodeIds[d[config.id]] = d;childrenListMap[parentId].push(d);}for (let d of data) {let parentId = d[config.parentId];if (nodeIds[parentId] == null) {tree.push(d);}}for (let t of tree) {adaptToChildrenList(t);}function adaptToChildrenList(o) {if (childrenListMap[o[config.id]] !== null) {o[config.childrenList] = childrenListMap[o[config.id]];}if (o[config.childrenList]) {for (let c of o[config.childrenList]) {adaptToChildrenList(c);}}}return tree;
}
9. 参数处理 tansParams
有时我们需要将对象格式的参数转化为查询字符串格式,tansParams
方法可以将对象中的嵌套属性转换为URL参数格式。
javascript
复制代码
export function tansParams(params) {let result = '';for (const propName of Object.keys(params)) {const value = params[propName];var part = encodeURIComponent(propName) + "=";if (value !== null && value !== "" && typeof (value) !== "undefined") {if (typeof value === 'object') {for (const key of Object.keys(value)) {if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {let params = propName + '[' + key + ']';var subPart = encodeURIComponent(params) + "=";result += subPart + encodeURIComponent(value[key]) + "&";}}} else {result += part + encodeURIComponent(value) + "&";}}}return result;
}
10. 获取标准路径 getNormalPath
getNormalPath
方法能够修正路径格式,确保路径符合标准。
javascript
复制代码
export function getNormalPath(p) {if (p.length === 0 || !p || p == 'undefined') {return p;};let res = p.replace('//', '/');if (res[res.length - 1] === '/') {return res.slice(0, res.length - 1);}return res;
}
11. 验证Blob格式 blobValidate
blobValidate
方法可以判断文件是否为非JSON格式的Blob对象。
javascript
复制代码
export function blobValidate(data) {return data.type !== 'application/json';
}
通过将这些通用的方法封装成独立的函数,我们能够提高开发效率,并减少重复代码。这些函数能够帮助开发者轻松实现常见的需求,如日期格式化、表单操作、树形结构处理等,进而提升整个项目的可维护性和开发体验。
4o