setTimeout在vue中的正确使用

笔者最近因为公司需求开发使用vue和jquery开发抓娃娃H5极简小游戏,使用到setTimeout函数。遇到了1个坑:

在vue的某个方法(点击后执行)
setTimeout(this.end(),4000);//娃娃消失

这里奇怪的是,end方法的确被执行了。但是没有执行4s后执行的效果。那我要你合用呢!其实,问题还是出在笔者身上,大家请看下图

setTimeout的定义和用法。问题出在我的格式上面

其实是支持两种调用方式:1 字符 2 函数体(文章解决方式)

解决方法如下:

1、定义一个_this暂存this

2、再改变变量的值,则生效啦

3、方法中将this存在变量_this中,此时执行setTimeout函数时,setTimeout函数内的_this就会访问到这个变量,就会得到当前对象。

export default {

 methods: {

  start: function () {
  
   let _this=this
   setTimeout(function()  {

    _this.end()//娃娃消失

   }, 4000);

  }

 }

}


注意⚠️:

当在vue中使用定时器在function里直接使用this,发现没有效果,这是由于setTimeout函数调用的代码运行在与所在函数完全分离的执行环境上,这会使得this指向的是window对象。拓展知识:解决vue在setTimeout内修改this失效的问题

要想setTimeout指向正确的值,可以使用如下方法:

1、使用箭头函数

export default {

 methods: {

  start: function () {

   setTimeout(() => {

    this.end()//娃娃消失

   }, 4000);

  }

 }

}


此时函数的this指向的是定义它的时候的对象,也就是this指向了data内中对应的变量。

码字不易,对大家有用最佳

<think>好的,我现在需要帮助用户了解如何在Vue.js中创建和操作Blob对象。首先,我得回想一下用户提供的参考引用内容,看看有什么相关的信息可以利用。 根据引用[3],用户展示了如何将文件内容转换为Blob对象并创建下载链接的示例。这说明Blob常用于处理文件下载,特别是在处理API响应时。引用[5]也提到了使用Blob下载Excel表格,并列举了不同文件类型的MIME类型,这可能对回答有帮助。 接下来,我需要整理步骤。首先,创建Blob对象需要数据源和MIME类型。Vue中通常通过API获取数据,比如使用Axios,如引用[2]和[4]提到的设置responseType为'blob'来接收二进制数据。然后,用new Blob()构造函数生成Blob对象,如引用[3]中的例子。 操作Blob对象方面,常见的是生成下载链接。可以使用URL.createObjectURL(blob)创建临时URL,然后通过创建a标签并设置download属性触发下载,这在引用[3]和[5]中都有示例。同时要注意释放内存,避免内存泄漏,这点用户可能不知道,需要提醒。 另外,可能需要处理不同的MIME类型,比如Excel用application/vnd.ms-excel,如引用[5]所述。还有,在Vue组件中的最佳实践,比如在methods里定义函数,使用async/await处理异步请求,如引用[4]提到的。 还需要考虑可能的错误,比如跨域问题,但用户的问题中没有提到,可能暂时不需要深入。但可以简要提及配置Axios,比如设置响应类型,如引用[2]中的responseType: 'blob'。 最后,要确保回答结构清晰,分步骤说明,并给出代码示例。同时生成相关问题,比如处理不同文件类型、下载优化、兼容性等,这些能帮助用户进一步探索。 总结步骤: 1. 创建Blob对象:从API获取数据,设置正确responseType,用new Blob() 2. 操作Blob:生成下载链接,创建a标签触发下载,释放内存 3. 注意事项:MIME类型、内存管理、Axios配置 4. 提供代码示例,结合Vue和Axios 5. 生成相关问题,扩展用户可能的需求</think>在 Vue.js 中创建和操作 Blob 对象常用于文件下载、二进制数据处理等场景。以下是分步骤实现方法: ### 一、创建 Blob 对象 1. **通过 API 响应获取数据** 使用 Axios 发送请求时需设置 `responseType: 'blob'`,确保正确接收二进制数据: ```javascript export function downloadFile() { return axios.get('/api/file', { responseType: 'blob' // 关键配置[^2] }) } ``` 2. **构造 Blob 对象** 在响应回调中通过 `new Blob()` 创建: ```javascript const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' // 根据文件类型设置 MIME[^5] }); ``` ### 二、操作 Blob 对象 1. **生成下载链接** 使用 `URL.createObjectURL()` 创建临时链接: ```javascript const downloadUrl = URL.createObjectURL(blob); ``` 2. **创建隐藏的 `<a>` 标签触发下载** ```javascript const link = document.createElement('a'); link.href = downloadUrl; link.download = 'filename.xlsx'; // 设置下载文件名 document.body.appendChild(link); link.click(); document.body.removeChild(link); // 清理 DOM 元素 ``` 3. **内存释放** 通过 `URL.revokeObjectURL()` 释放 Blob 对象引用: ```javascript setTimeout(() => { URL.revokeObjectURL(downloadUrl); // 避免内存泄漏[^3] }, 100); ``` ### 三、完整示例 ```javascript // Vue 组件 methods 中 methods: { async downloadExcel() { try { const res = await axios.get('/api/report', { responseType: 'blob' }); const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'report.xlsx'; document.body.appendChild(link); link.click(); document.body.removeChild(link); setTimeout(() => URL.revokeObjectURL(link.href), 100); } catch (error) { console.error('下载失败', error); } } } ``` ### 四、注意事项 1. **MIME 类型匹配** 不同文件类型需对应特定 MIME,如: - Excel: `application/vnd.ms-excel` - Word: `application/msword` - ZIP: `application/zip`[^5] 2. **大文件处理** 超过 500MB 的文件建议采用流式下载,避免内存溢出 3. **浏览器兼容性** Blob 支持所有现代浏览器,但 IE10 以下需 polyfill
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值