文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

七个项目中必备的JavaScript代码片段

2024-12-14 00:50

关注

1. 下载一个excel文档

同时适用于word,ppt等浏览器不会默认执行预览的文档,也可以用于下载后端接口返回的流数据,见 3

  1. //下载一个链接  
  2. function download(link, name) { 
  3.     if(!name){ 
  4.             name=link.slice(link.lastIndexOf('/') + 1
  5.     } 
  6.     let eleLink = document.createElement('a'
  7.     eleLink.download = name 
  8.     eleLink.style.display = 'none' 
  9.     eleLink.href = link 
  10.     document.body.appendChild(eleLink) 
  11.     eleLink.click() 
  12.     document.body.removeChild(eleLink) 
  13. //下载excel 
  14. download('http://111.229.14.189/file/1.xlsx'
  15. 复制代码 

2. 在浏览器中自定义下载一些内容

场景:我想下载一些DOM内容,我想下载一个JSON文件

  1.  
  2. function downloadFile(name, content) { 
  3.     if (typeof name == 'undefined') { 
  4.         throw new Error('The first parameter name is a must'
  5.     } 
  6.     if (typeof content == 'undefined') { 
  7.         throw new Error('The second parameter content is a must'
  8.     } 
  9.     if (!(content instanceof Blob)) { 
  10.         content = new Blob([content]) 
  11.     } 
  12.     const link = URL.createObjectURL(content) 
  13.     download(link, name) 
  14. //下载一个链接 
  15. function download(link, name) { 
  16.     if (!name) {//如果没有提供名字,从给的Link中截取最后一坨 
  17.         name =  link.slice(link.lastIndexOf('/') + 1
  18.     } 
  19.     let eleLink = document.createElement('a'
  20.     eleLink.download = name 
  21.     eleLink.style.display = 'none' 
  22.     eleLink.href = link 
  23.     document.body.appendChild(eleLink) 
  24.     eleLink.click() 
  25.     document.body.removeChild(eleLink) 
  26. 复制代码 

使用方式:

  1. downloadFile('1.txt','lalalallalalla'
  2. downloadFile('1.json',JSON.stringify({name:'hahahha'})) 
  3. 复制代码 

3. 下载后端返回的流

数据是后端以接口的形式返回的,调用 1 中的download方法进行下载

  1.  download('http://111.229.14.189/gk-api/util/download?file=1.jpg'
  2.  download('http://111.229.14.189/gk-api/util/download?file=1.mp4'
  3.  
  4. 复制代码 

4. 提供一个图片链接,点击下载

图片、pdf等文件,浏览器会默认执行预览,不能调用download方法进行下载,需要先把图片、pdf等文件转成blob,再调用download方法进行下载,转换的方式是使用axios请求对应的链接

  1. //可以用来下载浏览器会默认预览的文件类型,例如mp4,jpg等 
  2. import axios from 'axios' 
  3. //提供一个link,完成文件下载,link可以是  http://xxx.com/xxx.xls 
  4. function downloadByLink(link,fileName){ 
  5.     axios.request({ 
  6.         url: link, 
  7.         responseType: 'blob' //关键代码,让axios把响应改成blob 
  8.     }).then(res => { 
  9.  const link=URL.createObjectURL(res.data) 
  10.         download(link, fileName) 
  11.     }) 
  12.  
  13. 复制代码 

注意:会有同源策略的限制,需要配置转发

5. 防抖

在一定时间间隔内,多次调用一个方法,只会执行一次.

这个方法的实现是从Lodash库中copy的

  1.  
  2. export function debounce(func, wait=500, immediate=false) { 
  3.     var timeout 
  4.     return function() { 
  5.         var context = this 
  6.         var args = arguments 
  7.  
  8.         if (timeout) clearTimeout(timeout) 
  9.         if (immediate) { 
  10.             // 如果已经执行过,不再执行 
  11.             var callNow = !timeout 
  12.             timeout = setTimeout(function() { 
  13.                 timeout = null 
  14.             }, wait) 
  15.             if (callNow) func.apply(context, args) 
  16.         } else { 
  17.             timeout = setTimeout(function() { 
  18.                 func.apply(context, args) 
  19.             }, wait) 
  20.         } 
  21.     } 
  22. 复制代码 

使用方式:

  1.  
  2. "en"
  3.      
  4.         "UTF-8" /> 
  5.         "X-UA-Compatible" content="IE=edge" /> 
  6.         "viewport" content="width=device-width, initial-scale=1.0" /> 
  7.         Document 
  8.      
  9.      
  10.         "input" /> 
  11.          
  12.      
  13.  
  14.  
  15. 复制代码 

如果第三个参数 immediate 传true,则会立即执行一次调用,后续的调用不会在执行,可以自己在代码中试一下

6. 节流

多次调用方法,按照一定的时间间隔执行

这个方法的实现也是从Lodash库中copy的

  1.  
  2. export function throttle(func, wait=500, options) { 
  3.     //container.onmousemove = throttle(getUserAction, 1000); 
  4.     var timeout, context, args 
  5.     var previous = 0 
  6.     if (!options) options = {leading:false,trailing:true
  7.  
  8.     var later = function() { 
  9.         previous = options.leading === false ? 0 : new Date().getTime() 
  10.         timeout = null 
  11.         func.apply(context, args) 
  12.         if (!timeout) context = args = null 
  13.     } 
  14.  
  15.     var throttled = function() { 
  16.         var now = new Date().getTime() 
  17.         if (!previous && options.leading === false) previous = now 
  18.         var remaining = wait - (now - previous) 
  19.         context = this 
  20.         args = arguments 
  21.         if (remaining <= 0 || remaining > wait) { 
  22.             if (timeout) { 
  23.                 clearTimeout(timeout) 
  24.                 timeout = null 
  25.             } 
  26.             previous = now 
  27.             func.apply(context, args) 
  28.             if (!timeout) context = args = null 
  29.         } else if (!timeout && options.trailing !== false) { 
  30.             timeout = setTimeout(later, remaining) 
  31.         } 
  32.     } 
  33.     return throttled 
  34. 复制代码 

第三个参数还有点复杂, options

可以根据不同的值来设置不同的效果:

例子:

  1.  
  2. "en"
  3.      
  4.         "UTF-8" /> 
  5.         "X-UA-Compatible" content="IE=edge" /> 
  6.         "viewport" content="width=device-width, initial-scale=1.0" /> 
  7.         Document 
  8.      
  9.      
  10.         "input" /> 
  11.           
  12.      
  13.  
  14.  
  15. 复制代码 

7. cleanObject

去除对象中value为空(null,undefined,'')的属性,举个栗子:

  1. let res=cleanObject({ 
  2.     name:''
  3.     pageSize:10
  4.     page:1 
  5. }) 
  6. console.log("res", res) //输入{page:1,pageSize:10}   name为空字符串,属性删掉 
  7. 复制代码 

使用场景是:后端列表查询接口,某个字段前端不传,后端就不根据那个字段筛选,例如 name 不传的话,就只根据 page 和 pageSize 筛选,但是前端查询参数的时候(vue或者react)中,往往会这样定义

  1. export default
  2.     data(){ 
  3.         return { 
  4.             query:{ 
  5.                 name:''
  6.                 pageSize:10
  7.                 page:1 
  8.             } 
  9.         } 
  10.     } 
  11.  
  12.  
  13. const [query,setQuery]=useState({name:'',page:1,pageSize:10}) 
  14. 复制代码 

给后端发送数据的时候,要判断某个属性是不是空字符串,然后给后端拼参数,这块逻辑抽离出来就是 cleanObject ,代码实现如下

  1. export const isFalsy = (value) => (value === 0 ? false : !value); 
  2.  
  3. export const isVoid = (value) => 
  4.   value === undefined || value === null || value === ""
  5.  
  6. export const cleanObject = (object) => { 
  7.   // Object.assign({}, object) 
  8.   if (!object) { 
  9.     return {}; 
  10.   } 
  11.   const result = { ...object }; 
  12.   Object.keys(result).forEach((key) => { 
  13.     const value = result[key]; 
  14.     if (isVoid(value)) { 
  15.       delete result[key]; 
  16.     } 
  17.   }); 
  18.   return result; 
  19. }; 
  20.  
  21. 复制代码 
  1. let res=cleanObject({ 
  2.     name:''
  3.     pageSize:10
  4.     page:1 
  5. }) 
  6. console.log("res", res) //输入{page:1,pageSize:10} 
  7. 复制代码 

 

 

来源:前端技术江湖内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯