vue+elementUI开发过程常用方法封装

Posted luoxuemei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue+elementUI开发过程常用方法封装相关的知识,希望对你有一定的参考价值。

  1 /*
  2  * Created by luoxuemei on 2019/09/02.
  3  */
  4 
  5 // 拖动调整左右两侧div的宽度
  6 // resizeName表示拖到的工具条的className
  7 // left表示左边的区域的className。leftWid表示左边的最小宽度
  8 // midName表示右边区域的className。rightWid表示右边的最小宽度
  9 // boxName表示父级元素的className
 10 import moment from moment; 
 11 export function  dragControllerDiv(resizeName=resize, leftName = left, midName = mid, boxName = box, leftWid = 250, rightWid = 800){
 12   var resize = document.getElementsByClassName(resizeName);
 13   var left = document.getElementsByClassName(leftName);
 14   var mid = document.getElementsByClassName(midName);
 15   var box = document.getElementsByClassName(boxName);
 16   for (let i = 0; i < resize.length; i++) {
 17     // 鼠标按下事件
 18     resize[i].onmousedown = function (e) {
 19       var startX = e.clientX;
 20       resize[i].left = resize[i].offsetLeft;
 21       // 鼠标拖动事件
 22       document.onmousemove = function (e) {
 23         var endX = e.clientX;
 24         var moveLen = resize[i].left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
 25         var maxT = box[i].clientWidth - resize[i].offsetWidth;  // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
 26 
 27         if (moveLen < leftWid) moveLen = leftWid; // 左边区域的最小宽度为150px
 28         if (moveLen > maxT - rightWid) moveLen = maxT  - rightWid;  //右边区域最小宽度为800px
 29 
 30         resize[i].style.left = moveLen; // 设置左侧区域的宽度
 31 
 32         for (let j = 0; j < left.length; j++) {
 33           left[j].style.width = moveLen + px;
 34           mid[j].style.width = (box[i].clientWidth - moveLen - 10) + px;
 35         }
 36       }
 37       // 鼠标松开事件
 38       document.onmouseup = function (evt) {
 39         document.onmousemove = null;
 40         document.onmouseup = null;
 41         resize[i].releaseCapture && resize[i].releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
 42       }
 43       resize[i].setCapture && resize[i].setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
 44       return false;
 45     }
 46   }
 47 }
 48 
 49 
 50 // 对象深拷贝
 51 export function deepCopy(obj) {
 52   var result = Array.isArray(obj) ? [] : {}
 53   for (var key in obj) {
 54     if (obj.hasOwnProperty(key)) {
 55       if (typeof obj[key] === object && obj[key] !== null) {
 56         result[key] = deepCopy(obj[key])
 57       } else {
 58         result[key] = obj[key]
 59       }
 60     }
 61   }
 62   return result
 63 }
 64 
 65 /*菜单树下拉,禁止选择当前项及其子项,以防止死循环*/
 66 export function diGuiTreeEdit(item, compID) {  // 编辑情况下,禁止选择当前节点及其子节点
 67   const dataSor = item
 68   let treeAry = []
 69   for (let i in dataSor) {
 70     const v = dataSor[i]
 71     let node = {}
 72     if (v === null || v === undefined) { }
 73     else {
 74       if (v.children && v.children.length > 0) {
 75         if (v.id == compID) {
 76           node.isDisabled = true
 77         } else {
 78           node.isDisabled = false
 79         }
 80         node.id = v.id
 81         node.label = v.label
 82         node.name = v.name
 83         node.children = diGuiTreeEdit(v.children, compID)
 84         treeAry.push(node)
 85       } else {
 86         if (v.id == compID) {
 87           node.isDisabled = true
 88         } else {
 89           node.isDisabled = false
 90         }
 91         node.id = v.id
 92         node.label = v.label
 93         node.name = v.name
 94         treeAry.push(node)
 95       }
 96     }
 97   }
 98   return treeAry
 99 }
100 
101 
102 // 递归遍历根据id,找到对应的node节点。treeAry主要是用于递归push的值
103 export function rspTreeNodeFormID(item,id,idVal, treeAry=[]) {
104   const dataSor = item
105   for (let v of dataSor) {
106     if (v === null || v === undefined) { }
107     else {
108       if (v.children && v.children.length > 0) {
109         if (v[id] == idVal) {
110           treeAry.push(v)
111           break
112         } else {
113           rspTreeNodeFormID(v.children, id, idVal,treeAry )
114         }
115       } else {
116         if (v[id] == idVal) {
117           treeAry.push(v)
118           break
119         }
120       }
121     }
122   }
123   return treeAry
124 }
125 
126 // 递归遍历根据id,找到对应的node节点下的data属性里面的对应的值。treeAry主要是用于递归push的值
127 export function rspTreeNodeDataFormID(item,firstAttr,secAttr,idVal, treeAry=[]) {
128   const dataSor = item
129   for (let v of dataSor) {
130     if (v === null || v === undefined) { }
131     else {
132       if (v.children && v.children.length > 0) {
133         if (v[firstAttr] && v[firstAttr][secAttr] && v[firstAttr][secAttr] == idVal) {
134           treeAry.push(v)
135           break
136         } else {
137           rspTreeNodeDataFormID(v.children, firstAttr,secAttr, idVal,treeAry )
138         }
139       } else {
140         if (v[firstAttr] && v[firstAttr][secAttr] && v[firstAttr][secAttr] == idVal) {
141           treeAry.push(v)
142           break
143         }
144       }
145     }
146   }
147   return treeAry
148 }
149 
150 
151 // 传入按钮组和按钮权限组,判断按钮组的按钮是否存在权限组里面,存在则true。不存在则false
152 export function btnPermissFun(btnList, permissList) {
153   for(let item in btnList){
154     let isPermiss = false
155     for(let pitem of permissList) {
156       if(item == pitem.code) {
157         isPermiss = true
158         break
159       }
160     }
161     btnList[item] = isPermiss
162   }
163   return btnList
164 }
165 
166 
167 // 字符串合并
168 export function strMergeCom(str1, str2){
169   if(str1== null) {
170     str1 = ‘‘
171   }
172   if(str2 == null) {
173     str2 = ‘‘
174   }
175   return `${str1}(${str2})`
176 }
177 
178 // 根据id,以及id的值,遍历list对象,得出label
179 export function rstLabelFormID(list, id, label, idVal) {
180   let rsp = ‘‘
181   for (let i = 0; i < list.length; i++) {
182     if (list[i][id] === idVal) {
183       rsp = list[i][label]
184       break
185     }
186   }
187   return rsp
188 }
189 // 根据id,以及id的值,遍历list集合,得出对应的对象
190 export function rstListFormID(list, id, idVal) {
191   let rsp = undefined
192   for (let i = 0; i < list.length; i++) {
193     if (list[i][id] === idVal) {
194       rsp = list[i]
195       break
196     }
197   }
198   return rsp
199 }
200 // 根据id,label,以及id的值和label的值,遍历list集合,得出对应的对象集合
201 // 此处是比对2个对象,过滤出包含的,类似于模糊搜索id或者名称
202 export function rstListFormIDOrLabel(list, id,label, compVal) {
203   let newAry = []
204   for (let i = 0; i < list.length; i++) {
205     if (list[i][id].includes(compVal) || list[i][label].includes(compVal)) {
206       newAry.push(list[i])
207     }
208   }
209   return newAry
210 }
211 
212 // 遍历obj已有的排序对象,对另一个对象进行排序
213 // compField表示两个对象关联的属性,类似与外键
214 export function sortObjFromObj(sortObj, orgObj, compField = id) {
215   var arr = Object.keys(sortObj);
216   if(arr.length >0) { // 用于排序的不为空
217     let sortOrgObj = []
218     const newItemAry = []// 移除为空的项
219     for(let item of orgObj) {
220       sortOrgObj[(sortObj[item[compField]])-1] = item // 此处保存的数组,存在空值
221     }
222     for(let newItem of sortOrgObj) {
223       if(newItem) {
224         newItemAry.push(newItem)
225       }
226     }
227     return newItemAry
228   } else {
229     return orgObj
230   }
231 }
232 
233 // 判断数据是否为空,为空的话返回指定的数值
234 export function isNullORFalse(checkVal,rstVal) {
235   if(checkVal == ‘‘ || checkVal == null || checkVal == undefined || typeof(checkVal) == undefined){
236     if(rstVal == null || rstVal == ‘‘){
237       rstVal = "";
238     }
239     return rstVal;
240   } else {
241     return checkVal;
242   }
243 }
244 
245 // 判断数组的每一项是否不为空,或者不为undefined。不为空的话,返回true;为空返回false
246 // 如果不为空,返回true
247 export function isNotNullObj(objAry) {
248   let isNull =  false
249   for(let item of objAry){
250     if(item != "" && item != null && item != undefined && typeof item != undefined) {
251       isNull = true
252       break
253     }
254   }
255   return isNull
256 }
257 
258 // 获取的localstrage是否为空或者不存在,则转为空数组[]
259 export function getNullLocalstrageToAry(str) {
260   if(str == null || typeof(str) == undefined ) {
261     return [];
262   } else{
263     return str;
264   }
265 }
266 
267 // 根据文件url,判断是否指定的文件类型,返回bool值
268 // 定义视频和图片的文件后缀。通过这个后缀去判断文件类型
269 const VIDEO_TYPE = [mp4, ogg, webm,mkv];
270 const IMAGE_TYPE = [jpg, png, gif, webp, jpeg,];
271 export function isFileType(fileUrl,fileType) {
272   const fileTypeName = (fileUrl).substring(fileUrl.lastIndexOf(.) * 1 + 1 * 1);  // 获取后缀名
273   // 文件后缀和兼容的格式,统一转为小写比对
274   const fileTypeNameLower = fileTypeName.toLowerCase();
275   if (fileType == image) {
276     let supportFormat = IMAGE_TYPE;
277     let index = supportFormat.indexOf(fileTypeNameLower);
278     if (index == -1) {  // 说明核实不符合
279       return false;
280     } else {
281       return true;
282     }
283   } else if (fileType == video) {
284     let supportFormat = VIDEO_TYPE;
285     let index = supportFormat.indexOf(fileTypeNameLower);
286     if (index == -1) {  // 说明核实不符合
287       return false;
288     } else {
289       return true;
290     }
291   }
292 }
293 // 当数值过大是,超过9位数(亿)转为亿单位展示
294 export function rspHundredMill(val, unit = HM) {
295   if(unit == HM) {
296     if(val>100000000) { //大于1亿
297       return (val/100000000).toFixed(3)+亿
298     } else {
299       return  val
300     }
301   }
302 }
303 
304 // 全部替换
305 // str表示原字符串,s表示要被替换的内容,replaceStr用于替换的内容
306 export function repalceAll(str, s ,replaceStr = ‘‘) {
307   var reg = new RegExp(s, "g")//g,表示全部替换
308   return str.replace(reg,replaceStr)
309 }
310 
311 //计算两个日期天数差的函数,通用,时间格式为yyyy-MM-dd格式
312 export function dateDiff(sDate1, sDate2) {  //sDate1和sDate2是yyyy-MM-dd格式
313   let aDate, oDate1, oDate2, iDays
314   aDate = sDate1.split("-")
315   oDate1 = new Date(aDate[1] + - + aDate[2] + - + aDate[0])  //转换为yyyy-MM-dd格式
316   aDate = sDate2.split("-")
317   oDate2 = new Date(aDate[1] + - + aDate[2] + - + aDate[0])
318   iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒数转换为天数
319   return iDays;  //返回相差天数
320 }
321 
322 // 获取当前时刻
323 // ymdhms表示返回年月日时分秒,ymd表示返回年月日,hms表示返回时分秒
324 export function curDateTime(type=ymdhms) {
325   function getNow(s) {
326     return s < 10 ? 0 + s : s
327   }
328   const myDate = new Date()
329 
330   const year = myDate.getFullYear() // 获取当前年
331   const month = myDate.getMonth() + 1 * 1 // 获取当前月
332   const date = myDate.getDate() // 获取当前日
333 
334   const h = myDate.getHours() // 获取当前小时数(0-23)
335   const m = myDate.getMinutes() // 获取当前分钟数(0-59)
336   const s = myDate.getSeconds()
337 
338   let now = year + - + getNow(month) + - + getNow(date) +   + getNow(h) + : + getNow(m) + : + getNow(s)
339   if(type == ymd) {
340     now = year + - + getNow(month) + - + getNow(date)
341   } else if(type == hms) {
342     now = getNow(h) + : + getNow(m) + : + getNow(s)
343   }
344   return now
345 }
346 
347 // 获取今天星期几
348 export function getWeekFun() {
349   const weekDay = [星期日,星期一,星期二,星期三,星期四,星期五,星期六]
350   let week = new Date().getDay();
351   return weekDay[week];
352 }
353 
354 // 查询最近n年,n表示前多少年的意思
355 // 例如查询近5年的时间,n=4,不包括今年的的前4年
356 export function getLastNYear(n) {
357   const myDate = new Date;
358   const curYear = myDate.getFullYear();
359   if(n ==‘‘ || n==undefined || n == null){
360     n =0;
361   }
362   let rstYear = curYear*1 - n*1;
363   return rstYear;
364 }
365 
366 // 查询最近n月,n表示前多少月的意思
367 export function getLastNMonth(n) {
368   const myDate = new Date;
369   const curYear = myDate.getFullYear();
370   const curMonth = myDate.getMonth()+1; // 月份从0开始算起。需要加1
371   if(n ==‘‘ || n==undefined || n == null){n =0;}
372   let rstYear = ‘‘;
373   let rstMonth = ‘‘;
374   if(n>curMonth){ //表示去到去年的月份,年份需要去到上一年
375     rstYear = curYear*1-1*1;
376     rstMonth = 12-(n-curMonth)+1;
377   } else {
378     rstYear =curYear;
379     rstMonth = curMonth -n;
380   }
381   rstMonth = (rstMonth)>9?rstMonth:0+(rstMonth);
382   let rstYearMonth = rstYear + - + rstMonth;
383   return rstYearMonth;
384 }
385 
386 // 获取最近n天的时间,n表示前多少天的意思。
387 // 例如查询近7天的时间,n=6,不包括当天的的前6天
388 // fommatterb表示间隔符,例如:-,/
389 export function getLastNDate(n,fommatter =-) {
390   const d = new Date();
391   var myDate=new Date(d.getTime()-86400000*n);  // 获取前n天的日期
392   const year = myDate.getFullYear()>9?myDate.getFullYear():0+myDate.getFullYear();
393   const month = (myDate.getMonth() + 1)>9?myDate.getMonth() + 1:0+(myDate.getMonth() + 1);
394   const date = myDate.getDate()>9?myDate.getDate():0+myDate.getDate();
395   let last7Date = year + fommatter + month + fommatter + date;
396   return last7Date;
397 }
398 // 获取最近的n个小时,n表示前多少小时的意思。
399 export function getLastNHour(n,fommatter =-) {
400   const d = new Date();
401   var myDate=new Date(d.getTime()-86400000*n);  // 获取前n天的日期
402   const year = myDate.getFullYear()>9?myDate.getFullYear():0+myDate.getFullYear();
403   const month = (myDate.getMonth() + 1)>9?myDate.getMonth() + 1:0+(myDate.getMonth() + 1);
404   const date = myDate.getDate()>9?myDate.getDate():0+myDate.getDate();
405   const h = myDate.getHours()>9?myDate.getHours():0+myDate.getHours();       //获取当前小时数(0-23)
406   const m = myDate.getMinutes()>9?myDate.getMinutes():0+myDate.getMinutes();     //获取当前分钟数(0-59)
407   const s = myDate.getSeconds()>9?myDate.getSeconds():0+myDate.getSeconds();
408   let  nowTime = year + fommatter + month + fommatter + date + " " + h + fommatter + m + fommatter + s;
409   return nowTime;
410 }
411 
412 
413 // 搜索时间下拉框,快捷键
414 export const pickerOptionsTimeEle = [{
415   text: 今日,
416   onClick(picker) {
417     const end = new Date()
418     end.setTime(end.getTime())
419     end.setHours(end.getHours())
420     end.setMinutes(end.getMinutes())
421     end.setSeconds(end.getSeconds())
422     const start = new Date()
423     start.setTime(start.getTime())
424     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
425     picker.$emit(pick, [start, end])
426   }
427 },
428 {
429   text: 近7天,
430   onClick(picker) {
431     const end = new Date()
432     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
433     const start = new Date()
434     start.setTime(start.getTime() - 3600 * 1000 * 24 * 6)
435     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
436     picker.$emit(pick, [start, end])
437   }
438 },
439 {
440   text: 近30天,
441   onClick(picker) {
442     const end = new Date()
443     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
444     const start = new Date()
445     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
446     start.setTime(start.getTime() - 3600 * 1000 * 24 * 29)
447     picker.$emit(pick, [start, end])
448   }
449 },
450 {
451   text: 昨天,
452   onClick(picker) {
453     const end = new Date()
454     end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
455     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
456     const start = new Date()
457     start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
458     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
459     picker.$emit(pick, [start, end])
460   }
461 },
462 {
463   text: 最近90天,
464   onClick(picker) {
465     const end = new Date()
466     end.setHours(23); end.setMinutes(59); end.setSeconds(59)
467     const start = new Date()
468     start.setHours(0); start.setMinutes(0); start.setSeconds(0)
469     start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
470     picker.$emit(pick, [start, end])
471   }
472 }]
473 
474 
475 export function getCurrWeekDays () {
476   let date=[];
477   let weekOfday = moment().format(E);//计算今天是这周第几天
478   let start = moment().subtract(weekOfday-1, days).format(YYYY-MM-DD);//周一日期
479   let end= moment().add(7-weekOfday, days).format(YYYY-MM-DD);//周日日期
480   date.push(start)
481   date.push(end)
482   return date
483 }
484 export function getCurrMonthDays(){
485   let date = []
486   let start = moment().startOf(month).format(YYYY-MM-DD)
487   let end = moment().endOf(month).format(YYYY-MM-DD)
488   date.push(start)
489   date.push(end)
490   return date
491 }
492 // elementUI 时间范围选择器,数据格式转换
493 // 时间范围选择,中国标准时间转为yyyy-MM-dd HH:mm:ss.
494 export function standardTimeToYMDHMS(timeStr) {
495   if(timeStr == null || typeof(timeStr) == undefined ) {
496     return ‘‘;
497   } else{
498     return timeStr.getFullYear() + - +
499       ((timeStr.getMonth() + 1)>9?(timeStr.getMonth() + 1):0+(timeStr.getMonth() + 1)) + - +
500       (timeStr.getDate()>9?timeStr.getDate():0+timeStr.getDate()) +   +
501       (timeStr.getHours()>9?timeStr.getHours():0+timeStr.getHours()) + : +
502       (timeStr.getMinutes()>9?timeStr.getMinutes():0+timeStr.getMinutes()) + : +
503       (timeStr.getSeconds()>9?timeStr.getSeconds():0+timeStr.getSeconds());
504   }
505 }
506 
507 // 用于数据库管理,动态条件拼接
508 // 遍历搜索条件,把时间范围搜索的条件的参数拆分成min,max
509 // {fieldValue: ["2019-09-21 00:00:00", "2019-10-22 00:00:00"]}拆分成{min:‘2019-09-21 00:00:00‘,max:‘2019-10-22 00:00:00‘}
510 // luoxm@2019-09-21
511 export function dataPackage(list) {
512   for(let i =0; i<list.length; i++) {
513     if(list[i][javaType] == datetime && list[i][fieldValue]) {
514       if(list[i][fieldValue].length>0 && list[i][fieldValue].length == 2) {
515         list[i][min] = list[i][fieldValue][0]
516         list[i][max] = list[i][fieldValue][1]
517         list[i][fieldValue] = undefined
518       }
519     }
520   }
521   return list
522 }
523 // 用于数据库管理,动态条件拼接
524 // 和dataPackageshi是翻转的一个操作
525 // 遍历搜索条件,把min,max参数拼装成时间范围搜索的条件
526 // {min:‘2019-09-21 00:00:00‘,max:‘2019-10-22 00:00:00‘}拼装成{fieldValue: ["2019-09-21 00:00:00", "2019-10-22 00:00:00"]}
527 // luoxm@2019-09-21
528 export function dataPackageReverse(list) {
529   for(let i =0; i<list.length; i++) {
530     if(list[i][javaType] == datetime && list[i][min] && list[i][max]) {
531       list[i][fieldValue] = []
532       list[i][fieldValue].push(list[i][min])
533       list[i][fieldValue].push(list[i][max])
534       list[i][min] = undefined
535       list[i][max] = undefined
536     }
537   }
538   return list
539 }
540 
541 // 把后台返回的时间默认值,赋值到搜索条件上
542 export function setQryParam(list) {
543   for(let i =0; i<list.length; i++) {
544     if(list[i][javaType] == datetime && list[i][min] && list[i][max]) {
545       list[i][fieldValue] = []
546       list[i][fieldValue][0] = list[i][min]
547       list[i][fieldValue][1] = list[i][max]
548     }
549   }
550   return list
551 }
552 // 过滤掉javaType=feature的对象
553 export function paramNotFeatureFun(obj) {
554   let rspData = []
555   for(let item of obj) {
556     if(item.javaType != feature) {
557       rspData.push(item)
558     }
559   }
560   return rspData
561 }
562 // 用于数据库管理,动态条件拼接,把阈值从【0,1】转为【0-100】
563 export function similarExpand100(list) {
564   for(let item of list) {
565     if(item.javaType == feature) {
566       if(item.similar) {
567         item.similar = (item.similar * 100).toFixed(2)
568       }
569     }
570   }
571   return list
572 }
573 // 用于数据库管理,动态条件拼接,把阈值从【0-100】转为【0,1】
574 export function similarReduce100(list) {
575   for(let item of list) {
576     if(item.javaType == feature) {
577       if(item.similar) {
578         item.similar = (item.similar / 100).toFixed(4)
579       }
580     }
581   }
582   return list
583 }
584 // 用于数据库管理,清空动态的搜索条件的filedValue字段数据
585 export function clearActiveQry(obj) {
586   for(let item of obj) {
587     if(item.javaType == datetime) {
588       item.min = undefined
589       item.max = undefined
590       item.fieldValue = ""
591     } else {
592       item.fieldValue = ""
593     }
594   }
595 }
596 
597 // 用户数据库管理,默认选择左侧第一个数据数据库的菜单
598 export function getDBTreeItem(tree) {
599   let rspNode = []
600   const dataSor = tree
601   for (let i in dataSor) {
602     const item = dataSor[i]
603     if(item.dirType == 1) { // 表示数据库,并返回
604       if(item.children && item.children.length>0) { // 有children,则递归找children的第一个数据库
605         rspNode = [item.children[0],item.id]
606         break
607       } else {
608         continue// 既不是数据库,也没有子节点,则表示是一个目录.不需要
609       }
610     }
611   }
612   return rspNode
613 }

 

以上是关于vue+elementUI开发过程常用方法封装的主要内容,如果未能解决你的问题,请参考以下文章

vue+elementui 封装表单验证

vue+elementUi开发一个可拖拽的和拉伸编辑的画板

Vue+ElementUI表格封装 支持render

应用十一:Vue之基于ElementUI封装execl导入组件

vue 2.0 + ElementUI构建树形表格

Vue项目中使用elementUI之Pagination分页组件的二次封装复用