2020.10-2021.01前端开发部分总结

1.减少http请求(使用缓存优化性能)

storageData(){let arr = [{name:'黄',age:20},{name:'刘',age:30}]arr.push(Date.now());window.sessionStorage.setItem('str',JSON.stringify(arr))},
//请求接口的方法
getStorageData(){   //注意此处一定是获取时间,索引不固定let time = JSON.parse(window.sessionStorage.getItem('str'))[2];if((Date.now() - time) > 1000*20){alert('12')
//利用时间来判断是否每次调用返回相同固定资源的接口}}

2.element.ui中的el-upload传递索引

index是外部v-for循环时的索引;
:on-success的回调函数原本有三个形参数(response,file, fileList),使用箭头函数传递索引

<el-uploadv-show='!item.flag':action="action"accept="image/png,image/jpg,image/jpeg":on-success='(response,file, fileList) => {imgChange_post(response,file, fileList, index)}'><el-button type="primary">点击上传封面图</el-button>
</el-upload>

3.element.ui中的loading组件加载圈位置

//比如要始终将文字固定在屏幕正中间
//重新设置一个div即可 给个id方便获取下面的子类元素
<div id="createId" v-loading='loading_create' element-loading-text="创建中,请稍等"></div>```css
#createId .el-loading-mask{position: fixed;width: 100%;height: 100%;
}

4.根据给定的数组给另一个对象数组进行排序

根据arr的顺序来依次对应

const arr = [33,11,66,22,55];
let list = [{age: 55}, {age: 22}, {age: 11}, {age: 66}, {age: 33}];
list.sort((prev,next)=>{return arr.indexOf(prev.age) - arr.indexOf(next.age);
});
console.log(list); //[{age: 33}, {age: 11}, {age: 66}, {age: 22}, {age: 55}];

5.网页title中插入给定的图表等


比如改变前面的图标,使用比特虫见图片转字体图标;然后再title紧随其下加上即可

  <title>投资者关系</title><link rel="shortcut icon" href="./images_/header/logo.ico"  type="image/x-icon"/>

6.Object.assign()规范对象合并

/返回的是一个对象数组
const _list = res.list.map(item => {const str = item.name.replace(/(<\/?span.*?>)/gi, '|');return Object.assign({}, {time: item.time,content: str.split('|')})
})

7.小程序切换tab或者onshow时的回到顶部方法

场景1:在小程序onShow() 或者wx.switchTab()时调用returnTop方法,实现回到顶部;
场景2:在scroll-view滚动条组件中定义scroll-top,每次让scroll-top = 0 即可

  // 一键回到顶部returnTop: function (e) {if (wx.pageScrollTo) {//判断这个方法是否可用wx.pageScrollTo({scrollTop: 0})} else {wx.showModal({title: '提示',content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'})}},

8.分享一个连续解构赋值

对于对象连续调用属性,如ev.currentTarget.dataset.id等,使用解构赋值 可以参考下一个点

//情况1
const { user_info: { xcx_user_id } } = app.globalData
//解构出e中的自定义属性
//其中this.data.navigatorUr可以是properties中父组件传递过来的值
toDetail({ currentTarget: { dataset: { id } } }) {   //形参就是idwx.navigateTo({url: `${this.data.navigatorUrl}?id=${id}`})
}

9.小程序对比使用导航标签和点击事件跳转

<view class="content-item small" bindtap="toStreamerRank" data-tab="2"><image src='/images/yonghu/home_phb_zhangfen.png' class="content-bg right"></image><view class="content-lbl">涨粉榜</view>
</view><navigator class="content-item small" url="/pages/hotWords/hotWords" hover-class="navigator-hover"><image src='/images/zhubo/home_phb_yinlang.png'class="content-bg right"></image><view class="content-lbl">抖音热词</view>
</navigator>
toStreamerRank({ currentTarget: { dataset: { tab } } }) {app.globalData.currentTabForStreamer = tab;//导航不能跳转到tabbar,switchTab可以wx.switchTab({    url: `/pages/streamerRank/streamerRank`})},
}

10.获取输入框焦点索引,方便插入内容

ele 输入框节点;
this.ruleForm.input 输入框的值

let ele = document.querySelector('#groupNameRef');
let i =- 1;
if(ele.selectionStart){ //非IE浏览器i = ele.selectionStart;
}
let target = ev.target.nodeName==='A'?ev.target:ev.target.parentNode;
let index = target.dataset.index;
if(this.ruleForm.input.indexOf(index) === -1){  //输入框只能出现一次if(i === -1){   //从头部插入this.ruleForm.input = `<${index}>` + this.ruleForm.input;}else{this.ruleForm.input = this.ruleForm.input.slice(0,i) + `<${index}>` + this.ruleForm.input.slice(i);}
}

11.验证输入框字符(含中文处理)中文算2个字符

subTitle:[{ required: true, message: '请输入副标题', trigger: 'change' },{validator: (rule, value, callback) => {let nameLength = 0;for(let i = 0;i<value.length;i++){if(escape(value[i]).indexOf("%u")<0){//不是中文nameLength += 1;}else{  //中文nameLength += 2;}}if (nameLength < 4) {callback(new Error('请至少输入4个字符'))} else if (nameLength > 20){callback(new Error('请最多输入20个字符'))}},trigger: 'change'
}],

12.看一段获取手机验证码

bind(this):定时器中的this不是小程序对象,所以要改变this指向,原理很简单

// 获取验证码  也是调用了接口 参数:手机号和标记号
//https://xcx.duolalive.com/apixcx/wx_login.php
//phone:177****6332;send_code: 1sendCode: function () {// 60秒后重新获取验证码this.login(true);inter = setInterval(function () {this.setData({smsFlag: true,sendColor: '#cccccc',sendTime: this.data.snsMsgWait + 's后重发',snsMsgWait: this.data.snsMsgWait - 1});if (this.data.snsMsgWait < 0) {if(inter){clearInterval(inter)  //每次清理一下}this.setData({sendTime: '获取验证码',snsMsgWait: 60,smsFlag: false});}}.bind(this), 1000);     //注意定时器中的this},

13.element.ui上传图片视频大小尺寸校验

图片尺寸
beforeUpload:返回false则终止上传

beforeUpload(file) {const isJpg = /image\/(png|jpe?g|gif)$/.test(file.type);const isLt1M = file.size / 1024 / 1024 < 1;if (!isJpg) {this.$message.error('上传图片只能是 JPG/PNG 格式!');}if (!isLt1M) {this.$message.error('上传图片大小不能超过 1MB!');}const isSize = new Promise(function(resolve, reject){let width = 108;let height = 108;let _URL = window.URL || window.webkitURL;let img = new Image();img.onload = function(){let valid = img.width == width && img.height == height;valid ? resolve() : reject();}img.src = _URL.createObjectURL(file);}).then(()=>{return file;}, ()=>{this.$message.error('上传图片的尺寸建议为108*108!');return Promise.reject()});return isJpg && isLt1M && isSize;
},

视频尺寸

const self = this
const isLt100MB  = file.size / 1024 / 1024 < 100;
const isSize = new Promise(function(resolve, reject) {let _URL = window.URL || window.webkitURL;let videoElement = document.createElement('video')videoElement.addEventListener("loadedmetadata", function (_event) {let width = videoElement.videoWidth;let height = videoElement.videoHeight;let duration = videoElement.duration; // 视频时长if(!isLt100MB) self.$message.error('上传视频大小不能超过100MB!');if(Math.ceil(duration) <= 4) self.$message.error('上传视频时长不能少于4S!');let valid = width/height === 9/16 && width >= 720 && height >= 1280;valid ? resolve() : reject();});videoElement.src = _URL.createObjectURL(file)
}).then(() => {return file;
},() => {self.$message.error('上传视频尺寸宽高比为9:16,分辨率大于720*1280');return Promise.reject()
});
return isSize;

14.async/await结合数组循环

async getPostImageId(arr){await arr.forEach(async item=>{let params = {backAcctId:this.backAcctId,videoId:item.id,source:this.source || ''};const {data:res} = await axios.post(//接口名'/adminjson/ERP_GetSuggestVideo',//参数params);if(res.body.status === 'SUCCESS'){//处理成功的方法}})
},

15.Object.defineProperty()用法(vue框架双向数据绑定核心之一)

Object.defineProperty(Object1,property,Object2):
Object1:要操作的对象
property:要新增的属性
Object2:配置项包含value,writable(默认false),configurable(默认false),enumerable(默认false),get/set等

let user = {name:'张三'
}
Object.defineProperty(user,'age',{value:20,writable:true,  //可修改enumerable:true,  //可枚举configurable:true  //可重新定义特性,包括value,writable,enumerable,configurable等
})
Object.defineProperty(user,'age',{value:20,writable:true,  //可修改configurable:false
})
user.age = 30
console.log(Object.keys(user));
console.log(user);let height = 170;
//get和set方法不可与value同时使用,get和set方法即是vue框架的数据绑定的核心
Object.defineProperty(user,'height',{// value:190,    报错get:function(){console.log('get方法被调用');return height;},set:function(newVal){console.log('set方法被调用');height = newVal;}
})
console.log(user.height);  //调用了get方法
user.height = 180;  //调用了set方法
console.log(user.height);

16.el-table列表循环

 <el-table :data="tableData"@sort-change='sortChange'height="100%"border><el-table-column v-for="col in cols":sortable='col.isSortable':label="col.label" :fixed='col.isFixed' :width='col.width'><template slot-scope="scope"><span>{{ scope.row[col.prop] | fileterEmpty}}</span></template></el-table-column>
</el-table>
cols:[{prop: 'createTime', label: '日期',width:100,isFixed:true}
]

17.el-date-picker时间选择器

设置某个日期后面的时间不给选

 <el-date-pickerstyle="width:240px;margin-right: 20px;"v-model="dayVal"type="daterange"range-separator="-"        start-placeholder="开始日期"end-placeholder="结束日期"format="yyyy-MM-dd" value-format="yyyy-MM-dd":picker-options='pickerOptions'>
</el-date-picker>
//定义在data中
pickerOptions: {disabledDate:function(time){// 选当前时间之前的时间return time.getTime() > (Date.now()-24*60*60*1000) }
},

18.中文按拼音首字母排序

const pySegSort=(arr) =>{if (!String.prototype.localeCompare) return nulllet letters = 'abcdefghjklmnopqrstwxyz'.split('')let zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')let segs = []letters.map((item, i) => {let cur = { letter: item, data: [] }arr.map((item) => {if(item.localeCompare(zh[i])>=0&&item.localeCompare(zh[i+1])<0){cur.data.push(item)}         })if (cur.data.length) {   cur.data.sort(function(a, b) {return a.localeCompare(b, 'zh')})segs.push(cur)}})return segs
}
let newArr = pySegSort(['黄杰',"皇家",'黄凯乐','小莫','小新','小幸福','善林','嘉诚']).map(item=>{return item.data;
});
console.log(newArr);

2020.10-2021.01前端开发部分总结相关推荐

  1. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第一套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

  2. 2020.10拼多多前端秋招面经

    2020.10拼多多前端秋招面经 一面 事件循环机制.宏任务.微任务 事件循环机制 Promise有几种状态,状态之间怎么转换的 Promise node有没有了解 文件上传怎么做 Webpack 跨 ...

  3. 2020年武汉Web前端开发前景怎么样?就业薪资如何?

    在过去的2019年,Web前端行业发展势头火热,无论是市场需求还是从业人员薪资,都在不断的增加.那么,2020年武汉Web前端开发前景怎么样?就业薪资如何?下面,我就给大家预测一下. 1.Web前端人 ...

  4. 2021学习前端开发有前途吗?(建议收藏)

    导语: 同学A:他现在是一名大学生,学了学校的编程课程,什么语言都学了一点,但是现在感觉自己什么都不会,他同学自学了一些,做了一两个小项目,他很羡慕,而且他个人对前端有点兴趣,不知道现在开始学前端怎么 ...

  5. 2017年10月WEB前端开发实习生面试题总结

    从大一开始学习前端,今年大三,10月份开始投简历,陆续收到很多家公司的面试,目前为止的面试通过率是百分之百,总结下面试题. 不定期更新中... 百度第一次 一面 1.AJAX流程 2.promise简 ...

  6. 程序猿必备的10款web前端开发插件一

    1.CSS3实现的火柴燃烧Loading加载动画 这次我们要给大家分享一款非常特别的CSS3 Loading加载动画,整个Loading加载动画就好像是火柴在燃烧一样,不足的是火苗并没有那么真实,比较 ...

  7. 1+X Web前端等级考证 | 2020 12月Web前端开发中级理论 (模拟试题第三套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

  8. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第三套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

  9. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第四套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

  10. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第二套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

最新文章

  1. access open 知乎_NX使用——远程IDE利器
  2. HDU 1513 Palindrome(最长公共子序列)
  3. Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TAB
  4. android的窗口机制分析------UI管理系统
  5. java jdk工具
  6. 【转】Android 4.4前后版本读取图库图片和拍照完美解决方案
  7. mongodb同时更新一条记录_MongoDB 存储和优化系列一
  8. 地图投影系列介绍(四)----投影坐标系
  9. 【javascript动画系列之网页白板】javascript实现的白板(兼容ff,ie,chrome,……)
  10. JAVA 搭建基于SPRINGBOOT的SSM(SPRING + SPRINGMVC + MYBATIS)的MAVEN项目
  11. 索尼申请“Pregius S”商标 或用于CMOS图像传感器
  12. wxhtmltopdf 图片路径问题_图片引入路径问题
  13. Linux内核分析课程期中总结
  14. SQL中FOR XML子句的各种用法,包括FOR XML字句的四种基本模式:AUTO模式、RAW模式、PATH模式和EXPLICIT模式...
  15. 使用Emit创建DBContext对象
  16. Vs2010 上的配置Opencv2.2
  17. Wireless Network(并查集)
  18. 算法竞赛进阶指南 激光炸弹
  19. STM32F411 Discovery学习笔记(四)串口
  20. Vue element 自定义表单验证(验证联系方式、邮箱、邮政编码)

热门文章

  1. three.js示例之旋转立方体
  2. c语言为什么不能自动free,求大神帮忙看看 为什么cfree没有报错但是就是运行不了...
  3. 夏普linux电视安装apk,智能电视不能安装APK文件?看完就知道怎么做了!
  4. 云队友丨盘点,到底盘什么?
  5. webflux+r2dbc 实现响应式导出csv格式文件
  6. GSM模块通过服务器或GSM内部获取网络时间 网络授时
  7. 计算机网络-应用层笔记
  8. Android能装到电脑上吗,怎么在电脑上装安卓系统
  9. 人工神经网络(六)线性回归与分类, 解决与区别
  10. 关于电脑端微信小程序不能启动解决