数值快速取整
var num = '01';
alert(~~num);
只支持32位以内的数据,超过范围就会得出错误的结果 遇到非数值会返回0 小数点会被直接删掉直接返回整数
另外可以也实用 |0 来实现
23.4|0 // 23
-19.6|0 // 19
只保留两位小数
const NumericalProcessing = (val) => {
let num = +val;
if (isNaN(num)) num = 0;
num = (Math.round(num * 10000) / 10000.0).toFixed(2);
return num;
};
const num = NumericalProcessing(100)
console.log(num)
转化为百分比
const NumericalProcessing = (val) => {
let num = +val;
if (isNaN(num)) num = 0;
num = `${(Math.round(num * 10000) / 100.0).toFixed(2)}%`;
return num;
};
快速生产长字符串
let res = '超长'.repeat(150) ;
去除字符串中的HTML标签
const content = _.trim(txt.replace(/<[^>]+>/gim, ''));
const stripHtml = html => (new DOMParser().parseFromString(html, 'text/html')).body.textContent || '';
金额格式化
(999999999).toLocaleString(); // 999,999,999
// 还可以加参数,进行更优雅的做法
const options = {
style: 'currency',// style: 'currency'注释掉就没有 ¥ 符号
currency: 'CNY',
};
(999999).toLocaleString('zh-CN', options); // ¥999,999.00
数组 — 过滤空值
注意:0也会过滤
const groceries = ['apple', null, 'milk', undefined, 'bread', '',0];
const cleanList = groceries.filter(Boolean);
console.log(cleanList);
// 'apple', 'milk', 'bread';
数组 — 交集、差集、并集、补集
var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("数组a:", a);
console.log("数组b:", b);
var sa = new Set(a);
var sb = new Set(b);
// 交集
let intersect = a.filter(x => sb.has(x));
// 差集
let minus = a.filter(x => !sb.has(x));
// 补集
let complement = [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))];
// 并集
let unionSet = Array.from(new Set([...a, ...b]));
console.log("a与b的交集:", intersect);
console.log("a与b的差集:", minus);
console.log("a与b的补集:", complement);
console.log("a与b的并集:", unionSet);
下载二进制文件
// blobData 后台返回的文件流二进制数据
// fileName 自定义文件名称
// suffixName 文件后缀名
// fileType 文件后缀名对应的type值
function exportFile(blobData, fileName, suffixName, fileType) {
let blob = new Blob([blobData], { type: fileType })
let downloadElement = document.createElement('a')
let href = window.URL.createObjectURL(blob) // 创建下载的链接
downloadElement.href = href
downloadElement.download = fileName+ suffixName // 下载后文件名
document.body.appendChild(downloadElement)
downloadElement.click() // 点击下载
document.body.removeChild(downloadElement) // 下载完成移除元素
}
//示例:
exportFile(blobData, '订单明细', '.xls', 'application/vnd.ms-excel');
下载base64格式的图片
//下载图片
download() {
let imgData = 'data:image/png;base64,iVBORw0KGgoAAAANSUh........';
this.downloadFile('测试.png', imgData);
},
//下载
downloadFile(fileName, content) {
let aLink = document.createElement('a');
let blob = this.base64ToBlob(content); //new Blob([content]);
let evt = document.createEvent("HTMLEvents");
evt.initEvent("click", true, true);//initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为
aLink.download = fileName;
aLink.href = URL.createObjectURL(blob);
// aLink.dispatchEvent(evt);
//aLink.click()
aLink.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));//兼容火狐
},
//base64转blob
base64ToBlob(code) {
let parts = code.split(';base64,');
let contentType = parts[0].split(':')[1];
let raw = window.atob(parts[1]);
let rawLength = raw.length;
let uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], {type: contentType});
},
下载重命名
/**
* 下载
* @param {String} url 目标文件地址
* @param {String} filename 想要保存的文件名称
*/
function courseDownload(url, filename) {
getBlob(url, function(blob) {
saveAs(blob, filename);
})
}
function getBlob(url,cb) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function() {
if (xhr.status === 200) {
cb(xhr.response);
}
};
xhr.send();
}
/**
* 保存
* @param {Blob} blob
* @param {String} filename 想要保存的文件名称
*/
function saveAs(blob, filename) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
var link = document.createElement('a');
var body = document.querySelector('body');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
// fix Firefox
link.style.display = 'none';
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
}
useImperativeHandle
useImperativeHandle是react官方为了简便我们的ref操作,同时还可以让子组件返回给父组件自身的状态和方法去调用
useRef将ref绑定到某个子组件标签上,用以获取整个子组件的方法和参数
useImperativeHandle: 可以自定义暴露给父组件的方法或者变量
父组件
import React, { useState, useRef } from 'react'
import ChildList from './ChildList'
export default () => {
let parentRef = useRef(null)
const [name, setName] = useState('li')
return <div>
<ChildList parentRef={parentRef} name={name}></ChildList>
<button onClick={() => {
console.log("parentRef", parentRef)
}}>获取子组件</button>
</div>
}
子组件
import React, { useImperativeHandle, forwardRef } from 'react'
export default forwardRef((props, ref) => {
console.log("ref", ref)
useImperativeHandle(ref, () => {
return {
childFn
}
})
console.log(ref)
const childFn = () => {
console.log('子组件方法')
}
return <div>
<div ref={ref} />
</div>
})
useUpdateEffect
useUpdateEffect 用法等同于 useEffect,但是会忽略首次执行,只在依赖更新时执行。
function useUpdateEffect(fn, inputs) {
const didMountRef = useRef(false);
useEffect(() => {
// 测试
console.log(11)
if (didMountRef.current) fn();
else didMountRef.current = true;
}, inputs);
}
useUpdateEffect(() => {
// 测试
console.log(22)
}, [user]);
moment常用方法
moment常用方法:
moment().endOf('day') // 今天的23:59:59.999
moment().endOf('year') // 今年的 12 月 31 日 23:59:59.999,还可以填month,week,hour等
moment().add(1, 'months') // 当前月份加一月,如今天2021-05-25,得到就是2021-06-25
moment().add(1, 'year') // 当前年加一年,如今天2021-05-25,得到就是2022-05-25
moment().subtract(1, 'months') // 当前月份减一月,如今天2021-05-25,得到就是2021-04-25
moment().subtract(1, 'year') // 当前年减一年,如今天2021-05-25,得到就是2020-05-25
var a = moment('2021-05-18');
var b = moment('2020-04-16');
a.diff(b, 'years') // 1,b-a的年份
a.diff(b, 'days') // 2,b-a的日期
moment().date() // 25今天的日期
moment().day() // 2 今天是星期几
moment().year() // 2021 今年的年份
moment().year(2022) // 2022-05-25 设置年份为2022
模拟接口
const waitTime = (time = 2000) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, time);
});
};
cosnt search =async () => {
await waitTime()
}
模拟鼠标点击
const a = document.querySelector('a[href="#1"]');
if (a) a.dispatchEvent(new MouseEvent('click', {bubbles: true}));
获取字符串字节数/字符数
//返回字符串的总字节数
let byteleng = strval.replace(/[^\x00-\xff]/g,'**').length;
复制内容到剪切板
import "./App.css";
import {useRef} from 'react';
function App() {
const myInput=useRef(null);
function handleClickCopy() {
const copyText=myInput.current.value;
if(copyText){
const copyInput=document.createElement('input');
copyInput.setAttribute('value', copyText);
document.body.appendChild(copyInput);
copyInput.select();
try{
document.execCommand('copy');
document.body.removeChild(copyInput);
console.log('复制成功');
}catch(err){
console.log(err, '浏览器不兼容');
document.body.removeChild(copyInput);
}
}else{
console.log('请输入内容');
}
}
return (
<div className="App">
<header className="App-header">
<input type="text" ref={node=>{myInput.current=node;}}/>
<button onClick={handleClickCopy}>点击复制</button>
</header>
</div>
);
}
export default App;
函数组合通用函数
//通用函数
function compose() {
var args = arguments;
var start = args.length - 1;
return function () {
var i = start - 1;
var result = args[start].apply(this, arguments);
while (i >= 0){
result = args[i].call(this, result);
i--;
}
return result;
};
}
function addHello(str){
return 'hello '+str;
}
function toUpperCase(str) {
return str.toUpperCase();
}
function reverse(str){
return str.split('').reverse().join('');
}
var composeFn=compose(reverse,toUpperCase,addHello);
console.log(composeFn('ttsy')); // YSTT OLLEH
//上述过程有三个动作,「hello」、「转换大写」、「反转」,可以看到通过 compose 将上述三个动作代表的函数合并成了一个,最终输出了正确的结果。
对象解构重命名
: 是重命名
= 是默认值
通过上面对 obj 对象的结构,会得到 a1、b2、c3 和 d4 这 4 个变量,同时由于 obj 里面没有 d 属性,所以 d4 会被赋予默认值 default。
const obj = {
a: 1,
b: 2,
c: 3
}
const { a: a1, b: b2, c: c3, d: d4 = "default" } = obj
console.log(a1,b2,c3,d4)
获取URL中的查询参数
const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');
生成随机字符串
const randomString = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
将数组中的元素随机排序
const shuffleArray = (array) => array.sort(() => Math.random() - 0.5);
将对象转换为查询字符串
const objectToQueryString = (obj) => Object.keys(obj).map(key => key + '=' + obj[key]).join('&');