节流工具函数

  1. // 节流延时函数 如果一个函数被反复调用的话会截流,最终只会调用一次
  2. export function debounce(func, delay = 500) {
  3. let timer
  4. return function (...args) {
  5. if (timer) {
  6. clearTimeout(timer)
  7. }
  8. timer = setTimeout(() => {
  9. func.apply(this, args)
  10. }, delay)
  11. }
  12. }

深拷贝一

  1. function _deepClone(source) {
  2. let target
  3. if (typeof source === 'object') {
  4. target = Array.isArray(source) ? [] : {}
  5. for (let key in source) {
  6. if (source.hasOwnProperty(key)) {
  7. if (typeof source[key] !== 'object') {
  8. target[key] = source[key]
  9. } else {
  10. target[key] = _deepClone(source[key])
  11. }
  12. }
  13. }
  14. } else {
  15. target = source
  16. }
  17. return target
  18. }
  19. // lodash.cloneDeep()实现深拷贝
  20. // JSON.stringify 和 JSON.parse (对象中包含 function 或 RegExp 这些就不能用这种方法了)
  21. // Object.assign()拷贝
  22. // 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,
  23. // 但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

深拷贝二

  1. // 检查类型
  2. let checkType = data => {
  3. return Object.prototype.toString.call(data).slice(8, -1)
  4. }
  5. let deepClone = target => {
  6. let targetType = checkType(target)
  7. let result
  8. if (targetType === 'Object') {
  9. result = {}
  10. } else if (targetType === 'Array') {
  11. result = []
  12. } else {
  13. return target
  14. }
  15. for (let i in target) {
  16. let value = target[i]
  17. let valueType = checkType(value)
  18. if (valueType === 'Object' || valueType === 'Array') {
  19. result[i] = deepClone(value) // 递归
  20. } else {
  21. result[i] = value
  22. }
  23. }
  24. return result
  25. }

Vue 中监听数据新方法

  1. // 监听 keyword 的改变
  2. created () { // 效果同watch(会有特殊用途) 节流函数
  3. this.$watch('keyword', debounce((newQuery) => {
  4. console.log(newQuery)
  5. }, 1500))
  6. },

生成随机数

  1. // 生成随机数
  2. export const getUUID = (len) => {
  3. len = len || 6
  4. len = parseInt(len, 10)
  5. len = isNaN(len) ? 6 : len
  6. const seed = '0123456789abcdefghijklmnopqrstubwxyzABCEDFGHIJKLMNOPQRSTUVWXYZ'
  7. const seedLen = seed.length - 1
  8. let uuid = ''
  9. while (len--) {
  10. uuid += seed[Math.round(Math.random() * seedLen)]
  11. }
  12. return uuid
  13. }

生成唯一ID

项目: cloud-doc-client

  1. // 先下载依赖
  2. // npm install uuid --save-dev
  3. import uuidv4 from 'uuid/v4'
  4. const newID = uuidv4()

文件流File操作

项目: cloud-doc-client

  1. const fs = window.require('fs').promises
  2. const fileHelper = {
  3. readFile: (path) => {
  4. return fs.readFile(path, { encoding: 'utf8' })
  5. },
  6. writeFile: (path, content) => {
  7. return fs.writeFile(path, content, { encoding: 'utf8' })
  8. },
  9. renameFile: (path, newPath) => {
  10. return fs.rename(path, newPath)
  11. },
  12. deleteFile: (path) => {
  13. return fs.unlink(path)
  14. }
  15. }
  16. export default fileHelper

获取当前dom对象的父节点

项目: cloud-doc-client

  1. // node -- 点击的节点 parentClassName -- 要向上冒泡得到的父节点的类名
  2. export const getParentNode = (node, parentClassName) => {
  3. let current = node
  4. while (current !== null) {
  5. if (current.classList.contains(parentClassName)) {
  6. return current
  7. }
  8. current = current.parentNode
  9. }
  10. return false
  11. }

时间戳转为本地时间

项目: cloud-doc-client

  1. // 接受一个时间戳 返回格式: 2019/12/3 上午10:35:33
  2. export const timestampToString = (timestamp) => {
  3. const date = new Date(timestamp)
  4. return date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
  5. }

数组结构转为Flatten 结构 和还原

项目: cloud-doc-client 参考阅读: Normalizing State Shape

  1. // 数组列表 按照 id 转为对象结构
  2. export const flattenArr = (arr) => {
  3. return arr.reduce((map, item) => {
  4. map[item.id] = item
  5. return map
  6. }, {})
  7. }
  8. // 将上述结构的数据还原
  9. export const objToArr = (obj) => {
  10. return Object.keys(obj).map(key => obj[key])
  11. }

操作浏览器的 localStorage 和 sessionStorage

GitHub 仓库

  1. // 下载依赖
  2. // npm install good-storage --save
  3. import storage from 'good-storage'
  4. // storage 本地数据
  5. export const localStore = {
  6. set: (key, value) => {
  7. return storage.set(key, value)
  8. },
  9. get: (key) => {
  10. return storage.get(key, {})
  11. },
  12. remove: (key) => {
  13. return storage.remove(key)
  14. },
  15. has: (key) => {
  16. return storage.has(key) // true or false
  17. },
  18. getAll: () => {
  19. return storage.getAll()
  20. },
  21. forEach: (callback) => {
  22. return storage.forEach(callback)
  23. }
  24. }

深拷贝三

ts-axios-refactoring

  1. // 深拷贝
  2. export function deepMerge(...objs: any[]): any {
  3. const result = Object.create(null)
  4. objs.forEach(obj => {
  5. if (obj) {
  6. Object.keys(obj).forEach(key => {
  7. const val = obj[key]
  8. if (isPlainObject(val)) {
  9. if (isPlainObject(result[key])) {
  10. result[key] = deepMerge(result[key], val)
  11. } else {
  12. result[key] = deepMerge({}, val)
  13. }
  14. } else {
  15. result[key] = val
  16. }
  17. })
  18. }
  19. })
  20. return result
  21. }

判断是否是绝对路径

  1. // 判断是否是绝对路径
  2. export function isAbsoluteURL(url: string): boolean {
  3. return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url)
  4. }

判断两个地址是不是同源

本地路径和要访问的路径url

  1. // 同域名的判断主要利用了一个技巧,
  2. // 创建一个 a 标签的 DOM,然后设置 href 属性为我们传入的 url,然后可以获取该 DOM 的 protocol、host。
  3. // 当前页面的 url 和请求的 url 都通过这种方式获取,然后对比它们的 protocol 和 host 是否相同即可
  4. export function isURLSameOrigin(requestURL: string): boolean {
  5. const parsedOrigin = resolveURL(requestURL)
  6. return (
  7. parsedOrigin.protocol === currentOrigin.protocol && parsedOrigin.host === currentOrigin.host
  8. )
  9. }
  10. const urlParsingNode = document.createElement('a')
  11. const currentOrigin = resolveURL(window.location.href)
  12. function resolveURL(url: string): URLOrigin {
  13. urlParsingNode.setAttribute('href', url)
  14. const { protocol, host } = urlParsingNode
  15. return {
  16. protocol,
  17. host
  18. }
  19. }