当前位置: 首页 > Web前端 > vue.js

[思考]$nextTick和setTimeout的一点比较!

时间:2023-03-31 17:32:05 vue.js

作者:ChimezieEnyinnaya译者:前端小智来源:博客有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智慧。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。一位前端开发者(小智)走进一家Vue吧。小智点了他最喜欢的鸡尾酒:Nuxt。调酒师正在努力。然后他开始唠叨自己。小智讲述了他是如何在Vue3的实例方法下找到$nextTick的,吓了一跳。小智用Vue有一段时间了,习惯把$watch和$emit写成实例方法。那么,$nextTick有什么用呢?Vue文档说它“[延迟]回调,在下一个DOM更新周期之后执行”。但是小智不相信。他接着讲述了他是如何尝试这样做的:this.loadingAnimation=truethis.startVeryLongCalculation()this.completeVeryLongCalculation()this.loadingAnimation=false有效。为什么?nextTick是做什么的?nextTick接受延迟到下一个DOM更新周期的回调函数。这只是Vue的表达方式,“嘿,如果你想在DOM更新后执行一个函数(这种情况很少发生),我希望你使用nextTick而不是setTimeout”。Vue.nextTick(()=>{})//语法下面将很快讨论setTimeout和nextTick参数。我们使用这个例子来可视化nextTick的行为:''}},mounted(){this.currentTime=3;this.$nextTick(()=>{让date=newDate()this.currentTime=date.getFullYear()});}}在J中在计算机上运行此代码片段。它将显示2021。并不是说如果您删除nextTick,您将不会得到相同的结果。但是,你应该明白,Vue会根据数据中的内容修改DOM。在上面的代码片段中,Vue将DOM更新为3,然后调用回调,将DOM更新为2021,最后将控制权交给浏览器,浏览器将显示2021。到目前为止,我们已经看到了nextTick在中插入回调函数回调队列并在适当的时间执行函数。您可能对此感兴趣,nextTick中的回调用作事件循环中的微任务。nextTick的源代码明确指出“nextTick行为利用微任务队列,可以通过本机Promise.then或MutationObserver访问它。”setTimeout与nextTick在DOM更新后执行函数的另一种方法是使用JavaScript的setTimeout()函数。我们将上面的代码替换为setTimeoutnextTick:运行这段代码。请先查看3,然后查看2021。它发生得很快,因此如果您没有看到此行为,则需要刷新浏览器。在上面的代码片段中,Vue将DOM更新为3并提供浏览器控件。然后浏览器显示3,调用回调函数,更新DOM为2021,最后把控制权交给浏览器,现在浏览器显示2021。nextTick的实现在不支持Promise的浏览器上使用setTimeout作为回退方法MutationObserver(IE6-10和OperaMini浏览器)。对于不支持Promise和MutationObserver(IE10)的浏览器,它更喜欢setImmediate。什么时候使用nexttick当你想使用setTimeout当你想确保DOM反映你的数据时当你试图执行异步操作时,你会遇到Uncaught(inpromise)DOMException等错误。记住,Vue是异步更新DOM的最后一个例子:{{month}}

添加月份
示例地址:https://codepen.io/ammezie/pe...主要部分:运行结果:在上面的代码片段中,我们希望在列表中添加新项目时获得平滑的向下滚动效果看一下代码,试着修改一下,去掉nextTick,就会失去那种流畅的滚动效果。您也可以尝试使用setTimeout而不是nextTick。总结在本文中,我们探讨了nextTick的工作原理。我们仔细研究了它与普通JavaScriptsetTimeout的不同之处,并涵盖了实际用例。~完了,我是小智,我要教育一个前端妹子。编辑过程中可能存在的BUG无法实时获知。之后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的BUG监控工具Fundebug。原文:https://blog.logrocket.com/un...交流文章每周更新,微信搜索【大千世界】立即阅读,回复【福利】前端视频多等你,本文GitHubhttps://github.com/qq449245884/xiaozhi已收录,欢迎Star。