vue中的nexttick原理_WEB前端开发

vue中的nexttick原理_WEB前端开发,第1张

手把手教你如何在HTML中引入外部JS文件_WEB前端开发

在学习前端的时候,小伙伴们一定对于在HTML中如何引入外部JS文件感到困惑,下面小编教你HTML引入外部JS文件的方法。


vue中的nexttick原理实现是基于Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新。


vue中的nexttick原理_WEB前端开发,第2张


一、原理

1.异步说明

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。


2.事件循环说明

简单来说,Vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。


eg:

vue中的nexttick原理_WEB前端开发,第3张

图解:

vue中的nexttick原理_WEB前端开发,第4张

事件循环:

第一个tick(本次更新循环)

5种你一定不知道的HTML空格表示方法_WEB前端开发

HTML提供了5种空格实体(spaceentity),它们拥有不同的宽度,非断行空格是常规空格的宽度,可运行于所有主流浏览器。


其他几种空格在不同浏览器中宽度各异。


 

1.首先修改数据,这是同步任务。


同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及DOM.

2.Vue开启一个异步队列,并缓冲在此事件循环中发生的所有数据变化。


如果同一个watcher被多次触发,只会被推入队列中一次。


第二个tick(‘下次更新循环’)

同步任务执行完毕,开始执行异步watcher队列的任务,更新DOM。


Vue在内部尝试对异步队列使用原生的Promise.then和MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。


第三个tick(下次 DOM 更新循环结束之后)


二、应用场景及原因

1.在Vue生命周期的created()钩子函数进行DOM *** 作一定要放到Vue.nextTick()的回调函数中。


在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM *** 作无异于徒劳,所以此处一定要将DOM *** 作的js代码放进Vue.nextTick()的回调函数中。


与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM *** 作都不会有问题。


2.在数据变化后要执行的某个 *** 作,而这个 *** 作需要使用随数据改变而改变的DOM结构的时候,这个 *** 作都应该放进Vue.nextTick()的回调函数中。


具体原因在Vue的官方文档中详细解释:

Vue 异步执行 DOM 更新。


只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。


如果同一个 watcher 被多次触发,只会被推入到队列中一次。


这种在缓冲时去除重复数据对于避免不必要的计算和 DOM *** 作上非常重要。


然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。


Vue 在内部尝试对异步队列使用原生的Promise.then和MessageChannel,如果执行环境不支持,会采用setTimeout(fn, 0)代替。


例如,当你设置vm.someData = 'new value',该组件不会立即重新渲染。


当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。


多数情况我们不需要关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘手。


虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。


为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用Vue.nextTick(callback)。


这样回调函数在 DOM 更新完成后就会调用。


以上就是vue中的nexttick原理的详细内容,更多请关注ki4网其它相关文章!

ps左侧工具箱找不到了怎么办?_WEB前端开发

​解决方法:首先点击ps顶部菜单栏中的“窗口”按钮,接着在“窗口”的下拉菜单栏中点击“工具”按钮,这样工具箱就会出现在左侧了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/561305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020-07-02
下一篇 2020-07-02

发表评论

登录后才能评论

评论列表(0条)

保存