开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
超高效的10个库
Ant Design
--- react,企业级中后台系统
Ant Design of vue
--- 针对vue的ant ui库
uni-app
--- 跨端框架;只写一套代码能代用到所有框架里,很强大
imgcook
--- 由设计稿智能生成代码
animate.css
--- css动画库
vue.draggable
--- vue拖拽(可以看官网也可以参考别人的学习文章)
lodash
--- js 关于数据类型处理的封装函数 英文文档
swiper
--- 移动端的触摸滑动插件
day.js
--- 关于时间操作的js库
axios
--- 网络请求库
常用的js工具函数
防抖
防抖,简而言之,防止用户手‘帕金逊’,例如用户一直点击登录/搜索,一直发送请求,那么就会造成性能大打折扣,防抖作用就是在一定时间内只会执行一次请求。本质就是优化用户高频率事件。
<body>
<!-- 防抖:在规定时间内每次触发都删除之前的定时器,建立新的定时器,只承认最后的一次触发 -->
<input type="text">
<button>搜索</button>
</body>
<script>
const ipt = document.querySelector('input')
const btn = document.querySelector('button')
// 定义防抖函数
let debounce = (() => {
let timer = null;
return (callback, time = 3000) => {
// &&语法:第一个真才执行第二个
timer && clearTimeout(timer) // 在规定时间内重新触发事件:清除旧计时器建立新计时器
timer = setTimeout(callback, time);
}
}
)() // debounce自执行,返回一个函数
// 点击按钮触发事件
btn.addEventListener('click', () => {
// 用户点击搜索发送请求
debounce(()=>{
console.log(ipt.value)
},2000)
})
</script>
使用场景:
- 登录,搜索等用户可能着急一直点击或点击过快,发送多次请求
- 调整浏览器窗口,resize频繁,计算过多,则可以使用防抖
- 搜索时候不用每输入一个字都发送请求,等最后输入完成再发送请求
节流
跟防抖不同就是:在规定时间内无论你发送多少次请求,我就是不理你,到点我就执行你最后一次的请求(像公交车到点才发车,不管你中间有多少人上车)
<body>
<!-- 节流 -->
<input type="text">
</body>
<script>
const ipt = document.querySelector('input')
// 定义节流方法
const thorttle = (() => {
let last = 0; // 上次触发时间
return (callback, time = 2000) => {
let now = new Date() // 现在时间
if (now - last > time) {
// 如果间隔时间 > 规定时间,触发callback,并设置last = now
callback()
last = now
}
}
})()
// 输入框事件:不会实时输入发送请求(等输入完或一定间隔后才发送请求
ipt.addEventListener('input', () => {
thorttle(()=>{
if(ipt.value == '') return
console.log(ipt.value)
},3000)
})
</script>
使用场景:
- scroll事件,如果一直滚动滚动条,利用节流,间隔一定时间才计算位置信息
- input实时搜索发送请求显示下拉下单
大小写转换
<body>
<h2></h2>
<button>大写</button>
<button>小写</button>
<button>首字母大写</button>
</body>
<script>
let str = 'Come on! You need to study!'
document.querySelector('h2').innerHTML = str;
const btns = document.querySelectorAll('button')
// 定义大小写方法
const toggleCase = (str, type) => {
switch (type) {
case 0:
return str.toUpperCase()
case 1:
return str.toLowerCase()
case 2:
// substr(a,b)函数--a:start,b:end substr(1)-从下标1往后截取
return str[0].toUpperCase() + str.substr(1).toLowerCase()
default:
return str
}
}
btns.forEach((item, index) => {
item.addEventListener('click', () => {
str = toggleCase(str, index)
document.querySelector('h2').innerHTML = str;
})
});
</script>
数组对象根据字段去重
主要针对对象数组的去重,根据唯一字段判断去重
<script>
// 利用唯一值key来判断
let uniqueArr = function (arr = [], key = 'id') {
if (arr.length === 0) return;
let result = []
let map = {} // 利用唯一值作为对象的属性存储,来判断是否重复
arr.forEach(item => {
// 如果当前 item 的 key 没有存在于map对象里的话就作为属性值加入进去
// map = {1:{xxx},2:{xxx},3:{xxx}....}
if (!map[item[key]]) {
map[item[key]] = item
}
});
// 把map对象转化为数组并返回
result = Object.values(map)
return result
}
let list = [
{ id: 1, name: '张三' },
{ id: 2, name: '李四', sex: '男' },
{ id: 3, name: '王六', age: 26 },
{ id: 1, name: '张三' },
{ id: 4, name: '李四', sex: '女' },
{ id: 2, name: '李四', sex: '男' },
{ id: 5, name: '赵三' },
{ id: 5, name: '赵三' }
]
console.log(uniqueArr(list,'id'))
</script>
检验数据类型
主要针对object 具体类型检验
<script>
const checkType = function (obj) {
let result = typeof (obj) // 检验不了引用数据类型,Null
if (result !== 'object') return result
// 如果是object,利用tostring方法,截取后面具体类型并返回
return Object.prototype.toString.call(obj).slice(8, -1)
}
console.log(checkType([]))
console.log(checkType({}))
console.log(checkType(123))
console.log(checkType('123'))
console.log(checkType(null))
console.log(checkType(undefined))
console.log(checkType(checkType))
console.log(checkType(false))
console.log(typeof(null)) // object
</script>
回到顶部
<body>
<div class="box">
我是内容
</div>
<button>回到顶部吧</button>
</body>
<script>
// 获取按钮
let btn = document.querySelector('button')
// 定义方法
const rollToTop = () => {
// 获取滚动条高度
let h = document.documentElement.scrollTop || document.boby.scrollTop
if (h >= 30) {
// 每次页面重绘重新触发rollToTop方法
window.requestAnimationFrame(rollToTop)
// 滚动到对应坐标
// window.scrollTop(0,0) // 回到顶部
window.scrollTo(0, h - h / 2) // 一点点往上滚动回到顶部,使过渡有动画效果
}
}
// 添加事件
btn.addEventListener('click',rollToTop)
滚动到对应位置
<body>
<div class="box">内容1</div>
<h2>TITLE</h2>
<div class="box">内容2</div>
<button>回到标题</button>
</body>
<script>
const scrollEle = (ele) => {
/*获取对应元素,调用scrollIntoView
scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域;behavior:过渡动画平滑
*/
document.querySelector(ele).scrollIntoView({ behavior: 'smooth' })
}
document.querySelector('button').addEventListener('click', () => {
// 按钮点击事件:回到对应位置
scrollEle('h2')
})
</script>
获取当前时间
<script>
function getDate(date = new Date()) {
// 获取年\月\日
let y = date.getFullYear()
let m = date.getMonth() + 1
// 如果月份是1-9,前面加'0'
m = m < 10 ? '0' + m : m
let d = date.getDate()
// 如果日期是1-9,前面加'0'
d = d < 10 ? '0' + d : d
let h = date.getHours()
let min = date.getMinutes()
let s = date.getSeconds()
let week = ['日', '一', '二', '三', '四', '五', '六']; // gatday() --- 0 代表周日
let mm = date.getMonth()
// 获取第一天,最后一天详细信息
let firstDay = new Date(y, mm, 1)
// 反推法 mm + 1 = 下个月,0 代表往前走一天,例如:当月是11月,那么12\1往前一天就是11月最后一天了
let lastDay = new Date(y, mm + 1, 0)
console.log(firstDay, lastDay) // Thu Dec 01 2022 00:00:00 GMT+0800 (中国标准时间) Sat Dec 31 2022 00:00:00 GMT+0800 (中国标准时间)
return `现在时间是${y}\\${m}\\${d} ${h}:${min}:${s},本月有${lastDay.getDate()}天,第一天是星期${week[firstDay.getDay()]},最后一天是星期${week[lastDay.getDay()]}`
}
console.log(getDate())
// 现在时间是2022\12\08 15:13:20,本月有31天,第一天是星期四,最后一天是星期六
</script>
模糊查询
<body>
<input type="text">
<button>search</button>
</body>
<script>
const list = [
{ id: 1, name: '张三' },
{ id: 1, name: '李四' },
{ id: 1, name: '王六', age: 26 },
{ id: 1, name: '张三封' },
{ id: 1, name: '张三五' },
{ id: 1, name: '赵三' },
{ id: 1, name: '李白', sex: '男' },
]
const txt = document.querySelector('input')
const btn = document.querySelector('button')
// 模糊搜索
const fuzzySearch = (list, keyword, attr = "name") => {
// 定义正则匹配
const reg = new RegExp(keyword)
// 定义空数组放结果
let resultArr = []
// 列表循环查找
list.forEach(item => {
if (reg.test(item[attr])) {
// 列表指定字段里有关键词则添加到结果数组里
resultArr.push(item)
}
});
return resultArr ? resultArr : '没有搜索内容喔!'
}
// 点击搜索
btn.addEventListener('click', () => {
console.log(fuzzySearch(list, txt.value, 'name'))
})
</script>